diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..7772044
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,63 @@
+# Sample workflow for building and deploying a VitePress site to GitHub Pages
+#
+name: Deploy VitePress site to Pages
+
+on:
+ # Runs on pushes targeting the `main` branch. Change this to `master` if you're
+ # using the `master` branch as the default branch.
+ push:
+ branches: [main]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ # Build job
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # Not needed if lastUpdated is not enabled
+ # - uses: pnpm/action-setup@v3 # Uncomment this if you're using pnpm
+ - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ - name: Setup Pages
+ uses: actions/configure-pages@v4
+ - name: Install dependencies
+ run: bun install # or pnpm install / yarn install / bun install
+ - name: Build with VitePress
+ run: bun run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: .vitepress/dist
+
+ # Deployment job
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ needs: build
+ runs-on: ubuntu-latest
+ name: Deploy
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d88a875
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+.vitepress/dist/*
+.vitepress/cache/*
\ No newline at end of file
diff --git a/.vitepress/config.mts b/.vitepress/config.mts
new file mode 100644
index 0000000..93dd15d
--- /dev/null
+++ b/.vitepress/config.mts
@@ -0,0 +1,46 @@
+import { defineConfig } from 'vitepress'
+
+// https://vitepress.dev/reference/site-config
+export default defineConfig({
+ base: '/bootloader-unlock-wall-of-shame/',
+ rewrites: {
+ 'README.md': 'index.md',
+ '(.*)/README.md': '(.*)/index.md'
+ },
+ title: "Bootloader Unlock: Wall of Shame",
+ description: "Keeping track of companies that \"care about your data 🥺\"",
+
+ head: [
+ ['link', { rel: 'icon', type: 'image/png', href: '/bootloader-unlock-wall-of-shame/favicon.png' }],
+ ['link', { rel: 'shortcut icon', type: 'image/png', href: '/bootloader-unlock-wall-of-shame/favicon.png' }],
+ ['meta', { name: "robots", content: "noai, noimageai" }],
+ ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }],
+ ['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }],
+ ['link', { href: 'https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&family=Ubuntu+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap', rel: 'stylesheet' }]
+ ],
+
+ cleanUrls: true,
+ lastUpdated: true,
+
+ markdown: {
+ image: {
+ lazyLoading: true
+ }
+ },
+
+ themeConfig: {
+ logo: { src: '/favicon.png', width: 24, height: 24 },
+
+ socialLinks: [
+ { icon: 'github', link: 'https://github.com/melontini/bootloader-unlock-wall-of-shame' }
+ ],
+
+ footer: {
+ message: '
Bootloader Unlock: Wall of Shame by https://github.com/melontini/bootloader-unlock-wall-of-shame is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.'
+ },
+
+ search: {
+ provider: 'local'
+ },
+ }
+})
diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts
new file mode 100644
index 0000000..602b40a
--- /dev/null
+++ b/.vitepress/theme/index.ts
@@ -0,0 +1,59 @@
+// https://vitepress.dev/guide/custom-theme
+import giscusTalk from 'vitepress-plugin-comment-with-giscus';
+import type { Theme, VitePressData } from 'vitepress'
+import DefaultTheme from 'vitepress/theme'
+import './style.css'
+import { useData, useRoute } from 'vitepress';
+import { toRefs } from "vue";
+import { watch, nextTick, onMounted } from 'vue';
+import { GiscusProps } from '@giscus/vue/dist/types'
+
+export default {
+ ...DefaultTheme,
+ enhanceApp(ctx) {
+ DefaultTheme.enhanceApp(ctx);
+ },
+ setup() {
+ // Get frontmatter and route
+ const data = useData();
+ const { frontmatter } = toRefs(data);
+ const route = useRoute();
+
+ var props: GiscusProps = {
+ repo: 'melontini/bootloader-unlock-wall-of-shame',
+ repoId: 'R_kgDOJts7Mg',
+ category: 'General',
+ categoryId: 'DIC_kwDOJts7Ms4CXj04',
+ mapping: 'pathname',
+ inputPosition: 'top',
+ reactionsEnabled: '1',
+ loading: 'lazy'
+ }
+
+ onMounted(() => {
+ fixLang(props, data);
+ })
+ watch(() => route.path, () => nextTick(() => {
+ fixLang(props, data);
+ }))
+
+ // Obtain configuration from: https://giscus.app/
+ giscusTalk(props, { frontmatter, route }, true);
+ }
+} satisfies Theme
+
+const fixLang = (props: GiscusProps, data: VitePressData) => {
+ var lang = data.lang.value
+ switch (lang) {
+ case "en-US":
+ lang = "en"
+ break;
+ case "zh-CN":
+ lang = "zh-CN"
+ break;
+ default:
+ lang = "en"
+ break;
+ }
+ props.lang = lang
+}
\ No newline at end of file
diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css
new file mode 100644
index 0000000..3bedf81
--- /dev/null
+++ b/.vitepress/theme/style.css
@@ -0,0 +1,155 @@
+/**
+ * Customize default theme styling by overriding CSS variables:
+ * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
+ */
+
+/**
+ * Colors
+ *
+ * Each colors have exact same color scale system with 3 levels of solid
+ * colors with different brightness, and 1 soft color.
+ *
+ * - `XXX-1`: The most solid color used mainly for colored text. It must
+ * satisfy the contrast ratio against when used on top of `XXX-soft`.
+ *
+ * - `XXX-2`: The color used mainly for hover state of the button.
+ *
+ * - `XXX-3`: The color for solid background, such as bg color of the button.
+ * It must satisfy the contrast ratio with pure white (#ffffff) text on
+ * top of it.
+ *
+ * - `XXX-soft`: The color used for subtle background such as custom container
+ * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors
+ * on top of it.
+ *
+ * The soft color must be semi transparent alpha channel. This is crucial
+ * because it allows adding multiple "soft" colors on top of each other
+ * to create a accent, such as when having inline code block inside
+ * custom containers.
+ *
+ * - `default`: The color used purely for subtle indication without any
+ * special meanings attched to it such as bg color for menu hover state.
+ *
+ * - `brand`: Used for primary brand colors, such as link text, button with
+ * brand theme, etc.
+ *
+ * - `tip`: Used to indicate useful information. The default theme uses the
+ * brand color for this by default.
+ *
+ * - `warning`: Used to indicate warning to the users. Used in custom
+ * container, badges, etc.
+ *
+ * - `danger`: Used to show error, or dangerous message to the users. Used
+ * in custom container, badges, etc.
+ * -------------------------------------------------------------------------- */
+
+ :root {
+ --vp-c-default-1: var(--vp-c-gray-1);
+ --vp-c-default-2: var(--vp-c-gray-2);
+ --vp-c-default-3: var(--vp-c-gray-3);
+ --vp-c-default-soft: var(--vp-c-gray-soft);
+
+ --vp-c-brand-1: var(--vp-c-red-1);
+ --vp-c-brand-2: var(--vp-c-red-2);
+ --vp-c-brand-3: var(--vp-c-red-3);
+ --vp-c-brand-soft: var(--vp-c-red-soft);
+
+ --vp-c-tip-1: var(--vp-c-brand-1);
+ --vp-c-tip-2: var(--vp-c-brand-2);
+ --vp-c-tip-3: var(--vp-c-brand-3);
+ --vp-c-tip-soft: var(--vp-c-brand-soft);
+
+ --vp-c-warning-1: var(--vp-c-yellow-1);
+ --vp-c-warning-2: var(--vp-c-yellow-2);
+ --vp-c-warning-3: var(--vp-c-yellow-3);
+ --vp-c-warning-soft: var(--vp-c-yellow-soft);
+
+ --vp-c-danger-1: var(--vp-c-red-1);
+ --vp-c-danger-2: var(--vp-c-red-2);
+ --vp-c-danger-3: var(--vp-c-red-3);
+ --vp-c-danger-soft: var(--vp-c-red-soft);
+
+ --vp-font-family-base: "Rubik", sans-serif;
+ --vp-font-family-mono: "Ubuntu Mono", monospace;
+}
+
+.dark {
+ --vp-c-bg: #000000;
+ --vp-c-bg-alt: #0b0b0b;
+ --vp-c-bg-elv: #060606;
+ --vp-c-bg-soft: #111111;
+}
+
+.dark {
+ --vp-c-border: var(--vp-c-brand-3);
+ --vp-c-divider: var(--vp-c-brand-soft);
+ --vp-c-gutter: var(--vp-c-brand-soft);
+}
+
+/**
+ * Component: Button
+ * -------------------------------------------------------------------------- */
+
+:root {
+ --vp-button-brand-border: transparent;
+ --vp-button-brand-text: var(--vp-c-white);
+ --vp-button-brand-bg: var(--vp-c-brand-3);
+ --vp-button-brand-hover-border: transparent;
+ --vp-button-brand-hover-text: var(--vp-c-white);
+ --vp-button-brand-hover-bg: var(--vp-c-brand-2);
+ --vp-button-brand-active-border: transparent;
+ --vp-button-brand-active-text: var(--vp-c-white);
+ --vp-button-brand-active-bg: var(--vp-c-brand-1);
+}
+
+/**
+ * Component: Home
+ * -------------------------------------------------------------------------- */
+
+:root {
+ --vp-home-hero-name-color: transparent;
+ --vp-home-hero-name-background: -webkit-linear-gradient(
+ 120deg,
+ #bd34fe 30%,
+ #41d1ff
+ );
+
+ --vp-home-hero-image-background-image: linear-gradient(
+ -45deg,
+ #bd34fe 50%,
+ #47caff 50%
+ );
+ --vp-home-hero-image-filter: blur(44px);
+}
+
+@media (min-width: 640px) {
+ :root {
+ --vp-home-hero-image-filter: blur(56px);
+ }
+}
+
+@media (min-width: 960px) {
+ :root {
+ --vp-home-hero-image-filter: blur(68px);
+ }
+}
+
+/**
+ * Component: Custom Block
+ * -------------------------------------------------------------------------- */
+
+:root {
+ --vp-custom-block-tip-border: transparent;
+ --vp-custom-block-tip-text: var(--vp-c-text-1);
+ --vp-custom-block-tip-bg: var(--vp-c-brand-soft);
+ --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);
+}
+
+/**
+ * Component: Algolia
+ * -------------------------------------------------------------------------- */
+
+.DocSearch {
+ --docsearch-primary-color: var(--vp-c-brand-1) !important;
+}
+
diff --git a/README.md b/README.md
index db0c6b5..14058d5 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,8 @@ If you know of specific details/unlocking methods, please PR them or drop them i
> Reminder that no matter how nice a company is,
> you should not trust them unless their unlock process is 100% offline!
+[[toc]]
+
## â›” Avoid at all costs!
### Huawei/Honor
@@ -188,4 +190,3 @@ Xiaomi Mi A1 and maybe all MSM89** manufactured before 2018:
***
-
Bootloader Unlock: Wall of Shame by https://github.com/melontini/bootloader-unlock-wall-of-shame is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
diff --git a/bu_wos_banner_s.webp b/bu_wos_banner_s.webp
deleted file mode 100644
index a403b81..0000000
Binary files a/bu_wos_banner_s.webp and /dev/null differ
diff --git a/bu_wos_gh.jpg b/bu_wos_gh.jpg
deleted file mode 100644
index bac6b97..0000000
Binary files a/bu_wos_gh.jpg and /dev/null differ
diff --git a/bun.lockb b/bun.lockb
new file mode 100644
index 0000000..6d05dee
Binary files /dev/null and b/bun.lockb differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7515c6d
--- /dev/null
+++ b/package.json
@@ -0,0 +1,11 @@
+{
+ "dependencies": {
+ "vitepress": "^1.0.2",
+ "vitepress-plugin-comment-with-giscus": "^1.1.12"
+ },
+ "scripts": {
+ "docs:dev": "vitepress dev",
+ "docs:build": "vitepress build",
+ "docs:preview": "vitepress preview"
+ }
+}
\ No newline at end of file
diff --git a/public/ai.txt b/public/ai.txt
new file mode 100644
index 0000000..4443459
--- /dev/null
+++ b/public/ai.txt
@@ -0,0 +1,88 @@
+# Spawning AI
+# Prevent datasets from using the following file types
+
+User-Agent: *
+Disallow: *.txt
+Disallow: *.pdf
+Disallow: *.doc
+Disallow: *.docx
+Disallow: *.odt
+Disallow: *.rtf
+Disallow: *.tex
+Disallow: *.wks
+Disallow: *.wpd
+Disallow: *.wps
+Disallow: *.html
+Disallow: *.bmp
+Disallow: *.gif
+Disallow: *.ico
+Disallow: *.jpeg
+Disallow: *.jpg
+Disallow: *.png
+Disallow: *.svg
+Disallow: *.tif
+Disallow: *.tiff
+Disallow: *.webp
+Disallow: *.aac
+Disallow: *.aiff
+Disallow: *.amr
+Disallow: *.flac
+Disallow: *.m4a
+Disallow: *.mp3
+Disallow: *.oga
+Disallow: *.opus
+Disallow: *.wav
+Disallow: *.wma
+Disallow: *.mp4
+Disallow: *.webm
+Disallow: *.ogg
+Disallow: *.avi
+Disallow: *.mov
+Disallow: *.wmv
+Disallow: *.flv
+Disallow: *.mkv
+Disallow: *.py
+Disallow: *.js
+Disallow: *.java
+Disallow: *.c
+Disallow: *.cpp
+Disallow: *.cs
+Disallow: *.h
+Disallow: *.css
+Disallow: *.php
+Disallow: *.swift
+Disallow: *.go
+Disallow: *.rb
+Disallow: *.pl
+Disallow: *.sh
+Disallow: *.sql
+Disallow: /
+Disallow: *
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@( @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% @@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
+# @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@( @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@ %@@@@@/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@ %@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@, @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@( %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
+# @@@@@@@@@@@/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
+# @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@ *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@ %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@ %@@@@& @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ spawning.ai
\ No newline at end of file
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 0000000..7ce0987
Binary files /dev/null and b/public/favicon.png differ
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..57ca279
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,20 @@
+User-agent: CCBot
+Disallow: /
+
+User-agent: ChatGPT-User
+Disallow: /
+
+User-agent: GPTBot
+Disallow: /
+
+User-agent: Google-Extended
+Disallow: /
+
+User-agent: Omgilibot
+Disallow: /
+
+User-agent: Omgili
+Disallow: /
+
+User-agent: FacebookBot
+Disallow: /
\ No newline at end of file