├── docs ├── .vitepress │ ├── cache │ │ └── deps │ │ │ ├── package.json │ │ │ ├── vue.js.map │ │ │ ├── vitepress___@vueuse_core.js.map │ │ │ ├── _metadata.json │ │ │ ├── vue.js │ │ │ ├── @theme_index.js │ │ │ ├── vitepress___@vueuse_core.js │ │ │ └── @theme_index.js.map │ └── config.mts ├── public │ ├── pak.jpg │ ├── favicon.ico │ ├── bitcoin │ │ ├── 2e6c08ff5cd6bf38-tx.png │ │ ├── 6d64a12cba4647f9-UTXO.png │ │ ├── ca16298358b6cbd8-seed.png │ │ ├── 114908d177b13ce2-image.png │ │ ├── 367c2af6fcbf96c4-liquid.png │ │ ├── 3dc926dba8f9b0bd-image.png │ │ ├── 5b0b0f0596df6e4b-image.png │ │ ├── 6581248afcda9582-resto.png │ │ ├── 898783c574901bce-reuse.png │ │ ├── d6f85f0b25e0d51c-image.png │ │ ├── 635a628f949e42f9-COINJOIN.png │ │ ├── 611b33b28b8c2bf1-passphrase.png │ │ ├── fec29689e2928b97-Screenshot.png │ │ ├── a0edc2d4f825b964-secondo wallet.png │ │ ├── 8eaf58f08a9f25b9-coinjoin mempool.png │ │ ├── c05917630d7c1023-Untitled-2025-09-07-1025.png │ │ ├── d1764e77a1d7ef5e-Untitled-2025-09-07-1025.png │ │ ├── a723f5725929c058-6386ab78d906372cf6021c6d6677908450c94be3.png │ │ └── 1dfed418cc5af9bf-Screenshot 2025-09-07 at 09-58-55 Transaction e5e845d9fa881da4b72d4b76f72d36df90ba267ad0213e217dd810f4fefba082 - mempool - Bitcoin Explorer.png │ └── 549a4229-242b-488f-8473-884278135b03.webp ├── index.md ├── bonus.md ├── project-mission.md ├── secure-communication.md ├── CONTRIBUTING.md ├── device-security.md ├── account-and-data-security.md ├── online-anonymity.md ├── introduction.md ├── threat-modeling.md └── activist-checklists.md ├── .gitignore ├── package.json ├── robots.txt ├── LICENSE ├── .github └── workflows │ └── deploy.yml ├── README.md └── CONTRIBUTING.md /docs/.vitepress/cache/deps/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node.js 2 | node_modules 3 | dist 4 | .env 5 | .DS_Store 6 | 7 | # CRUSH 8 | .crush 9 | -------------------------------------------------------------------------------- /docs/public/pak.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/pak.jpg -------------------------------------------------------------------------------- /docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/favicon.ico -------------------------------------------------------------------------------- /docs/public/bitcoin/2e6c08ff5cd6bf38-tx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/2e6c08ff5cd6bf38-tx.png -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vue.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/bitcoin/6d64a12cba4647f9-UTXO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/6d64a12cba4647f9-UTXO.png -------------------------------------------------------------------------------- /docs/public/bitcoin/ca16298358b6cbd8-seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/ca16298358b6cbd8-seed.png -------------------------------------------------------------------------------- /docs/public/bitcoin/114908d177b13ce2-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/114908d177b13ce2-image.png -------------------------------------------------------------------------------- /docs/public/bitcoin/367c2af6fcbf96c4-liquid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/367c2af6fcbf96c4-liquid.png -------------------------------------------------------------------------------- /docs/public/bitcoin/3dc926dba8f9b0bd-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/3dc926dba8f9b0bd-image.png -------------------------------------------------------------------------------- /docs/public/bitcoin/5b0b0f0596df6e4b-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/5b0b0f0596df6e4b-image.png -------------------------------------------------------------------------------- /docs/public/bitcoin/6581248afcda9582-resto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/6581248afcda9582-resto.png -------------------------------------------------------------------------------- /docs/public/bitcoin/898783c574901bce-reuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/898783c574901bce-reuse.png -------------------------------------------------------------------------------- /docs/public/bitcoin/d6f85f0b25e0d51c-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/d6f85f0b25e0d51c-image.png -------------------------------------------------------------------------------- /docs/public/bitcoin/635a628f949e42f9-COINJOIN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/635a628f949e42f9-COINJOIN.png -------------------------------------------------------------------------------- /docs/public/549a4229-242b-488f-8473-884278135b03.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/549a4229-242b-488f-8473-884278135b03.webp -------------------------------------------------------------------------------- /docs/public/bitcoin/611b33b28b8c2bf1-passphrase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/611b33b28b8c2bf1-passphrase.png -------------------------------------------------------------------------------- /docs/public/bitcoin/fec29689e2928b97-Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/fec29689e2928b97-Screenshot.png -------------------------------------------------------------------------------- /docs/public/bitcoin/a0edc2d4f825b964-secondo wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/a0edc2d4f825b964-secondo wallet.png -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/bitcoin/8eaf58f08a9f25b9-coinjoin mempool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/8eaf58f08a9f25b9-coinjoin mempool.png -------------------------------------------------------------------------------- /docs/public/bitcoin/c05917630d7c1023-Untitled-2025-09-07-1025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/c05917630d7c1023-Untitled-2025-09-07-1025.png -------------------------------------------------------------------------------- /docs/public/bitcoin/d1764e77a1d7ef5e-Untitled-2025-09-07-1025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/d1764e77a1d7ef5e-Untitled-2025-09-07-1025.png -------------------------------------------------------------------------------- /docs/public/bitcoin/a723f5725929c058-6386ab78d906372cf6021c6d6677908450c94be3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/a723f5725929c058-6386ab78d906372cf6021c6d6677908450c94be3.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "vitepress": "^1.6.3" 4 | }, 5 | "scripts": { 6 | "docs:dev": "vitepress dev docs", 7 | "docs:build": "vitepress build docs", 8 | "docs:preview": "vitepress preview docs" 9 | }, 10 | "dependencies": { 11 | "markdown-it-checkbox": "^1.1.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /docs/public/bitcoin/1dfed418cc5af9bf-Screenshot 2025-09-07 at 09-58-55 Transaction e5e845d9fa881da4b72d4b76f72d36df90ba267ad0213e217dd810f4fefba082 - mempool - Bitcoin Explorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Turtlecute33/PrivacyActivistKit/HEAD/docs/public/bitcoin/1dfed418cc5af9bf-Screenshot 2025-09-07 at 09-58-55 Transaction e5e845d9fa881da4b72d4b76f72d36df90ba267ad0213e217dd810f4fefba082 - mempool - Bitcoin Explorer.png -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | # _______. _______ ______ ____ __ ____ ___ .______ _______. 2 | # / || ____| / __ \ \ \ / \ / / / \ | _ \ / | 3 | # | (----`| |__ | | | | \ \/ \/ / / ^ \ | |_) | | (----` 4 | # \ \ | __| | | | | \ / / /_\ \ | / \ \ 5 | # .----) | | |____ | `--' | \ /\ / / _____ \ | |\ \----.----) | 6 | # |_______/ |_______| \______/ \__/ \__/ /__/ \__\ | _| `._____|_______/ 7 | # 8 | 9 | 10 | User-agent: * 11 | Disallow: 12 | 13 | Sitemap: https://privacyactivistkit.org/sitemap.xml 14 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: "Privacy Activist Kit" 7 | text: "A complete guide to digital self-defense" 8 | tagline: For activists, journalists, and everyone else. 9 | actions: 10 | - theme: brand 11 | text: Get started 12 | link: /project-mission 13 | - theme: alt 14 | text: GitHub 15 | link: https://github.com/Turtlecute33/PrivacyActivistKit 16 | 17 | features: 18 | 19 | - title: 🕊️ For Privacy and Freedom 20 | details: Made for people resisting control 21 | 22 | - title: 🙅‍♀️ No Trackers Ever 23 | details: Fully private with zero analytics or ads 24 | 25 | - title: 🌍 Open and Transparent 26 | details: Open source and community led 27 | 28 | - title: 🎒 Ready for Any Context 29 | details: Works for protests, classrooms, or daily life 30 | 31 | - title: 📖 Easy to Understand 32 | details: Simple and clear language 33 | 34 | - title: 🧩 Modular and Adaptable 35 | details: Use what you need, skip what you don’t 36 | 37 | 38 | 39 | --- 40 | 41 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/_metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "eead8edb", 3 | "configHash": "29898f07", 4 | "lockfileHash": "72e647fd", 5 | "browserHash": "e130a178", 6 | "optimized": { 7 | "vue": { 8 | "src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js", 9 | "file": "vue.js", 10 | "fileHash": "9164ba96", 11 | "needsInterop": false 12 | }, 13 | "vitepress > @vue/devtools-api": { 14 | "src": "../../../../node_modules/@vue/devtools-api/dist/index.js", 15 | "file": "vitepress___@vue_devtools-api.js", 16 | "fileHash": "330d10ba", 17 | "needsInterop": false 18 | }, 19 | "vitepress > @vueuse/core": { 20 | "src": "../../../../node_modules/@vueuse/core/index.mjs", 21 | "file": "vitepress___@vueuse_core.js", 22 | "fileHash": "9ca1b4e2", 23 | "needsInterop": false 24 | }, 25 | "@theme/index": { 26 | "src": "../../../../node_modules/vitepress/dist/client/theme-default/index.js", 27 | "file": "@theme_index.js", 28 | "fileHash": "397c3033", 29 | "needsInterop": false 30 | } 31 | }, 32 | "chunks": { 33 | "chunk-3GYA4YLH": { 34 | "file": "chunk-3GYA4YLH.js" 35 | }, 36 | "chunk-DDXJJ377": { 37 | "file": "chunk-DDXJJ377.js" 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | # Creative Commons Attribution-NonCommercial 4.0 International 2 | 3 | This work is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License. 4 | 5 | ## You are free to: 6 | 7 | - **Share** — copy and redistribute the material in any medium or format 8 | - **Adapt** — remix, transform, and build upon the material 9 | 10 | The licensor cannot revoke these freedoms as long as you follow the license terms. 11 | 12 | ## Under the following terms: 13 | 14 | - **Attribution** — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. 15 | 16 | - **NonCommercial** — You may not use the material for commercial purposes. 17 | 18 | - **No additional restrictions** — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. 19 | 20 | ## Notices: 21 | 22 | You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. 23 | 24 | No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. 25 | 26 | --- 27 | 28 | **Full Legal Text:** https://creativecommons.org/licenses/by-nc/4.0/legalcode 29 | 30 | **Human-Readable Summary:** https://creativecommons.org/licenses/by-nc/4.0/ 31 | 32 | **SPDX Identifier:** CC-BY-NC-4.0 33 | 34 | --- 35 | 36 | Copyright © 2024-2025 Privacy Activist Kit Contributors 37 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | # Sample workflow for building and deploying a VitePress site to GitHub Pages 2 | # 3 | name: Deploy VitePress site to Pages 4 | 5 | on: 6 | # Runs on pushes targeting the `main` branch. Change this to `master` if you're 7 | # using the `master` branch as the default branch. 8 | push: 9 | branches: [main] 10 | 11 | # Allows you to run this workflow manually from the Actions tab 12 | workflow_dispatch: 13 | 14 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 15 | permissions: 16 | contents: read 17 | pages: write 18 | id-token: write 19 | 20 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 21 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 22 | concurrency: 23 | group: pages 24 | cancel-in-progress: false 25 | 26 | jobs: 27 | # Build job 28 | build: 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Checkout 32 | uses: actions/checkout@v4 33 | with: 34 | fetch-depth: 0 # Not needed if lastUpdated is not enabled 35 | # - uses: pnpm/action-setup@v3 # Uncomment this block if you're using pnpm 36 | # with: 37 | # version: 9 # Not needed if you've set "packageManager" in package.json 38 | # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun 39 | - name: Setup Node 40 | uses: actions/setup-node@v4 41 | with: 42 | node-version: 22 43 | cache: npm # or pnpm / yarn 44 | - name: Setup Pages 45 | uses: actions/configure-pages@v4 46 | - name: Install dependencies 47 | run: npm ci # or pnpm install / yarn install / bun install 48 | - name: Build with VitePress 49 | run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build 50 | - name: Upload artifact 51 | uses: actions/upload-pages-artifact@v3 52 | with: 53 | path: docs/.vitepress/dist 54 | 55 | # Deployment job 56 | deploy: 57 | environment: 58 | name: github-pages 59 | url: ${{ steps.deployment.outputs.page_url }} 60 | needs: build 61 | runs-on: ubuntu-latest 62 | name: Deploy 63 | steps: 64 | - name: Deploy to GitHub Pages 65 | id: deployment 66 | uses: actions/deploy-pages@v4 67 | -------------------------------------------------------------------------------- /docs/bonus.md: -------------------------------------------------------------------------------- 1 | ## Large Language Models (LLMs) 2 | 3 | **Difficulty:** ★★ 4 | 5 | ChatGPT, Google Gemini, Grok, DeepSeek. All these chatbots are revolutionizing our daily lives, but they all have one thing in common: **they love to collect your data.** 6 | 7 | Any information these LLMs absorb can potentially be extracted. Let's analyze some offline and privacy-oriented solutions to enjoy AI chatbots locally. 8 | 9 | ### Prerequisites: 10 | 11 | - A desktop PC with a powerful CPU and plenty of RAM. 12 | - A GPU with as much VRAM as possible. 13 | 14 | > No model running locally will ever match the quality and speed of the famous, well-funded services, mainly due to the limitations of your computer's power. 15 | 16 | If you want to experiment and run some models locally, the simplest solution is **Ollama**. 17 | 18 | 1. **Download and install Ollama.** 19 | 2. **Download one or more models** from the internet. Look for models ranging from 1B to 8B parameters; anything larger becomes impossible to run at a sufficient speed on most home computers. 20 | 3. **Start the model** and begin chatting. 21 | 4. **Optional:** Install a graphical interface to make interacting with the model more comfortable. My favorite is **Open-WebUI**. 22 | 23 | --- 24 | 25 | ## VPS and Internet Domains 26 | 27 | **Difficulty:** ★★ 28 | 29 | Do you need to create websites, buy domains, or host personal services on rented servers? Here are some services that I find interesting. 30 | 31 | ### Web Domains: 32 | 33 | - **Njalla:** For over 10 years, Njalla has been the standard for anyone who wants a privacy-oriented web domain. They require no KYC, work over Tor, and accept payments in Bitcoin. 34 | 35 | ### Server and VPS Rental: 36 | 37 | - **LNVps:** A provider where you can rent servers in Ireland or Canada without a traditional account (just a Nostr account). They require no KYC, no personal data, and accept Lightning payments. Server availability is low, and the service is a bit raw, but it's suitable for small self-hosting projects. 38 | - **VPSbg:** A server provider in Bulgaria. They accept Lightning payments, and I have personally hosted my Tor exit node with them. After years of collaboration on various projects, I have always been very satisfied from a security and privacy perspective. They are not particularly cheap. 39 | - **Alexhost:** This provider doesn't have particular features for anonymity, but they offer good VPS, accept Bitcoin, and have data centers in interesting jurisdictions like Switzerland. 40 | 41 | > There are many other privacy-oriented providers that accept Bitcoin (e.g., 1984hosting, Cockbox). Look for services that fit your technical needs (bandwidth, jurisdiction, CPU). I have tried all the services mentioned above and have always been satisfied. 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🕊️ Privacy Activist Kit: Tools for Digital Freedom 2 | 3 | Welcome to [PrivacyActivistKit](https://privacyactivistkit.org/#/)! 4 | 5 | This site was built for people who care about privacy, justice, and digital autonomy. Whether you're organizing a protest, teaching a class, helping a friend secure their phone, or just starting to explore the world of privacy, this kit is here to help. 6 | 7 | Clear, practical resources to help you take control of your digital life without the corporate fluff. 8 | 9 | 10 | ## What is it? 11 | 12 | The **Privacy Activist Kit** is a free, open source hub of privacy tools, guides, teaching materials, and simple explanations designed to support activists, organizers, educators, students, curious beginners, and anyone tired of being tracked online. 13 | 14 | You’ll find: 15 | 16 | * 🛠️ Tools and services 17 | * 📚 Guides tailored to real life needs 18 | * 👩🏽‍🏫 Workshop friendly teaching resources 19 | * 🧩 Clear, jargon-free explanations 20 | 21 | 22 | ## Why We Made This 23 | 24 | > “Privacy is a right, not a luxury.” 25 | 26 | The internet can be a powerful space, but it’s also heavily monitored, exploited, and manipulated. That’s not okay. 27 | 28 | This kit was created with a few core beliefs: 29 | 30 | * 🧸 **It should be approachable:** No tech background needed 31 | * 🫶 **It should be for everyone:** Not just for coders or activists 32 | * 🌱 **It should be open:** Built to grow with the help of others 33 | * ❤️ **It should be independent:** No ads, no sponsors, no strings attached 34 | 35 | 36 | ## What's Inside 37 | 38 | * Privacy Tools: A curated list of secure browsers, messaging apps, email services, search engines, VPNs, Tor tools, and file sharing platforms. 39 | * Guides (Coming Soon): Easy-to-understand, printable lessons on encryption, metadata, threat modeling, protest safety, and more. 40 | * Activist Resources (Coming Soon): Practical tools like security checklists, burner phone tips, VPN flowcharts, and emergency prep. 41 | * Shareables (Coming Soon): Posters, zines, slides, and social media visuals for easy, engaging knowledge sharing. 42 | 43 | 44 | ## Contributing 45 | 46 | Want to support this project? You don’t need to write code. Leaving a ⭐, sharing it with others, or spreading the word on social media helps a lot. 47 | 48 | We welcome all contributions, especially from beginners and those making small improvements. For full details, check out [`CONTRIBUTING.md`](https://github.com/Turtlecute33/PrivacyActivistKit/blob/main/CONTRIBUTING.md) (coming soon). 49 | 50 | Have an idea or suggestion? [Open an issue](https://github.com/Turtlecute33/PrivacyActivistKit/issues) or [submit a pull request](https://github.com/Turtlecute33/PrivacyActivistKit/pulls). 51 | 52 | 53 | ## License 54 | 55 | Creative Commons Attribution-NonCommercial 4.0 56 | [Read it here](https://creativecommons.org/licenses/by-nc/4.0/) 57 | 58 | That means: 59 | 60 | * You can share and remix this work 61 | * You must credit the original 62 | * No commercial use, please 63 | 64 | This kit was made with care. We hope it helps you feel a little more powerful and a little more protected online. 65 | 66 | Stay safe out there ✨ 67 | -------------------------------------------------------------------------------- /docs/project-mission.md: -------------------------------------------------------------------------------- 1 | # 🕊️ Privacy Activist Kit: Tools for Digital Freedom 2 | 3 | Welcome to [PrivacyActivistKit](https://privacyactivistkit.org/#/)! 4 | 5 | This site was built for people who care about privacy, justice, and digital autonomy. Whether you're organizing a protest, teaching a class, helping a friend secure their phone, or just starting to explore the world of privacy, this kit is here to help. 6 | 7 | Clear, practical resources to help you take control of your digital life without the corporate fluff. 8 | 9 | ::: warning 10 | I'm still working on this project. You can consider it in the alpha stage. The content needs to be expanded, polished, and improved. Expect changes and improvements in the next few weeks 😄 11 | ::: 12 | 13 | ## What is it? 14 | 15 | The **Privacy Activist Kit** is a free, open source hub of privacy tools, guides, teaching materials, and simple explanations designed to support activists, organizers, educators, students, curious beginners, and anyone tired of being tracked online. 16 | 17 | You’ll find: 18 | 19 | * 🛠️ tools and services 20 | * 📚 Guides tailored to real life needs 21 | * 👩🏽‍🏫 Workshop friendly teaching resources 22 | * 🧩 Clear, jargon free explanations 23 | 24 | 25 | ## Why We Made This 26 | 27 | > “Privacy is a right, not a luxury.” 28 | 29 | The internet can be a powerful space, but it’s also heavily monitored, exploited, and manipulated. That’s not okay. 30 | 31 | This kit was created with a few core beliefs: 32 | 33 | * 🧸 **It should be approachable:** No tech background needed 34 | * 🫶 **It should be for everyone:** Not just for coders or activists 35 | * 🌱 **It should be open:** Built to grow with the help of others 36 | * ❤️ **It should be independent:** No ads, no sponsors, no strings attached 37 | 38 | 39 | ## What's Inside 40 | 41 | * Privacy Tools: A curated list of secure browsers, messaging apps, email services, search engines, VPNs, Tor tools, and file sharing platforms. 42 | * Guides (Coming Soon): Easy to understand, printable lessons on encryption, metadata, threat modeling, protest safety, and more. 43 | * Activist Resources (Coming Soon): Practical tools like security checklists, burner phone tips, VPN flowcharts, and emergency prep. 44 | * Shareables (Coming Soon): Posters, zines, slides, and social media visuals for easy, engaging knowledge sharing. 45 | 46 | 47 | ## Contributing 48 | 49 | Want to support this project? You don’t need to write code. Leaving a ⭐, sharing it with others, or spreading the word on social media helps a lot. 50 | 51 | We welcome all contributions, especially from beginners and those making small improvements. For full details, check out [`CONTRIBUTING.md`](https://github.com/Turtlecute33/PrivacyActivistKit/blob/main/CONTRIBUTING.md) (coming soon). 52 | 53 | Have an idea or suggestion? [Open an issue](https://github.com/Turtlecute33/PrivacyActivistKit/issues) or [submit a pull request](https://github.com/Turtlecute33/PrivacyActivistKit/pulls). 54 | 55 | 56 | ## License 57 | 58 | Creative Commons Attribution-NonCommercial 4.0 59 | [Read it here](https://creativecommons.org/licenses/by-nc/4.0/) 60 | 61 | That means: 62 | 63 | * You can share and remix this work 64 | * You must credit the original 65 | * No commercial use, please 66 | 67 | This kit was made with care. We hope it helps you feel a little more powerful and a little more protected online. 68 | 69 | Stay safe out there ✨ 70 | -------------------------------------------------------------------------------- /docs/secure-communication.md: -------------------------------------------------------------------------------- 1 | ## Email: Your Digital Mailbox 2 | 3 | **Difficulty:** ★ 4 | 5 | To function online, you need an email address. However, standard email (like Gmail) is not private. Google scans your emails to build a profile on you for advertising. For true privacy, you should use different types of email for different purposes. 6 | 7 | ### 1. Your Main Private Email 8 | 9 | This is your trusted, reliable email for important and personal correspondence. It should be protected with **end-to-end encryption**, meaning only you and the person you're communicating with can read the content. 10 | 11 | - **What to look for:** A provider with a strong reputation, end-to-end encryption, a no-logs policy, and minimal data collection. 12 | - **Recommendations:** 13 | - [**Proton.me**](https://proton.me/): The gold standard for easy-to-use, private, and secure email, based in Switzerland. 14 | - [**Riseup.net**](https://riseup.net/): Excellent privacy, focused on activists, but requires an invitation to join. 15 | - [**Autistici.org**](https://www.autistici.org/): Similar to Riseup, run by a volunteer collective. 16 | 17 | ### 2. Disposable Email 18 | 19 | You often need an email to sign up for newsletters, a one-time purchase, or a service you don't fully trust. Using your main email for this is a bad idea, as it will likely end up in a data leak and be flooded with spam. For these situations, use a **disposable email address**. 20 | 21 | - **Recommendation:** [**cock.li**](http://cock.li/) is a provider that works over Tor and lets you create an account in seconds. It's perfect for these one-off situations. 22 | 23 | ### 3. Email Aliases 24 | 25 | An alias is a "forwarding" address. It's a unique, fake email that forwards messages to your real inbox. This is the perfect tool for managing your online identity and compartmentalizing your digital life. 26 | 27 | - **How it works:** Imagine you want to sign up for Twitter, Facebook, and Instagram without them knowing they all belong to the same person. You can create three different aliases (`alias1@domain.com`, `alias2@domain.com`, `alias3@domain.com`) that all forward to your single, private inbox. If one alias starts getting spammed, you can just delete it. 28 | - **Recommendations:** 29 | - [**SimpleLogin**](https://simplelogin.io/) (now owned by Proton) 30 | - [**AnonDaddy**](https://anondaddy.com/) 31 | - [**Firefox Relay**](https://relay.firefox.com/) 32 | 33 | --- 34 | 35 | ## PGP and Cryptography 36 | 37 | **Difficulty:** ★★★ 38 | 39 | **Cryptography** is the art of sending messages in such a way that only the intended recipient can read them. **PGP (Pretty Good Privacy)** is a powerful and widely used method for encrypting email and files. 40 | 41 | ### How PGP Works: The Mailbox Analogy 42 | 43 | Imagine you have a special mailbox with two keys: 44 | 1. A **Public Key (the mailbox slot):** This is a long string of text you can give to anyone. People use it to encrypt messages to you. Anyone can drop a letter in the slot. 45 | 2. A **Private Key (the mailbox key):** Only you have this key, and you must keep it secret. It's the only thing that can open the mailbox and decrypt the messages inside. 46 | 47 | This is **asymmetric cryptography**. You can share your public key freely, and people can use it to encrypt messages that only *you* can decrypt with your private key. 48 | 49 | ### Why Use PGP? 50 | 51 | - **Securely send sensitive information:** Encrypting an email with PGP is the digital equivalent of sealing it in a tamper-proof safe. 52 | - **Verify software and communications:** Developers can "sign" their software with their private key. You can then use their public key to verify that the software is authentic and hasn't been tampered with. You can do the same with messages. 53 | 54 | ### Tools for PGP: 55 | 56 | - **Desktop:** [**Kleopatra**](https://www.openpgp.org/software/kleopatra/) is a great graphical tool for managing PGP keys on Windows and Linux. 57 | - **Android:** [**OpenKeyChain**](https://www.openkeychain.org/) is an excellent open-source client. 58 | 59 | --- 60 | 61 | ## Secure Messaging 62 | 63 | **Difficulty:** ★ 64 | 65 | You probably use messaging apps like WhatsApp or Telegram every day. While they claim to be secure because they use **"end-to-end encryption,"** this is often not enough. 66 | 67 | **End-to-end encryption (E2EE)** means the message is locked before it leaves your phone and can only be unlocked by the recipient. This is great, but a truly secure messenger should also be: 68 | 69 | - **Open Source:** So the community can verify its security claims. 70 | - **Minimal on Data Collection:** It shouldn't require your phone number or access to your contacts. 71 | - **Protective of Metadata:** Metadata is the "data about your data." Even if the content of your message is encrypted, a service might still know *who* you talked to, *when* you talked to them, and for *how long*. 72 | 73 | ### Recommended Messaging Apps: 74 | 75 | - [**Signal**](https://signal.org/): The easiest to use for most people. It has excellent E2EE, is developed by a non-profit, and is the industry standard. Its main drawback is that it requires your phone number to register. 76 | - [**XMPP**](https://xmpp.org/): A decentralized protocol, not a single app. It's the foundation upon which services like WhatsApp were built. It doesn't require personal data and is extremely stable, but it's less user-friendly than Signal. 77 | - [**Simplex**](https://simplex.chat/): A modern messenger that provides the best metadata protection. It requires no personal data at all—not even a phone number. It's still a bit new, but very promising for those with a high threat model. 78 | 79 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Privacy Activist Kit 2 | 3 | Thank you for considering contributing to the Privacy Activist Kit! This project exists to help people protect their digital privacy, and your contributions help make that mission stronger. 4 | 5 | ## How You Can Help 6 | 7 | There are many ways to contribute, and you don't need to be a developer or security expert to make a meaningful impact: 8 | 9 | ### 🌟 Non-Technical Contributions 10 | 11 | - **Star the repository** on GitHub to help others discover the project 12 | - **Share the project** on social media or with communities who might benefit 13 | - **Report broken links** or outdated information 14 | - **Suggest new tools or services** that align with the project's privacy-focused mission 15 | - **Improve readability** by fixing typos, clarifying language, or improving explanations 16 | - **Translate content** to make privacy resources accessible in more languages 17 | - **Share feedback** on what's working well or what could be improved 18 | 19 | ### 📝 Content Contributions 20 | 21 | - **Add new guides** on privacy topics not yet covered 22 | - **Update existing content** with current best practices 23 | - **Create checklists** for specific use cases or threat models 24 | - **Write beginner-friendly explanations** of technical concepts 25 | - **Add real-world examples** to help illustrate privacy concepts 26 | 27 | ### 🔧 Technical Contributions 28 | 29 | - **Fix bugs** in the website or documentation 30 | - **Improve site performance** or accessibility 31 | - **Add new features** to the VitePress site 32 | - **Optimize images** and other assets 33 | - **Improve SEO** and discoverability 34 | 35 | ## Getting Started 36 | 37 | ### Reporting Issues 38 | 39 | Found a problem? [Open an issue](https://github.com/Turtlecute33/PrivacyActivistKit/issues) with: 40 | 41 | - A clear, descriptive title 42 | - A detailed description of the issue 43 | - Steps to reproduce (if applicable) 44 | - Expected vs. actual behavior 45 | - Screenshots (if relevant) 46 | 47 | ### Making Changes 48 | 49 | 1. **Fork the repository** to your own GitHub account using the Fork button on GitHub 50 | 2. **Clone your fork** locally (replace `YOUR-USERNAME` with your actual GitHub username): 51 | ```bash 52 | git clone https://github.com/YOUR-USERNAME/PrivacyActivistKit.git 53 | cd PrivacyActivistKit 54 | ``` 55 | 56 | Or clone the main repository directly if you just want to preview locally: 57 | ```bash 58 | git clone https://github.com/Turtlecute33/PrivacyActivistKit.git 59 | cd PrivacyActivistKit 60 | ``` 61 | 3. **Install dependencies**: 62 | ```bash 63 | npm install 64 | ``` 65 | 4. **Create a branch** for your changes: 66 | ```bash 67 | git checkout -b your-branch-name 68 | ``` 69 | 5. **Run the development server** to preview your changes: 70 | ```bash 71 | npm run docs:dev 72 | ``` 73 | This will start VitePress dev server at `http://localhost:5173/` 74 | 75 | 6. **Make your changes** - the site will auto-reload as you edit files 76 | 7. **Commit your changes** with a clear, descriptive message: 77 | ```bash 78 | git commit -m "Add brief description of your changes" 79 | ``` 80 | 8. **Push to your fork**: 81 | ```bash 82 | git push origin your-branch-name 83 | ``` 84 | 9. **Open a Pull Request** from your fork to the main repository 85 | 86 | ## Content Guidelines 87 | 88 | When contributing content to the Privacy Activist Kit, please follow these principles: 89 | 90 | ### Voice and Tone 91 | 92 | - **Clear and accessible**: Write for a general audience, not just technical experts 93 | - **Direct and practical**: Focus on actionable advice people can implement 94 | - **Empowering, not preachy**: Help people make informed choices without judgment 95 | - **Honest about trade-offs**: Privacy often involves balancing security, convenience, and usability 96 | 97 | ### Technical Standards 98 | 99 | - **Accuracy first**: Verify information from reliable sources before adding it 100 | - **Keep it current**: Privacy tools and best practices change frequently—date-sensitive content when appropriate 101 | - **Cite sources**: Link to official documentation, research papers, or trusted organizations 102 | - **Test recommendations**: Only recommend tools you've researched or used yourself 103 | 104 | ### Practical Considerations 105 | 106 | - **Consider diverse threat models**: What works for one person may not work for another 107 | - **Respect different risk levels**: Not everyone faces the same threats 108 | - **Avoid assumptions**: Don't assume technical knowledge, financial resources, or specific devices 109 | 110 | ### What NOT to Include 111 | 112 | - **Affiliate links or sponsored content**: This project is independent and ad-free 113 | - **Untested or experimental tools**: Stick to well-established, trusted solutions 114 | - **Illegal activities**: Focus on defensive security, not offensive techniques 115 | - **Fear-mongering**: Be honest about risks without creating unnecessary panic 116 | - **Personal opinions as facts**: Clearly distinguish recommendations from personal preferences 117 | 118 | ## License 119 | 120 | By contributing to this project, you agree that your contributions will be licensed under the [Creative Commons Attribution-NonCommercial 4.0 International License](LICENSE). 121 | 122 | This means: 123 | - Your contributions can be freely shared and adapted 124 | - You will be credited for your work 125 | - The project will remain non-commercial 126 | 127 | ## Questions? 128 | 129 | If you have questions about contributing, feel free to: 130 | - [Open an issue](https://github.com/Turtlecute33/PrivacyActivistKit/issues) for discussion 131 | - Reach out through the project's communication channels 132 | 133 | Thank you for helping make digital privacy accessible to everyone! ✨ 134 | -------------------------------------------------------------------------------- /docs/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Privacy Activist Kit 2 | 3 | Thank you for considering contributing to the Privacy Activist Kit! This project exists to help people protect their digital privacy, and your contributions help make that mission stronger. 4 | 5 | ## How You Can Help 6 | 7 | There are many ways to contribute, and you don't need to be a developer or security expert to make a meaningful impact: 8 | 9 | ### 🌟 Non-Technical Contributions 10 | 11 | - **Star the repository** on GitHub to help others discover the project 12 | - **Share the project** on social media or with communities who might benefit 13 | - **Report broken links** or outdated information 14 | - **Suggest new tools or services** that align with the project's privacy-focused mission 15 | - **Improve readability** by fixing typos, clarifying language, or improving explanations 16 | - **Translate content** to make privacy resources accessible in more languages 17 | - **Share feedback** on what's working well or what could be improved 18 | 19 | ### 📝 Content Contributions 20 | 21 | - **Add new guides** on privacy topics not yet covered 22 | - **Update existing content** with current best practices 23 | - **Create checklists** for specific use cases or threat models 24 | - **Write beginner-friendly explanations** of technical concepts 25 | - **Add real-world examples** to help illustrate privacy concepts 26 | 27 | ### 🔧 Technical Contributions 28 | 29 | - **Fix bugs** in the website or documentation 30 | - **Improve site performance** or accessibility 31 | - **Add new features** to the VitePress site 32 | - **Optimize images** and other assets 33 | - **Improve SEO** and discoverability 34 | 35 | ## Getting Started 36 | 37 | ### Reporting Issues 38 | 39 | Found a problem? [Open an issue](https://github.com/Turtlecute33/PrivacyActivistKit/issues) with: 40 | 41 | - A clear, descriptive title 42 | - A detailed description of the issue 43 | - Steps to reproduce (if applicable) 44 | - Expected vs. actual behavior 45 | - Screenshots (if relevant) 46 | 47 | ### Making Changes 48 | 49 | 1. **Fork the repository** to your own GitHub account using the Fork button on GitHub 50 | 2. **Clone your fork** locally (replace `YOUR-USERNAME` with your actual GitHub username): 51 | ```bash 52 | git clone https://github.com/YOUR-USERNAME/PrivacyActivistKit.git 53 | cd PrivacyActivistKit 54 | ``` 55 | 56 | Or clone the main repository directly if you just want to preview locally: 57 | ```bash 58 | git clone https://github.com/Turtlecute33/PrivacyActivistKit.git 59 | cd PrivacyActivistKit 60 | ``` 61 | 3. **Install dependencies**: 62 | ```bash 63 | npm install 64 | ``` 65 | 4. **Create a branch** for your changes: 66 | ```bash 67 | git checkout -b your-branch-name 68 | ``` 69 | 5. **Run the development server** to preview your changes: 70 | ```bash 71 | npm run docs:dev 72 | ``` 73 | This will start VitePress dev server at `http://localhost:5173/` 74 | 75 | 6. **Make your changes** - the site will auto-reload as you edit files 76 | 7. **Commit your changes** with a clear, descriptive message: 77 | ```bash 78 | git commit -m "Add brief description of your changes" 79 | ``` 80 | 8. **Push to your fork**: 81 | ```bash 82 | git push origin your-branch-name 83 | ``` 84 | 9. **Open a Pull Request** from your fork to the main repository 85 | 86 | ## Content Guidelines 87 | 88 | When contributing content to the Privacy Activist Kit, please follow these principles: 89 | 90 | ### Voice and Tone 91 | 92 | - **Clear and accessible**: Write for a general audience, not just technical experts 93 | - **Direct and practical**: Focus on actionable advice people can implement 94 | - **Empowering, not preachy**: Help people make informed choices without judgment 95 | - **Honest about trade-offs**: Privacy often involves balancing security, convenience, and usability 96 | 97 | ### Technical Standards 98 | 99 | - **Accuracy first**: Verify information from reliable sources before adding it 100 | - **Keep it current**: Privacy tools and best practices change frequently—date-sensitive content when appropriate 101 | - **Cite sources**: Link to official documentation, research papers, or trusted organizations 102 | - **Test recommendations**: Only recommend tools you've researched or used yourself 103 | 104 | ### Practical Considerations 105 | 106 | - **Consider diverse threat models**: What works for one person may not work for another 107 | - **Respect different risk levels**: Not everyone faces the same threats 108 | - **Avoid assumptions**: Don't assume technical knowledge, financial resources, or specific devices 109 | 110 | ### What NOT to Include 111 | 112 | - **Affiliate links or sponsored content**: This project is independent and ad-free 113 | - **Untested or experimental tools**: Stick to well-established, trusted solutions 114 | - **Illegal activities**: Focus on defensive security, not offensive techniques 115 | - **Fear-mongering**: Be honest about risks without creating unnecessary panic 116 | - **Personal opinions as facts**: Clearly distinguish recommendations from personal preferences 117 | 118 | ## License 119 | 120 | By contributing to this project, you agree that your contributions will be licensed under the [Creative Commons Attribution-NonCommercial 4.0 International License](https://github.com/Turtlecute33/PrivacyActivistKit/blob/main/LICENSE). 121 | 122 | This means: 123 | - Your contributions can be freely shared and adapted 124 | - You will be credited for your work 125 | - The project will remain non-commercial 126 | 127 | ## Questions? 128 | 129 | If you have questions about contributing, feel free to: 130 | - [Open an issue](https://github.com/Turtlecute33/PrivacyActivistKit/issues) for discussion 131 | - Reach out through the project's communication channels 132 | 133 | Thank you for helping make digital privacy accessible to everyone! ✨ -------------------------------------------------------------------------------- /docs/device-security.md: -------------------------------------------------------------------------------- 1 | ## The Operating System: Your Digital Foundation 2 | 3 | **Difficulty:** ★★ 4 | 5 | The **operating system (OS)** is the core software that runs your entire device (like Windows, macOS, or Linux). It's the foundation upon which all your applications and data rest. If your foundation is cracked, it doesn't matter how strong the house on top of it is. You cannot trust any privacy-focused software if it's running on a foundation you can't trust. 6 | 7 | ### Why a Closed-Source OS is a Privacy Risk 8 | 9 | Using a closed-source OS like **Windows** or **macOS** is like living in a house built by a company that refuses to show you the blueprints. You have to trust that they didn't install hidden cameras or microphones. Because the code is secret, you have no way of verifying that the OS isn't: 10 | - **Spying on your activities** through telemetry and diagnostics. 11 | - **Sending your data** to third-party advertisers or government agencies. 12 | - **Undermining the security** of the privacy software you install on top of it. 13 | 14 | For this reason, for any sensitive operations, it's best to use a secure, open-source operating system. **Linux is the most popular and well-supported choice.** 15 | 16 | ### Why is Linux More Secure? 17 | - **Open Source:** Its code can be reviewed by anyone, fostering transparency and trust. 18 | - **Permissions Model:** It has a stricter separation of privileges. It's much harder for a malicious program to gain control of the entire system. 19 | - **Less Targeted:** The vast majority of malware is designed to target Windows, which has a much larger market share. 20 | 21 | ### Recommended Linux Distributions 22 | 23 | - **Beginner:** [**Linux Mint**](https://linuxmint.com/) or [**Ubuntu**](https://ubuntu.com/). These are very user-friendly and have a familiar feel for Windows or Mac users. 24 | - **Intermediate:** Any distribution you are comfortable with. 25 | - **Advanced:** [**QubesOS**](https://www.qubes-os.org/) offers extreme security through compartmentalization. It runs different applications in separate, isolated virtual machines, so if one gets compromised, the rest of your system remains safe. 26 | - **Temporary System:** [**Tails**](https://tails.boum.org/) is a live OS that runs from a USB stick. It routes all traffic through Tor and erases everything when you shut it down, leaving no trace on the computer you used it on. 27 | 28 | > ### Not Ready to Switch? 29 | > 30 | > You can try Linux without replacing your current OS! 31 | > - **Virtual Machine:** A program like [**VirtualBox**](https://www.virtualbox.org/) lets you run Linux in a window on your current desktop, just like any other app. 32 | > - **Dual Boot:** This installs Linux alongside your current OS, and you can choose which one to start when you turn on your computer. 33 | 34 | --- 35 | 36 | ## Hardening: Strengthening Your System 37 | 38 | "Hardening" is the process of making your system more resistant to attacks. Think of it as reinforcing your house before a storm: you board up the windows, lock the doors, and remove anything from the yard that could be blown away. 39 | 40 | ### Windows Hardening 41 | 42 | **Difficulty:** ★ 43 | 44 | Windows is not a private OS by default, but you can significantly improve it. The easiest way is with **[Privacy.sexy](https://privacy.sexy/)**. This website generates a **script** (a file with a list of commands) that automates dozens of hardening operations. 45 | 46 | #### What does the script actually do? 47 | - **Disables Telemetry:** It stops Windows from sending diagnostic data and usage statistics back to Microsoft. 48 | - **Removes Bloatware:** It uninstalls pre-installed apps and advertising components that you don't need. 49 | - **Strengthens Security Settings:** It adjusts system policies to be more secure, for example, by disabling features that are commonly exploited by malware. 50 | 51 | > **Warning:** Your browser or Windows might flag the script as a virus. This is a false positive. It happens because the script is designed to modify system settings, which security software can interpret as suspicious. The script is entirely open source and trustworthy. 52 | 53 | **Remember to re-run this script every few months, as major Windows updates can revert these changes.** 54 | 55 | ### Linux Hardening 56 | 57 | **Difficulty:** ★★★ 58 | 59 | For most users, hardening a Linux system is not strictly necessary. However, if you have a high-threat model: 60 | 61 | - **Easy Method:** I wrote a simple [**bash script**](https://github.com/Turtlecute33/Hardening-linux-script) to apply some basic hardening rules. 62 | - **Advanced Method:** The [**PrivSec blog**](https://privsec.dev/posts/linux/desktop-hardening-guide/) has an excellent, in-depth guide for locking down a Linux desktop. 63 | 64 | --- 65 | 66 | ## GrapheneOS: A Secure Mobile OS 67 | 68 | **Difficulty:** ★★ 69 | 70 | **[GrapheneOS](https://grapheneos.org/)** is to Android phones what Linux is to PCs. It's a private, secure, open-source operating system that replaces the default, data-hungry Android OS that comes with your phone. It is the current "gold standard" for mobile security and privacy. 71 | 72 | The easiest way to install it is via the **[Web Installer](https://grapheneos.org/install/web)**, which guides you through the process. 73 | 74 | > If GrapheneOS isn't an option for you (it only supports Google Pixel phones), modern iPhones generally offer a higher level of security and privacy out of the box than standard Android phones. 75 | 76 | ### How GrapheneOS Protects You 77 | - **Hardened Kernel & Memory:** It includes advanced protections against memory corruption bugs, one of the most common types of security vulnerabilities. 78 | - **Sensor & Network Toggles:** You can instantly disable the camera, microphone, or network access with a single tap. 79 | - **"Kill Switch" PIN:** You can set up a secondary PIN that, when entered, instantly wipes all the data on the phone in an emergency. 80 | - **No Google Services:** By default, it has no Google apps or services, completely cutting off Google's data collection from the core of your device. 81 | -------------------------------------------------------------------------------- /docs/account-and-data-security.md: -------------------------------------------------------------------------------- 1 | ## Passwords and 2FA 2 | 3 | **Difficulty:** ★ 4 | 5 | To keep your accounts secure, you need strong passwords and a good system for managing them. This is especially important because many privacy-oriented services have **no password recovery**. If you forget your password, your account and its data are gone forever. 6 | 7 | ### How to Create Strong Passwords 8 | 9 | For decades, we were taught to create passwords like `Tr0ub4dor&3`—short, complex, and hard to remember. This is outdated and bad advice. It's much more secure to create a **passphrase**. 10 | 11 | - **What is a passphrase?** A sequence of four or more random, common words, like `"correct horse battery staple"`. 12 | - **Why is it more secure?** The strength of a password against modern "brute-force" attacks (where a computer tries billions of combinations) depends almost entirely on its **length**. Adding symbols and numbers makes a password only slightly harder to guess, but adding more words makes it exponentially harder. 13 | - **Why is it better for you?** It's dramatically easier to remember. 14 | 15 | > **The Golden Rule: Never reuse passwords.** Using the same password for multiple services is like using the same key for your house, your car, and your office. If a thief gets one key, they have access to everything. A data breach at one website could lead to all your accounts being compromised. 16 | 17 | ![A comic by xkcd that explains how password strength is calculated. It compares a hard to remember password like 'Tr0ub4dor&3' with a hard-to-guess but easy-to-remember one like 'correct horse battery staple'.](https://imgs.xkcd.com/comics/password_strength.png) 18 | 19 | ### Password Managers 20 | 21 | It's impossible to remember a unique, strong passphrase for every account you have. The solution is a **password manager**. It's a secure, encrypted vault that stores all your passwords and can automatically generate new, strong ones for you. You only have to remember one strong master password to unlock the vault. 22 | 23 | - [**Bitwarden**](https://bitwarden.com/): An excellent, open-source password manager. It's secure, respects your privacy, and is easy to use across all your devices. You can even host it on your own server if you're technically inclined. 24 | - [**LessPass**](https://lesspass.com/): A "deterministic" password generator. It doesn't store your passwords at all. Instead, it mathematically generates the same password every time based on three pieces of information: the site, your username, and your one master password. This is an advanced option for those who don't want to store a vault anywhere. 25 | 26 | ### Two-Factor Authentication (2FA) 27 | 28 | 2FA is a critical extra layer of security. It's like needing both your key and a secret code to open a safe. Even if someone steals your password, they still can't get into your account without your 2FA code. 29 | 30 | **Avoid using SMS for 2FA.** It's vulnerable to "SIM-swapping" attacks, where a scammer convinces your mobile provider to transfer your phone number to their SIM card. Instead, use a dedicated authenticator app or a hardware key. 31 | 32 | - **Authenticator Apps:** These apps generate a new, time-sensitive 6-digit code every 30 seconds. 33 | - [**Aegis**](https://getaegis.app/) (Android): Perfect for maximum security, as it stores your 2FA keys offline on your device. 34 | - [**Ente**](https://ente.io/auth) (iOS/Android): Offers the same quality as Aegis but includes an encrypted cloud backup so you don't lose your codes if you lose your phone. 35 | - **Hardware Keys:** 36 | - [**Yubikey**](https://www.yubico.com/): A physical USB key you plug into your device to approve logins. This is the most secure form of 2FA currently available. 37 | 38 | > You should enable 2FA on every sensitive account you have, especially email, financial accounts, and your password manager itself. 39 | 40 | --- 41 | 42 | ## Cloud Storage 43 | 44 | **Difficulty:** ★ 45 | 46 | The cloud is convenient, but it means storing your data on someone else's computer. The only way to do this privately is to use **zero-knowledge, end-to-end encryption**. This means your files are encrypted on your device *before* they are uploaded, and only you have the key to decrypt them. The cloud provider cannot access your data. 47 | 48 | 1. **Encrypt Manually:** Use a tool like [**Picocrypt**](https://picocrypt.org/) (a simple, open-source desktop tool) to encrypt your files before you drag them into a non-private cloud like Google Drive or Dropbox. 49 | 2. **Automate with Cryptomator:** [**Cryptomator**](https://cryptomator.org/) is an open-source tool that creates an encrypted "vault" inside your cloud storage folder. Any files you put in the vault are automatically encrypted on the fly. 50 | 3. **Use an Encrypted Cloud Provider:** Services like [**Proton Drive**](https://proton.me/drive) and [**Filen**](https://filen.io/) offer zero-knowledge, end-to-end encryption out of the box. 51 | 52 | > You can also self-host your own cloud with [**Nextcloud**](https://nextcloud.com/), but this is a complex task not recommended for beginners. 53 | 54 | --- 55 | 56 | ## Note-Taking Applications 57 | 58 | **Difficulty:** ★ 59 | 60 | Choosing a note-taking app is highly personal. The most important feature for privacy is **end-to-end encryption**, ensuring that not even the company that makes the app can read your notes. 61 | 62 | - [**Notesnook**](https://notesnook.com/): My favorite. It's freemium, cross-platform, and offers excellent features with free, end-to-end encrypted sync. (This guide was written in Notesnook). 63 | - [**Standard Notes**](https://standardnotes.com/): Another excellent, privacy-focused option with a focus on longevity and simplicity. 64 | - [**Notally**](https://notally.app/) (Android): A beautiful, simple, and clean offline note app for when you don't need cloud sync. 65 | 66 | --- 67 | 68 | ## Photos and Metadata 69 | 70 | **Difficulty:** ★ 71 | 72 | Every photo you take contains hidden data called **metadata (or EXIF data)**. This includes: 73 | - The exact time and date the photo was taken. 74 | - The GPS location where it was taken (if location services are on). 75 | - The make, model, and serial number of your phone or camera. 76 | 77 | This is a huge privacy risk. You probably don't want to share your home's exact GPS coordinates when you post a picture of your cat online. 78 | 79 | - **Mobile:** Use an app like [**Scrambled Exif**](https://play.google.com/store/apps/details?id=com.jarsilio.android.scrambledeggsif) on Android to remove this metadata *before* you share photos. On iOS, the built-in Photos app allows you to remove location data when sharing. 80 | - **Desktop:** If you're concerned about facial recognition, a tool called [**Fawkes**](https://sandlab.cs.uchicago.edu/fawkes/) can make subtle pixel-level changes to your photos (invisible to the human eye) that "cloak" your face and disrupt facial scanning tools. -------------------------------------------------------------------------------- /docs/online-anonymity.md: -------------------------------------------------------------------------------- 1 | ## VPN (Virtual Private Network) 2 | 3 | **Difficulty:** ★ 4 | 5 | A VPN is one of the most fundamental tools for online privacy. 6 | 7 | ### What is a VPN and Why Do You Need One? 8 | 9 | When you browse the internet, your device connects through your **Internet Service Provider (ISP)** (e.g., Comcast, Verizon, AT&T). Your ISP can see every website you visit, how long you stay there, and the type of content you access. They can use this to build a detailed profile about you and sell it to advertisers. 10 | 11 | A VPN creates a **secure, encrypted tunnel** between your device and a server operated by the VPN company. It's like sending your mail through a private, armored courier instead of the public postal service. 12 | 13 | 1. Your internet traffic is **encrypted** (scrambled) on your device. 14 | 2. It travels through the encrypted tunnel to the VPN server. 15 | 3. The VPN server decrypts your traffic and sends it to its final destination (the website you want to visit). 16 | 17 | The result: Your ISP can only see that you're connected to a VPN server, but they can't see *what* you're doing. The websites you visit see the IP address of the VPN server, not your real IP address. 18 | 19 | ### What a VPN Does and Doesn't Do 20 | 21 | | A VPN **DOES**... | A VPN **DOES NOT**... | 22 | | ------------------------------------------------------- | --------------------------------------------------------- | 23 | | ✅ Hide your IP address from websites. | ❌ Make you 100% anonymous. | 24 | | ✅ Hide your browsing activity from your ISP. | ❌ Protect you from malware or viruses. | 25 | | ✅ Encrypt your connection on public Wi-Fi. | ❌ Stop websites like Google or Facebook from tracking you once you log in. | 26 | | ✅ Bypass geographic censorship. | ❌ Replace the need for good security habits. | 27 | 28 | ### Choosing a VPN: The Importance of "No-Logs" 29 | 30 | Since all your traffic is going through the VPN's servers, you are shifting your trust from your ISP to the VPN provider. It is **critical** that you choose a provider that respects your privacy. The most important factor is a strict **"no-logs" policy**, which means they do not keep any records of your activity. 31 | 32 | The best providers go a step further and subject themselves to **independent, third-party audits** to publicly prove that they are sticking to their claims. 33 | 34 | Here are three of the most reliable and trustworthy services: 35 | 36 | - [**Mullvad**](https://mullvad.net/): Based in Sweden. Excellent privacy, accepts anonymous payments. 37 | - [**IVPN**](https://www.ivpn.net/): Based in Gibraltar. Strong ethics and transparency. 38 | - [**Proton VPN**](https://protonvpn.com/): Based in Switzerland, with a great free tier. 39 | 40 | > **Warning:** Be very careful when choosing a provider. Many highly advertised VPNs have questionable privacy policies or a history of data issues. Avoid "free" VPNs, as you are almost certainly paying with your data. 41 | 42 | --- 43 | 44 | ## Tor (The Onion Router) 45 | 46 | **Difficulty:** ★ 47 | 48 | **Tor** provides the highest level of online anonymity available to the public. Think of it like a VPN on steroids. 49 | 50 | ### How Tor Works: The Onion Analogy 51 | 52 | Tor works by routing your connection through at least three different volunteer-run servers around the world, wrapping your data in multiple layers of encryption, like the layers of an onion. 53 | 54 | 1. **Entry Node:** Knows who you are (your IP address) but not where you're going. 55 | 2. **Middle Node:** Knows only that traffic is coming from the entry node and going to the exit node. This breaks the chain of traceability. 56 | 3. **Exit Node:** Knows your destination website but has no idea who you are. 57 | 58 | This layered approach ensures that no single point in the chain knows both your identity and your destination, making it extremely difficult to trace the traffic back to you. 59 | 60 | The main drawback is that it's **much slower** than a VPN. To use it, download the **[Tor Browser](https://www.torproject.org/download/)**. 61 | 62 | > **Pro Tip:** Use Tor for your most sensitive activities: researching sensitive topics, communicating with anonymous sources, or accessing services on `.onion` websites (a special part of the internet only accessible through Tor). 63 | 64 | --- 65 | 66 | ## DNS (Domain Name System) 67 | 68 | **Difficulty:** ★ 69 | 70 | > **Note:** If you use a trustworthy VPN, you can skip this section. Your VPN already handles your DNS requests privately. 71 | 72 | Think of the DNS as the **phone book of the internet**. When you type a website address like `google.com`, your computer asks a DNS server to look up the corresponding IP address. By default, you use your ISP's DNS servers, which means they can log every site you visit, even if the content is encrypted. 73 | 74 | By switching to a privacy-focused DNS provider, you can prevent this. 75 | 76 | Some recommended DNS providers: 77 | 78 | - [**AdGuard DNS**](https://adguard-dns.io/): Also blocks ads and trackers. 79 | - [**Mullvad DNS**](https://mullvad.net/en/help/dns-over-https-and-dns-over-tls/): From the trusted VPN provider. 80 | - [**Quad9**](https://www.quad9.net/): Focuses on blocking malicious domains. 81 | 82 | --- 83 | 84 | ## Browsers and Search Engines 85 | 86 | **Difficulty:** ★ 87 | 88 | ### Private Browsers & Fingerprinting 89 | 90 | Your web browser knows a lot about you, and it can give you away even if you're using a VPN. Websites can identify you through a technique called **"browser fingerprinting."** This combines dozens of data points about your device (your screen resolution, installed fonts, browser version, plugins) to create a unique "fingerprint." 91 | 92 | A standard browser like Google Chrome does nothing to prevent this. A privacy-focused browser makes you look more generic and harder to single out from the crowd. 93 | 94 | - **Desktop:** [**Brave**](https://brave.com/) has strong, built-in anti-fingerprinting and ad-blocking features. [**Librewolf**](https://librewolf.net/) is a privacy-hardened version of Firefox. 95 | - **Mobile:** **Brave** is also great on mobile. If you use GrapheneOS, **Vanadium** is the best choice. 96 | 97 | ### Private Search Engines 98 | 99 | Google's business model is to track your searches to sell ads. To avoid this, use a private search engine that doesn't log your activity. 100 | 101 | - [**Brave Search**](https://search.brave.com/): Does not track you or your queries. 102 | - [**DuckDuckGo**](https://duckduckgo.com/): The most well-known private search engine. 103 | - [**Kagi**](https://kagi.com/): A premium, ad-free search engine funded entirely by its users (requires a subscription). 104 | - [**4Get**](https://4get.turtlecute.org/): An open-source "meta-search engine" that anonymizes your query and gets results from other engines without revealing who you are. -------------------------------------------------------------------------------- /docs/.vitepress/config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | import checkbox from 'markdown-it-checkbox' 3 | 4 | // https://vitepress.dev/reference/site-config 5 | export default defineConfig({ 6 | head: [ 7 | ['link', { rel: 'icon', href: '/favicon.ico' }], 8 | ['link', { rel: 'preload', href: '/assets/inter-italic-latin-ext.CN1xVJS-.woff2', as: 'font', type: 'font/woff2', crossorigin: 'anonymous' }], 9 | ['link', { rel: 'preload', href: '/assets/inter-roman-latin-ext.4ZJIpNVo.woff2', as: 'font', type: 'font/woff2', crossorigin: 'anonymous' }], 10 | // SEO 11 | ['link', { rel: 'canonical', href: 'https://privacyactivistkit.org' }], 12 | // Open Graph 13 | ['meta', { property: 'og:title', content: 'Privacy Activist Kit' }], 14 | ['meta', { property: 'og:description', content: 'A complete guide to digital self-defense for activists, journalists, and everyone else.' }], 15 | ['meta', { property: 'og:image', content: 'https://privacyactivistkit.org/pak.jpg' }], 16 | ['meta', { property: 'og:url', content: 'https://privacyactivistkit.org' }], 17 | ['meta', { property: 'og:type', content: 'website' }], 18 | // Twitter Card 19 | ['meta', { name: 'twitter:card', content: 'summary_large_image' }], 20 | ['meta', { name: 'twitter:title', content: 'Privacy Activist Kit' }], 21 | ['meta', { name: 'twitter:description', content: 'A complete guide to digital self-defense for activists, journalists, and everyone else.' }], 22 | ['meta', { name: 'twitter:image', content: 'https://privacyactivistkit.org/pak.jpg' }] 23 | ], 24 | title: "Privacy Activist Kit", 25 | description: "A complete guide to digital self-defense for activists, journalists, and everyone else.", 26 | sitemap: { 27 | hostname: 'https://privacyactivistkit.org' 28 | }, 29 | transformHead: ({ pageData }) => { 30 | const canonicalUrl = `https://privacyactivistkit.org/${pageData.relativePath.replace(/((^|\/)index)?\.md$/, '$2')}` 31 | return [ 32 | ['link', { rel: 'canonical', href: canonicalUrl }] 33 | ] 34 | }, 35 | markdown: { 36 | config(md) { 37 | md.use(checkbox, { 38 | divWrap: false, 39 | divClass: 'checkbox', 40 | idPrefix: 'cbx_' 41 | }) 42 | } 43 | }, 44 | cleanUrls: true, 45 | themeConfig: { 46 | // https://vitepress.dev/reference/default-theme-config 47 | nav: [ 48 | { text: 'Home', link: '/' }, 49 | { text: 'Guide', link: '/project-mission' } 50 | ], 51 | sidebar: [ 52 | { 53 | text: 'About', 54 | items: [ 55 | { text: 'Project Mission', link: '/project-mission' }, 56 | ] 57 | }, 58 | { 59 | text: 'Privacy', 60 | items: [ 61 | { text: 'Introduction', link: '/introduction#introduction' }, 62 | { text: 'Understanding Privacy', link: '/introduction#understanding-privacy-in-the-digital-age' }, 63 | { text: 'Digital Minimalism', link: '/introduction#digital-minimalism' }, 64 | { text: 'Open Source', link: '/introduction#open-source' } 65 | ] 66 | }, 67 | { 68 | text: 'Threat Modeling', 69 | items: [ 70 | { text: 'Who Are You Defending Against?', link: '/threat-modeling#who-are-you-defending-against-threat-actors' }, 71 | { text: 'Define Your Personal Threat Model', link: '/threat-modeling#how-to-define-your-personal-threat-model' } 72 | ] 73 | }, 74 | { 75 | text: 'Device Security', 76 | items: [ 77 | { text: 'The Operating System', link: '/device-security#the-operating-system-your-digital-foundation' }, 78 | { text: 'Hardening Your System', link: '/device-security#hardening-strengthening-your-system' }, 79 | { text: 'GrapheneOS', link: '/device-security#grapheneos-a-secure-mobile-os' } 80 | ] 81 | }, 82 | { 83 | text: 'Online Anonymity', 84 | items: [ 85 | { text: 'VPN', link: '/online-anonymity#vpn-virtual-private-network' }, 86 | { text: 'Tor', link: '/online-anonymity#tor-the-onion-router' }, 87 | { text: 'DNS', link: '/online-anonymity#dns-domain-name-system' }, 88 | { text: 'Browsers and Search Engines', link: '/online-anonymity#browsers-and-search-engines' } 89 | ] 90 | }, 91 | { 92 | text: 'Secure Communication', 93 | items: [ 94 | { text: 'Email', link: '/secure-communication#email-your-digital-mailbox' }, 95 | { text: 'PGP and Cryptography', link: '/secure-communication#pgp-and-cryptography' }, 96 | { text: 'Secure Messaging', link: '/secure-communication#secure-messaging' } 97 | ] 98 | }, 99 | { 100 | text: 'Accounts & Data', 101 | items: [ 102 | { text: 'Passwords and 2FA', link: '/account-and-data-security#passwords-and-2fa' }, 103 | { text: 'Cloud Storage', link: '/account-and-data-security#cloud-storage' }, 104 | { text: 'Note-Taking Apps', link: '/account-and-data-security#note-taking-applications' }, 105 | { text: 'Photos and Metadata', link: '/account-and-data-security#photos-and-metadata' } 106 | ] 107 | }, 108 | { 109 | text: 'Bitcoin', 110 | items: [ 111 | { text: 'Bitcoin Privacy', link: '/bitcoin#bitcoin-privacy' }, 112 | { text: 'UTXOs and Transactions', link: '/bitcoin#utxos-fees-and-transactions' }, 113 | { text: 'Full Node', link: '/bitcoin#the-full-node' }, 114 | { text: 'Chain Analysis', link: '/bitcoin#chain-analysis' }, 115 | { text: 'Wallets and Security', link: '/bitcoin#wallets-security-and-seed' }, 116 | { text: 'Acquiring Bitcoin', link: '/bitcoin#acquiring-bitcoin' }, 117 | { text: 'Defense Strategies', link: '/bitcoin#how-to-defend-yourself' }, 118 | { text: 'CoinJoin', link: '/bitcoin#coinjoin' } 119 | ] 120 | }, 121 | { 122 | text: 'Security Checklist', 123 | items: [ 124 | { text: 'Intro', link: '/activist-checklists#activist-digital-security-checklists' }, 125 | { text: 'Travel & Flight Security', link: '/activist-checklists#%E2%9C%88%EF%B8%8F-travel-flight-security' }, 126 | { text: 'Digital Security', link: '/activist-checklists#%F0%9F%8F%9B%EF%B8%8F-digital-security-for-federal-workers' }, 127 | { text: 'Signal Security Checklist', link: '/activist-checklists#%F0%9F%93%B1-signal-security-checklist' }, 128 | { text: 'Digital Security for Direct Action Organizing', link: '/activist-checklists#%F0%9F%93%A2-digital-security-for-direct-action-organizing' }, 129 | { text: 'Action Research & Scouting', link: '/activist-checklists#%F0%9F%94%8D-action-research-scouting' }, 130 | { text: 'Prepare for a Protest', link: '/activist-checklists#%E2%9C%8A-prepare-for-a-protest' }, 131 | { text: 'Security Essentials', link: '/activist-checklists#%F0%9F%94%90-security-essentials' }, 132 | { text: 'Additional Resources', link: '/activist-checklists#%F0%9F%93%9A-additional-resources' } 133 | ] 134 | }, 135 | { 136 | text: 'Bonus Section', 137 | items: [ 138 | { text: 'Large Language Models', link: '/bonus#large-language-models-llms' }, 139 | { text: 'VPS and Domains', link: '/bonus#vps-and-internet-domains' } 140 | ] 141 | } 142 | ], 143 | 144 | 145 | socialLinks: [ 146 | { icon: 'github', link: 'https://github.com/Turtlecute33/PrivacyActivistKit' } 147 | ] 148 | } 149 | }) 150 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vue.js: -------------------------------------------------------------------------------- 1 | import { 2 | BaseTransition, 3 | BaseTransitionPropsValidators, 4 | Comment, 5 | DeprecationTypes, 6 | EffectScope, 7 | ErrorCodes, 8 | ErrorTypeStrings, 9 | Fragment, 10 | KeepAlive, 11 | ReactiveEffect, 12 | Static, 13 | Suspense, 14 | Teleport, 15 | Text, 16 | TrackOpTypes, 17 | Transition, 18 | TransitionGroup, 19 | TriggerOpTypes, 20 | VueElement, 21 | assertNumber, 22 | callWithAsyncErrorHandling, 23 | callWithErrorHandling, 24 | camelize, 25 | capitalize, 26 | cloneVNode, 27 | compatUtils, 28 | compile, 29 | computed, 30 | createApp, 31 | createBaseVNode, 32 | createBlock, 33 | createCommentVNode, 34 | createElementBlock, 35 | createHydrationRenderer, 36 | createPropsRestProxy, 37 | createRenderer, 38 | createSSRApp, 39 | createSlots, 40 | createStaticVNode, 41 | createTextVNode, 42 | createVNode, 43 | customRef, 44 | defineAsyncComponent, 45 | defineComponent, 46 | defineCustomElement, 47 | defineEmits, 48 | defineExpose, 49 | defineModel, 50 | defineOptions, 51 | defineProps, 52 | defineSSRCustomElement, 53 | defineSlots, 54 | devtools, 55 | effect, 56 | effectScope, 57 | getCurrentInstance, 58 | getCurrentScope, 59 | getCurrentWatcher, 60 | getTransitionRawChildren, 61 | guardReactiveProps, 62 | h, 63 | handleError, 64 | hasInjectionContext, 65 | hydrate, 66 | hydrateOnIdle, 67 | hydrateOnInteraction, 68 | hydrateOnMediaQuery, 69 | hydrateOnVisible, 70 | initCustomFormatter, 71 | initDirectivesForSSR, 72 | inject, 73 | isMemoSame, 74 | isProxy, 75 | isReactive, 76 | isReadonly, 77 | isRef, 78 | isRuntimeOnly, 79 | isShallow, 80 | isVNode, 81 | markRaw, 82 | mergeDefaults, 83 | mergeModels, 84 | mergeProps, 85 | nextTick, 86 | normalizeClass, 87 | normalizeProps, 88 | normalizeStyle, 89 | onActivated, 90 | onBeforeMount, 91 | onBeforeUnmount, 92 | onBeforeUpdate, 93 | onDeactivated, 94 | onErrorCaptured, 95 | onMounted, 96 | onRenderTracked, 97 | onRenderTriggered, 98 | onScopeDispose, 99 | onServerPrefetch, 100 | onUnmounted, 101 | onUpdated, 102 | onWatcherCleanup, 103 | openBlock, 104 | popScopeId, 105 | provide, 106 | proxyRefs, 107 | pushScopeId, 108 | queuePostFlushCb, 109 | reactive, 110 | readonly, 111 | ref, 112 | registerRuntimeCompiler, 113 | render, 114 | renderList, 115 | renderSlot, 116 | resolveComponent, 117 | resolveDirective, 118 | resolveDynamicComponent, 119 | resolveFilter, 120 | resolveTransitionHooks, 121 | setBlockTracking, 122 | setDevtoolsHook, 123 | setTransitionHooks, 124 | shallowReactive, 125 | shallowReadonly, 126 | shallowRef, 127 | ssrContextKey, 128 | ssrUtils, 129 | stop, 130 | toDisplayString, 131 | toHandlerKey, 132 | toHandlers, 133 | toRaw, 134 | toRef, 135 | toRefs, 136 | toValue, 137 | transformVNodeArgs, 138 | triggerRef, 139 | unref, 140 | useAttrs, 141 | useCssModule, 142 | useCssVars, 143 | useHost, 144 | useId, 145 | useModel, 146 | useSSRContext, 147 | useShadowRoot, 148 | useSlots, 149 | useTemplateRef, 150 | useTransitionState, 151 | vModelCheckbox, 152 | vModelDynamic, 153 | vModelRadio, 154 | vModelSelect, 155 | vModelText, 156 | vShow, 157 | version, 158 | warn, 159 | watch, 160 | watchEffect, 161 | watchPostEffect, 162 | watchSyncEffect, 163 | withAsyncContext, 164 | withCtx, 165 | withDefaults, 166 | withDirectives, 167 | withKeys, 168 | withMemo, 169 | withModifiers, 170 | withScopeId 171 | } from "./chunk-DDXJJ377.js"; 172 | export { 173 | BaseTransition, 174 | BaseTransitionPropsValidators, 175 | Comment, 176 | DeprecationTypes, 177 | EffectScope, 178 | ErrorCodes, 179 | ErrorTypeStrings, 180 | Fragment, 181 | KeepAlive, 182 | ReactiveEffect, 183 | Static, 184 | Suspense, 185 | Teleport, 186 | Text, 187 | TrackOpTypes, 188 | Transition, 189 | TransitionGroup, 190 | TriggerOpTypes, 191 | VueElement, 192 | assertNumber, 193 | callWithAsyncErrorHandling, 194 | callWithErrorHandling, 195 | camelize, 196 | capitalize, 197 | cloneVNode, 198 | compatUtils, 199 | compile, 200 | computed, 201 | createApp, 202 | createBlock, 203 | createCommentVNode, 204 | createElementBlock, 205 | createBaseVNode as createElementVNode, 206 | createHydrationRenderer, 207 | createPropsRestProxy, 208 | createRenderer, 209 | createSSRApp, 210 | createSlots, 211 | createStaticVNode, 212 | createTextVNode, 213 | createVNode, 214 | customRef, 215 | defineAsyncComponent, 216 | defineComponent, 217 | defineCustomElement, 218 | defineEmits, 219 | defineExpose, 220 | defineModel, 221 | defineOptions, 222 | defineProps, 223 | defineSSRCustomElement, 224 | defineSlots, 225 | devtools, 226 | effect, 227 | effectScope, 228 | getCurrentInstance, 229 | getCurrentScope, 230 | getCurrentWatcher, 231 | getTransitionRawChildren, 232 | guardReactiveProps, 233 | h, 234 | handleError, 235 | hasInjectionContext, 236 | hydrate, 237 | hydrateOnIdle, 238 | hydrateOnInteraction, 239 | hydrateOnMediaQuery, 240 | hydrateOnVisible, 241 | initCustomFormatter, 242 | initDirectivesForSSR, 243 | inject, 244 | isMemoSame, 245 | isProxy, 246 | isReactive, 247 | isReadonly, 248 | isRef, 249 | isRuntimeOnly, 250 | isShallow, 251 | isVNode, 252 | markRaw, 253 | mergeDefaults, 254 | mergeModels, 255 | mergeProps, 256 | nextTick, 257 | normalizeClass, 258 | normalizeProps, 259 | normalizeStyle, 260 | onActivated, 261 | onBeforeMount, 262 | onBeforeUnmount, 263 | onBeforeUpdate, 264 | onDeactivated, 265 | onErrorCaptured, 266 | onMounted, 267 | onRenderTracked, 268 | onRenderTriggered, 269 | onScopeDispose, 270 | onServerPrefetch, 271 | onUnmounted, 272 | onUpdated, 273 | onWatcherCleanup, 274 | openBlock, 275 | popScopeId, 276 | provide, 277 | proxyRefs, 278 | pushScopeId, 279 | queuePostFlushCb, 280 | reactive, 281 | readonly, 282 | ref, 283 | registerRuntimeCompiler, 284 | render, 285 | renderList, 286 | renderSlot, 287 | resolveComponent, 288 | resolveDirective, 289 | resolveDynamicComponent, 290 | resolveFilter, 291 | resolveTransitionHooks, 292 | setBlockTracking, 293 | setDevtoolsHook, 294 | setTransitionHooks, 295 | shallowReactive, 296 | shallowReadonly, 297 | shallowRef, 298 | ssrContextKey, 299 | ssrUtils, 300 | stop, 301 | toDisplayString, 302 | toHandlerKey, 303 | toHandlers, 304 | toRaw, 305 | toRef, 306 | toRefs, 307 | toValue, 308 | transformVNodeArgs, 309 | triggerRef, 310 | unref, 311 | useAttrs, 312 | useCssModule, 313 | useCssVars, 314 | useHost, 315 | useId, 316 | useModel, 317 | useSSRContext, 318 | useShadowRoot, 319 | useSlots, 320 | useTemplateRef, 321 | useTransitionState, 322 | vModelCheckbox, 323 | vModelDynamic, 324 | vModelRadio, 325 | vModelSelect, 326 | vModelText, 327 | vShow, 328 | version, 329 | warn, 330 | watch, 331 | watchEffect, 332 | watchPostEffect, 333 | watchSyncEffect, 334 | withAsyncContext, 335 | withCtx, 336 | withDefaults, 337 | withDirectives, 338 | withKeys, 339 | withMemo, 340 | withModifiers, 341 | withScopeId 342 | }; 343 | //# sourceMappingURL=vue.js.map 344 | -------------------------------------------------------------------------------- /docs/introduction.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | Welcome to the definitive guide to digital privacy. This is an introductory manual designed to empower you as a **sovereign individual**. This guide will teach you how to reclaim control over your digital identity. 4 | 5 | You will learn to: 6 | - Connect to the Internet securely and privately. 7 | - Protect your accounts from unauthorized access. 8 | - Browse the web without leaving a trail of digital footprints. 9 | - Communicate with others without being monitored. 10 | - And much more. 11 | 12 | ::: tip 13 | Please don't feel overwhelmed or expect to follow all these steps in a single day; that would be impossible. Think of this as building a fortress. You start with a strong foundation and then build up the walls brick by brick. Feel free to jump between sections and come back to topics later. All parts of this guide are important, but none are mandatory. Progress at your own pace. 14 | ::: 15 | 16 | At the beginning of each section, you will see a star rating to indicate the difficulty: 17 | 18 | - ★: **Easy** - Great for beginners and quick wins. 19 | - ★★: **Medium** - May require some patience or learning a new tool. 20 | - ★★★: **Difficult** - For those who want a deeper dive into technical concepts. 21 | 22 | ::: info 23 | I am in no way affiliated with or paid by any of the services mentioned in this guide. These recommendations are based on my own research and personal use. 24 | ::: 25 | 26 | ## Understanding Privacy in the Digital Age 27 | 28 | In today's interconnected world, the phrase "data is the new oil" has become a stark reality. This comparison powerfully illustrates the immense value of personal data, which has become the fuel for a multi-billion dollar industry. Just as the Texas Oil Boom created unprecedented wealth and transformed the United States, the explosion of data has reshaped the internet and our digital lives. However, this rapid progress has often been achieved at the expense of user privacy, with our personal information being collected, analyzed, and traded in ways that are frequently opaque and non-consensual. 29 | 30 | ### Why Should You Care About Your Privacy? 31 | 32 | Many of us have become accustomed to targeted advertising. We might even appreciate the occasional convenience of seeing an ad for a product that genuinely interests us. However, the methods used to gather the data for these seemingly harmless ads are far more invasive and far-reaching than most people realize. This relentless data collection can lead to unforeseen and, in some cases, devastating consequences. 33 | 34 | It may sound like a plot from a dystopian novel, but the reality is that corporations and governments are constantly collecting and scrutinizing our data. This information is used for a vast array of purposes, from influencing our purchasing decisions to enabling widespread government surveillance. Here are just a few examples of how this data is being used and why it matters: 35 | 36 | * **Government Surveillance and Control:** Governments around the world have been caught using digital data to monitor activists, journalists, and even their own citizens. This can have a chilling effect on free speech and political dissent, creating a society where people are afraid to express themselves for fear of being targeted. 37 | * **Corporate Profiling and Manipulation:** Companies track your every move online—your browsing history, your location, your social media activity, and even your DNA—to build incredibly detailed profiles about you. This information is then sold to data brokers and other companies, used to manipulate your behavior, and can even be used to determine your eligibility for loans, insurance, or employment. 38 | * **The Threat of Data Breaches:** The vast troves of personal data being collected are a prime target for hackers and cybercriminals. A single data breach can expose everything from your username and password to your financial information, government identification, and other sensitive personal details. This can lead to identity theft, financial loss, and other serious consequences. 39 | 40 | The common refrain of "I have nothing to hide" is a dangerous and misleading argument. Privacy is not about having secrets to keep; it's about having the fundamental right to control your own information and your own life. We all have aspects of our lives that we wouldn't want to broadcast to the world, and that is a perfectly normal and healthy part of being human. Privacy is a cornerstone of individual autonomy and a vital component of a free and democratic society. It empowers us to be our authentic selves, to explore new ideas without fear of judgment, and to live our lives without being constantly monitored and manipulated. 41 | 42 | ![Minimalist illustration in soft purple tones showing a person silhouette, a padlock, a computer screen with an eye symbol, and an ID card. The image represents digital privacy, surveillance, and data protection.](public/549a4229-242b-488f-8473-884278135b03.webp) 43 | 44 | ### The Crucial Differences: Privacy, Security, and Anonymity 45 | 46 | To effectively protect yourself in the digital world, it's essential to understand the distinctions between three key concepts: privacy, security, and anonymity. 47 | 48 | * **Privacy:** This is the assurance that your data is only accessible to the parties you intend to share it with. For example, end-to-end encryption in a messaging app provides privacy by ensuring that only you and the recipient can read your messages. 49 | * **Security:** This refers to the measures taken to protect your data from unauthorized access, use, disclosure, alteration, or destruction. It involves trusting the applications you use and keeping them safe from threats. For example, HTTPS certificates on websites provide security by encrypting your connection and verifying that you are communicating with the legitimate website. 50 | * **Anonymity:** This is the ability to act online without revealing your true identity. Tools like Tor can provide anonymity by masking your IP address and routing your internet traffic through a series of relays, making it difficult to trace your online activity back to you. 51 | 52 | These three concepts are interconnected, but they are not interchangeable. It's possible to have one without the others. The ideal scenario is to achieve a balance of all three, but this can be a complex and challenging endeavor. This is where **threat modeling** becomes crucial. By understanding the specific threats you face and your personal risk tolerance, you can make informed decisions about the software and services you use and find the right balance of privacy, security, and anonymity for your individual needs. 53 | 54 | ### Reclaiming Your Digital Autonomy 55 | 56 | The notion that you can achieve complete privacy simply by ticking a few boxes in a settings menu is often an illusion. While these options can offer a degree of control, they are frequently designed to be confusing and to nudge you into sharing more data than you might otherwise be comfortable with. 57 | 58 | True, meaningful privacy must be a core component of the software and services we use, built-in from the ground up. By consciously choosing services that are designed with privacy in mind, and by being mindful and deliberate about the data you share, you can begin to take back control of your digital life and reclaim your autonomy in the digital age. 59 | 60 | 61 | ## Digital Minimalism 62 | 63 | The most important principle for digital security is **minimalism**. Think of your digital life like a house: the more doors and windows you have (software, apps, accounts), the more potential entry points there are for an intruder. This is your **"attack surface."** The less software, code, and files you have on your devices, the smaller your attack surface. 64 | 65 | Simplicity is your best ally. A minimalist digital life is not only faster and more efficient, but it's also far easier to manage and secure, which significantly reduces the chance of making a security mistake. 66 | 67 | ### Apply Minimalism Everywhere: A Checklist 68 | 69 | - **Review Your Accounts:** Go through your password manager. If you have accounts you no longer use (like that old MySpace or forum account), delete them. Each one is a potential source of a data breach. 70 | - **Clean Up Your Apps:** Uninstall any software or mobile apps you haven't used in the last six months. They can run in the background, collect data, and have security vulnerabilities. 71 | - **Limit Your Data:** When signing up for a new service, only provide the information that is absolutely required. If a field is optional, leave it blank. 72 | - **Declutter Your Files:** Fewer files mean fewer things to worry about losing or having stolen. Organize your important documents and delete what you no longer need. 73 | 74 | 75 | ## Open Source 76 | 77 | The second core principle is **open source**. Think of it as the difference between a secret family recipe and a recipe published in a famous cookbook for everyone to see and critique. 78 | 79 | - **Closed Source (the secret recipe):** The software's code is hidden and proprietary. You have to blindly trust that the software does what it says it does and isn't doing anything malicious, like spying on you. Examples include Microsoft Windows, Adobe Photoshop, and Google Chrome. 80 | - **Open Source (the public recipe):** The software's code is public. It can be reviewed, scrutinized, and improved by anyone in the world. This transparency builds trust through verification. 81 | 82 | ### The "Many Eyes" Theory 83 | 84 | Open source operates on the principle that "given enough eyeballs, all bugs are shallow." This means that when many people are looking at the code, security flaws and backdoors are much more likely to be found and fixed quickly. It's a collaborative effort that makes software more secure and trustworthy. 85 | 86 | Using transparent, open-source software is fundamental. It doesn't eliminate all risks, but it drastically reduces your attack surface because the code is constantly being held accountable by the community. **If possible, always prefer and use open-source applications.** 87 | -------------------------------------------------------------------------------- /docs/threat-modeling.md: -------------------------------------------------------------------------------- 1 | # Who Are You Defending Against? A Guide to Threat Modeling 2 | 3 | **Difficulty:** ★ 4 | 5 | Before you can protect yourself, you must understand what you're protecting yourself from. This process is called **threat modeling**, and it is the essential first step on any privacy journey. It's a structured way of thinking about the unique risks to your digital life. When it comes to privacy and security, it is crucial to be clear about **who you need to defend yourself from** and **what you need to protect**. 6 | 7 | Balancing security, privacy, and convenience is a difficult task. Everything is a trade-off: the more secure something is, the more inconvenient it generally becomes. Because it is impossible to protect yourself against every possible threat, you should focus your energy on the ones that are most probable and most dangerous to *you*. Your privacy needs are not the same as everyone else's. A generic approach to privacy is better than nothing, but a personalized one is far more effective. 8 | 9 | ## What is a Threat? 10 | 11 | In the context of digital security, a threat is any event that could undermine your efforts to stay private and secure. A "threat actor" is anyone who might want to compromise your privacy or security. Here are some common examples: 12 | 13 | * **Large Tech Corporations (e.g., Google, Meta):** Their business model often revolves around collecting your data to build detailed profiles for targeted advertising and engagement. 14 | * **Data Brokers:** These companies buy and sell personal information, gathering data from public records, social media, and the apps you use. 15 | * **Service Providers:** Beyond just "big tech," any service you use (from your email provider to your cloud storage) could potentially access your data. 16 | * **Governments:** Depending on your location and activities, you may be subject to government surveillance for law enforcement or intelligence gathering. 17 | * **Cybercriminals:** These actors aim to steal your money, identity, or sensitive data for financial gain through methods like ransomware or phishing attacks. 18 | * **A Specific, Targeted Individual:** This could be a stalker, an abusive ex-partner, a malicious co-worker, or a business rival. This is often a highly dangerous threat actor because they are personally motivated to harm you. 19 | 20 | ## How to Define Your Personal Threat Model 21 | 22 | To build a clear picture of your privacy and security needs, ask yourself these five fundamental questions: 23 | 24 | ### 1. What assets do I want to protect? 25 | 26 | An "asset" is anything you value and want to protect. In the digital world, this is usually information. Examples include: 27 | 28 | * Your personal emails and instant messages 29 | * Your private photos and files 30 | * Your location history and contact lists 31 | * Your financial information 32 | * The identity of your contacts 33 | * Your browsing habits 34 | 35 | *Action: Make a list of your data assets, where they are stored, who has access, and what currently prevents others from accessing them.* 36 | 37 | ### 2. Who do I want to protect it from? 38 | 39 | An "adversary" is any person or entity that poses a threat to your assets. Refer to the list of threat actors above and be specific. Is your primary concern a global corporation, a government agency, or a specific person in your life? This will dramatically change your strategy. Your boss, a former partner, business competition, or a hacker on a public network are all potential adversaries. 40 | 41 | ::: tip ACTION 42 | List your adversaries or those who might want to access your assets. This list might be something you choose to destroy after you're done.* 43 | ::: 44 | 45 | ### 3. How likely is it that I will need to protect it? 46 | 47 | This question is about risk. Risk is the likelihood that a specific threat will actually occur. For example, while your mobile provider has the *capability* to access your data, the *risk* of them posting it online to harm you is very low. You need to distinguish between what *could* happen and how likely it *is* to happen. 48 | 49 | ::: tip ACTION 50 | *Assess your personal risk level. Are you a high-profile journalist or activist, or are you an everyday user looking to improve your general privacy hygiene? Write down which threats you will take seriously and which are too rare or harmless to worry about.* 51 | ::: 52 | 53 | ### 4. How bad are the consequences if I fail? 54 | 55 | What is the worst-case scenario if an adversary gains access to your assets? The motives of adversaries vary widely, and so do their tactics. A political opponent might want to access and leak your private messages, while a corporation simply wants to show you more effective ads. 56 | 57 | The consequences can range from annoying targeted ads and financial loss to personal embarrassment, reputational damage, legal trouble, or even physical danger. 58 | 59 | ::: tip ACTION 60 | Think about what your adversary might want to do with your data and how severe the impact would be on your life.* 61 | ::: 62 | 63 | ### 5. How much effort am I willing to put in? 64 | 65 | There is no perfect security solution. Be honest with yourself. Are you willing to pay for services, change your habits, or learn new, more complex software? The most secure tool is useless if you find it too inconvenient to use. A lawyer representing a client in a national security case will go to greater lengths (like using complex encrypted email) than a parent emailing cat videos to their child. 66 | 67 | ::: tip ACTION 68 | Write down the options available to you and be realistic about any financial, technical, or social constraints you may have.* 69 | ::: 70 | 71 | ### Example Scenarios 72 | 73 | Here’s how different people might approach threat modeling: 74 | 75 | * Scenario 1: The Everyday User 76 | * **Assets:** Browsing history, shopping habits, emails. 77 | * **Threat Actor:** Tech companies and advertisers. 78 | * **Consequences of Failure:** Annoying targeted ads, manipulation of purchasing decisions. 79 | * **Strategy:** Use a private browser, a good ad-blocker, and a privacy-focused email service. This is a low-effort, high-reward strategy. 80 | 81 | * Scenario 2: The Political Activist 82 | * **Assets:** Personal identity, location, and communications with other activists. 83 | * **Threat Actor:** Government agencies, political opponents. 84 | * **Consequences of Failure:** Legal trouble, physical harm, or compromising the safety of others. 85 | * **Strategy:** Use end-to-end encrypted communication tools like Signal, anonymizing networks like Tor, and secure operating systems like Tails. This is a high-effort, critical-need strategy. 86 | 87 | * Scenario 3: The Survivor of Domestic Abuse 88 | * **Assets:** Physical location, new address, private online information. 89 | * **Threat Actor:** An abusive ex-partner (a stalker). 90 | * **Consequences of Failure:** Physical danger and harassment. 91 | * **Strategy:** The focus is less on corporate surveillance and more on operational security. This includes locking down all social media, ensuring location services are disabled, and being extremely wary of phishing attempts from the abuser. 92 | 93 | 94 | ## Putting Your Threat Model into Practice: Deeper Concepts 95 | 96 | Once you have a model, you can choose the right tools and strategies. Here are some key concepts to consider. 97 | 98 | ### Protection from Malware and Hackers 99 | 100 | Privacy is impossible without security. Using private tools is pointless if an attacker can easily exploit your device and access your data. 101 | 102 | * **Compartmentalization:** To minimize the damage a malicious app can do, you should use security by compartmentalization. This can mean using different computers or virtual machines for different tasks (e.g., one for banking, one for general browsing). 103 | * **Secure Operating Systems:** Mobile operating systems like Android and iOS are generally more secure than desktop operating systems because their apps are sandboxed, meaning they are isolated from the core system and each other. On desktop, operating systems like Qubes OS are designed with a strong focus on security through virtualization. 104 | * **Physical Security:** If you are concerned about physical attacks, use an operating system with secure verified boot (like iOS, Android, or macOS) and always enable full-disk encryption. 105 | 106 | ### Privacy from Service Providers 107 | 108 | A primary threat for most people is the service provider itself. Your "private" messages, emails, and files are typically stored on a server, where the company can access them. 109 | 110 | * **End-to-End Encryption (E2EE):** This is the technical solution. E2EE ensures that your data is encrypted on your device *before* it is sent to the server, and can only be decrypted by the intended recipient. The service provider only sees scrambled, encrypted data. 111 | * **Native Apps vs. Web Apps:** When using an E2EE service, native applications (software installed directly on your computer or phone) are generally more trustworthy than web-based clients. A malicious server could secretly send different code to a web browser to steal your keys, an attack which is much harder to detect than a backdoored native app. 112 | * **Metadata:** Even with E2EE, service providers can still see metadata: who you talk to, when, and how often. If this is part of your threat model, look for services that are specifically designed to minimize metadata collection. 113 | 114 | ### Limiting Your Public and Trackable Information 115 | 116 | * **The Best Defense:** The most effective way to keep data private is to not put it out there in the first place. Regularly search for yourself online and request to have your information taken down where possible. 117 | * **Segregate Identities:** Avoid cross-site tracking by using different browsers, pseudonyms, and email addresses for different areas of your life (e.g., work, personal, hobbies). 118 | * **Check Privacy Settings:** On any account where you share information, check the privacy settings and lock them down. If a "private mode" is available, enable it to prevent your profile from being indexed by search engines. 119 | 120 | ## Common Bad Practices to Avoid 121 | 122 | As you begin your privacy journey, be wary of these common pitfalls: 123 | 124 | * **Solely focusing on advertising networks:** The threat is broader than just ads. It’s about data collection by *any* service provider. 125 | * **Heavy reliance on privacy policies:** A policy is a promise, not a technical safeguard. Companies can change their policies, get acquired, or suffer a data breach. 126 | * **Blindly shifting trust:** Don't just switch from a "big tech" provider to a "small tech" provider without understanding the underlying technology. If the new provider has the same access to your data, you haven't solved the root problem. 127 | * **Blindly trusting open-source software:** While transparency is good, open-source does not automatically mean secure or private. Evaluate software based on its security properties and history, not just its license. 128 | 129 | By spending a few minutes thinking through your threat model, you can move beyond generic advice and focus your energy on the solutions that provide the most protection for *your* specific situation. -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/@theme_index.js: -------------------------------------------------------------------------------- 1 | import { 2 | useMediaQuery 3 | } from "./chunk-3GYA4YLH.js"; 4 | import { 5 | computed, 6 | ref, 7 | shallowRef, 8 | watch 9 | } from "./chunk-DDXJJ377.js"; 10 | 11 | // node_modules/vitepress/dist/client/theme-default/index.js 12 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/fonts.css"; 13 | 14 | // node_modules/vitepress/dist/client/theme-default/without-fonts.js 15 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/vars.css"; 16 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/base.css"; 17 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/icons.css"; 18 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/utils.css"; 19 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/components/custom-block.css"; 20 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code.css"; 21 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code-group.css"; 22 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/components/vp-doc.css"; 23 | import "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/styles/components/vp-sponsor.css"; 24 | import VPBadge from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue"; 25 | import Layout from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/Layout.vue"; 26 | import { default as default2 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue"; 27 | import { default as default3 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPButton.vue"; 28 | import { default as default4 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue"; 29 | import { default as default5 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPFeatures.vue"; 30 | import { default as default6 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPHomeContent.vue"; 31 | import { default as default7 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue"; 32 | import { default as default8 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue"; 33 | import { default as default9 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue"; 34 | import { default as default10 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPImage.vue"; 35 | import { default as default11 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPLink.vue"; 36 | import { default as default12 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPNavBarSearch.vue"; 37 | import { default as default13 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPSocialLink.vue"; 38 | import { default as default14 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPSocialLinks.vue"; 39 | import { default as default15 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPSponsors.vue"; 40 | import { default as default16 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue"; 41 | import { default as default17 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue"; 42 | import { default as default18 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue"; 43 | import { default as default19 } from "/home/turtle/Desktop/PrivacyActivistKit/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue"; 44 | 45 | // node_modules/vitepress/dist/client/theme-default/composables/local-nav.js 46 | import { onContentUpdated } from "vitepress"; 47 | 48 | // node_modules/vitepress/dist/client/theme-default/composables/outline.js 49 | import { getScrollOffset } from "vitepress"; 50 | 51 | // node_modules/vitepress/dist/client/theme-default/support/utils.js 52 | import { withBase } from "vitepress"; 53 | 54 | // node_modules/vitepress/dist/client/theme-default/composables/data.js 55 | import { useData as useData$ } from "vitepress"; 56 | var useData = useData$; 57 | 58 | // node_modules/vitepress/dist/client/theme-default/support/utils.js 59 | function ensureStartingSlash(path) { 60 | return path.startsWith("/") ? path : `/${path}`; 61 | } 62 | 63 | // node_modules/vitepress/dist/client/theme-default/support/sidebar.js 64 | function getSidebar(_sidebar, path) { 65 | if (Array.isArray(_sidebar)) 66 | return addBase(_sidebar); 67 | if (_sidebar == null) 68 | return []; 69 | path = ensureStartingSlash(path); 70 | const dir = Object.keys(_sidebar).sort((a, b) => { 71 | return b.split("/").length - a.split("/").length; 72 | }).find((dir2) => { 73 | return path.startsWith(ensureStartingSlash(dir2)); 74 | }); 75 | const sidebar = dir ? _sidebar[dir] : []; 76 | return Array.isArray(sidebar) ? addBase(sidebar) : addBase(sidebar.items, sidebar.base); 77 | } 78 | function getSidebarGroups(sidebar) { 79 | const groups = []; 80 | let lastGroupIndex = 0; 81 | for (const index in sidebar) { 82 | const item = sidebar[index]; 83 | if (item.items) { 84 | lastGroupIndex = groups.push(item); 85 | continue; 86 | } 87 | if (!groups[lastGroupIndex]) { 88 | groups.push({ items: [] }); 89 | } 90 | groups[lastGroupIndex].items.push(item); 91 | } 92 | return groups; 93 | } 94 | function addBase(items, _base) { 95 | return [...items].map((_item) => { 96 | const item = { ..._item }; 97 | const base = item.base || _base; 98 | if (base && item.link) 99 | item.link = base + item.link; 100 | if (item.items) 101 | item.items = addBase(item.items, base); 102 | return item; 103 | }); 104 | } 105 | 106 | // node_modules/vitepress/dist/client/theme-default/composables/sidebar.js 107 | function useSidebar() { 108 | const { frontmatter, page, theme: theme2 } = useData(); 109 | const is960 = useMediaQuery("(min-width: 960px)"); 110 | const isOpen = ref(false); 111 | const _sidebar = computed(() => { 112 | const sidebarConfig = theme2.value.sidebar; 113 | const relativePath = page.value.relativePath; 114 | return sidebarConfig ? getSidebar(sidebarConfig, relativePath) : []; 115 | }); 116 | const sidebar = ref(_sidebar.value); 117 | watch(_sidebar, (next, prev) => { 118 | if (JSON.stringify(next) !== JSON.stringify(prev)) 119 | sidebar.value = _sidebar.value; 120 | }); 121 | const hasSidebar = computed(() => { 122 | return frontmatter.value.sidebar !== false && sidebar.value.length > 0 && frontmatter.value.layout !== "home"; 123 | }); 124 | const leftAside = computed(() => { 125 | if (hasAside) 126 | return frontmatter.value.aside == null ? theme2.value.aside === "left" : frontmatter.value.aside === "left"; 127 | return false; 128 | }); 129 | const hasAside = computed(() => { 130 | if (frontmatter.value.layout === "home") 131 | return false; 132 | if (frontmatter.value.aside != null) 133 | return !!frontmatter.value.aside; 134 | return theme2.value.aside !== false; 135 | }); 136 | const isSidebarEnabled = computed(() => hasSidebar.value && is960.value); 137 | const sidebarGroups = computed(() => { 138 | return hasSidebar.value ? getSidebarGroups(sidebar.value) : []; 139 | }); 140 | function open() { 141 | isOpen.value = true; 142 | } 143 | function close() { 144 | isOpen.value = false; 145 | } 146 | function toggle() { 147 | isOpen.value ? close() : open(); 148 | } 149 | return { 150 | isOpen, 151 | sidebar, 152 | sidebarGroups, 153 | hasSidebar, 154 | hasAside, 155 | leftAside, 156 | isSidebarEnabled, 157 | open, 158 | close, 159 | toggle 160 | }; 161 | } 162 | 163 | // node_modules/vitepress/dist/client/theme-default/composables/outline.js 164 | var ignoreRE = /\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/; 165 | var resolvedHeaders = []; 166 | function getHeaders(range) { 167 | const headers = [ 168 | ...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)") 169 | ].filter((el) => el.id && el.hasChildNodes()).map((el) => { 170 | const level = Number(el.tagName[1]); 171 | return { 172 | element: el, 173 | title: serializeHeader(el), 174 | link: "#" + el.id, 175 | level 176 | }; 177 | }); 178 | return resolveHeaders(headers, range); 179 | } 180 | function serializeHeader(h) { 181 | let ret = ""; 182 | for (const node of h.childNodes) { 183 | if (node.nodeType === 1) { 184 | if (ignoreRE.test(node.className)) 185 | continue; 186 | ret += node.textContent; 187 | } else if (node.nodeType === 3) { 188 | ret += node.textContent; 189 | } 190 | } 191 | return ret.trim(); 192 | } 193 | function resolveHeaders(headers, range) { 194 | if (range === false) { 195 | return []; 196 | } 197 | const levelsRange = (typeof range === "object" && !Array.isArray(range) ? range.level : range) || 2; 198 | const [high, low] = typeof levelsRange === "number" ? [levelsRange, levelsRange] : levelsRange === "deep" ? [2, 6] : levelsRange; 199 | return buildTree(headers, high, low); 200 | } 201 | function buildTree(data, min, max) { 202 | resolvedHeaders.length = 0; 203 | const result = []; 204 | const stack = []; 205 | data.forEach((item) => { 206 | const node = { ...item, children: [] }; 207 | let parent = stack[stack.length - 1]; 208 | while (parent && parent.level >= node.level) { 209 | stack.pop(); 210 | parent = stack[stack.length - 1]; 211 | } 212 | if (node.element.classList.contains("ignore-header") || parent && "shouldIgnore" in parent) { 213 | stack.push({ level: node.level, shouldIgnore: true }); 214 | return; 215 | } 216 | if (node.level > max || node.level < min) 217 | return; 218 | resolvedHeaders.push({ element: node.element, link: node.link }); 219 | if (parent) 220 | parent.children.push(node); 221 | else 222 | result.push(node); 223 | stack.push(node); 224 | }); 225 | return result; 226 | } 227 | 228 | // node_modules/vitepress/dist/client/theme-default/composables/local-nav.js 229 | function useLocalNav() { 230 | const { theme: theme2, frontmatter } = useData(); 231 | const headers = shallowRef([]); 232 | const hasLocalNav = computed(() => { 233 | return headers.value.length > 0; 234 | }); 235 | onContentUpdated(() => { 236 | headers.value = getHeaders(frontmatter.value.outline ?? theme2.value.outline); 237 | }); 238 | return { 239 | headers, 240 | hasLocalNav 241 | }; 242 | } 243 | 244 | // node_modules/vitepress/dist/client/theme-default/without-fonts.js 245 | var theme = { 246 | Layout, 247 | enhanceApp: ({ app }) => { 248 | app.component("Badge", VPBadge); 249 | } 250 | }; 251 | var without_fonts_default = theme; 252 | export { 253 | default2 as VPBadge, 254 | default3 as VPButton, 255 | default4 as VPDocAsideSponsors, 256 | default5 as VPFeatures, 257 | default6 as VPHomeContent, 258 | default7 as VPHomeFeatures, 259 | default8 as VPHomeHero, 260 | default9 as VPHomeSponsors, 261 | default10 as VPImage, 262 | default11 as VPLink, 263 | default12 as VPNavBarSearch, 264 | default13 as VPSocialLink, 265 | default14 as VPSocialLinks, 266 | default15 as VPSponsors, 267 | default16 as VPTeamMembers, 268 | default17 as VPTeamPage, 269 | default18 as VPTeamPageSection, 270 | default19 as VPTeamPageTitle, 271 | without_fonts_default as default, 272 | useLocalNav, 273 | useSidebar 274 | }; 275 | //# sourceMappingURL=@theme_index.js.map 276 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vitepress___@vueuse_core.js: -------------------------------------------------------------------------------- 1 | import { 2 | DefaultMagicKeysAliasMap, 3 | StorageSerializers, 4 | TransitionPresets, 5 | assert, 6 | breakpointsAntDesign, 7 | breakpointsBootstrapV5, 8 | breakpointsElement, 9 | breakpointsMasterCss, 10 | breakpointsPrimeFlex, 11 | breakpointsQuasar, 12 | breakpointsSematic, 13 | breakpointsTailwind, 14 | breakpointsVuetify, 15 | breakpointsVuetifyV2, 16 | breakpointsVuetifyV3, 17 | bypassFilter, 18 | camelize, 19 | clamp, 20 | cloneFnJSON, 21 | computedAsync, 22 | computedEager, 23 | computedInject, 24 | computedWithControl, 25 | containsProp, 26 | controlledRef, 27 | createEventHook, 28 | createFetch, 29 | createFilterWrapper, 30 | createGlobalState, 31 | createInjectionState, 32 | createRef, 33 | createReusableTemplate, 34 | createSharedComposable, 35 | createSingletonPromise, 36 | createTemplatePromise, 37 | createUnrefFn, 38 | customStorageEventName, 39 | debounceFilter, 40 | defaultDocument, 41 | defaultLocation, 42 | defaultNavigator, 43 | defaultWindow, 44 | executeTransition, 45 | extendRef, 46 | formatDate, 47 | formatTimeAgo, 48 | get, 49 | getLifeCycleTarget, 50 | getSSRHandler, 51 | hasOwn, 52 | hyphenate, 53 | identity, 54 | increaseWithUnit, 55 | injectLocal, 56 | invoke, 57 | isClient, 58 | isDef, 59 | isDefined, 60 | isIOS, 61 | isObject, 62 | isWorker, 63 | makeDestructurable, 64 | mapGamepadToXbox360Controller, 65 | noop, 66 | normalizeDate, 67 | notNullish, 68 | now, 69 | objectEntries, 70 | objectOmit, 71 | objectPick, 72 | onClickOutside, 73 | onElementRemoval, 74 | onKeyDown, 75 | onKeyPressed, 76 | onKeyStroke, 77 | onKeyUp, 78 | onLongPress, 79 | onStartTyping, 80 | pausableFilter, 81 | promiseTimeout, 82 | provideLocal, 83 | provideSSRWidth, 84 | pxValue, 85 | rand, 86 | reactify, 87 | reactifyObject, 88 | reactiveComputed, 89 | reactiveOmit, 90 | reactivePick, 91 | refAutoReset, 92 | refDebounced, 93 | refDefault, 94 | refThrottled, 95 | refWithControl, 96 | resolveRef, 97 | resolveUnref, 98 | set, 99 | setSSRHandler, 100 | syncRef, 101 | syncRefs, 102 | templateRef, 103 | throttleFilter, 104 | timestamp, 105 | toArray, 106 | toReactive, 107 | toRef, 108 | toRefs, 109 | toValue, 110 | tryOnBeforeMount, 111 | tryOnBeforeUnmount, 112 | tryOnMounted, 113 | tryOnScopeDispose, 114 | tryOnUnmounted, 115 | unrefElement, 116 | until, 117 | useActiveElement, 118 | useAnimate, 119 | useArrayDifference, 120 | useArrayEvery, 121 | useArrayFilter, 122 | useArrayFind, 123 | useArrayFindIndex, 124 | useArrayFindLast, 125 | useArrayIncludes, 126 | useArrayJoin, 127 | useArrayMap, 128 | useArrayReduce, 129 | useArraySome, 130 | useArrayUnique, 131 | useAsyncQueue, 132 | useAsyncState, 133 | useBase64, 134 | useBattery, 135 | useBluetooth, 136 | useBreakpoints, 137 | useBroadcastChannel, 138 | useBrowserLocation, 139 | useCached, 140 | useClipboard, 141 | useClipboardItems, 142 | useCloned, 143 | useColorMode, 144 | useConfirmDialog, 145 | useCountdown, 146 | useCounter, 147 | useCssVar, 148 | useCurrentElement, 149 | useCycleList, 150 | useDark, 151 | useDateFormat, 152 | useDebounceFn, 153 | useDebouncedRefHistory, 154 | useDeviceMotion, 155 | useDeviceOrientation, 156 | useDevicePixelRatio, 157 | useDevicesList, 158 | useDisplayMedia, 159 | useDocumentVisibility, 160 | useDraggable, 161 | useDropZone, 162 | useElementBounding, 163 | useElementByPoint, 164 | useElementHover, 165 | useElementSize, 166 | useElementVisibility, 167 | useEventBus, 168 | useEventListener, 169 | useEventSource, 170 | useEyeDropper, 171 | useFavicon, 172 | useFetch, 173 | useFileDialog, 174 | useFileSystemAccess, 175 | useFocus, 176 | useFocusWithin, 177 | useFps, 178 | useFullscreen, 179 | useGamepad, 180 | useGeolocation, 181 | useIdle, 182 | useImage, 183 | useInfiniteScroll, 184 | useIntersectionObserver, 185 | useInterval, 186 | useIntervalFn, 187 | useKeyModifier, 188 | useLastChanged, 189 | useLocalStorage, 190 | useMagicKeys, 191 | useManualRefHistory, 192 | useMediaControls, 193 | useMediaQuery, 194 | useMemoize, 195 | useMemory, 196 | useMounted, 197 | useMouse, 198 | useMouseInElement, 199 | useMousePressed, 200 | useMutationObserver, 201 | useNavigatorLanguage, 202 | useNetwork, 203 | useNow, 204 | useObjectUrl, 205 | useOffsetPagination, 206 | useOnline, 207 | usePageLeave, 208 | useParallax, 209 | useParentElement, 210 | usePerformanceObserver, 211 | usePermission, 212 | usePointer, 213 | usePointerLock, 214 | usePointerSwipe, 215 | usePreferredColorScheme, 216 | usePreferredContrast, 217 | usePreferredDark, 218 | usePreferredLanguages, 219 | usePreferredReducedMotion, 220 | usePreferredReducedTransparency, 221 | usePrevious, 222 | useRafFn, 223 | useRefHistory, 224 | useResizeObserver, 225 | useSSRWidth, 226 | useScreenOrientation, 227 | useScreenSafeArea, 228 | useScriptTag, 229 | useScroll, 230 | useScrollLock, 231 | useSessionStorage, 232 | useShare, 233 | useSorted, 234 | useSpeechRecognition, 235 | useSpeechSynthesis, 236 | useStepper, 237 | useStorage, 238 | useStorageAsync, 239 | useStyleTag, 240 | useSupported, 241 | useSwipe, 242 | useTemplateRefsList, 243 | useTextDirection, 244 | useTextSelection, 245 | useTextareaAutosize, 246 | useThrottleFn, 247 | useThrottledRefHistory, 248 | useTimeAgo, 249 | useTimeout, 250 | useTimeoutFn, 251 | useTimeoutPoll, 252 | useTimestamp, 253 | useTitle, 254 | useToNumber, 255 | useToString, 256 | useToggle, 257 | useTransition, 258 | useUrlSearchParams, 259 | useUserMedia, 260 | useVModel, 261 | useVModels, 262 | useVibrate, 263 | useVirtualList, 264 | useWakeLock, 265 | useWebNotification, 266 | useWebSocket, 267 | useWebWorker, 268 | useWebWorkerFn, 269 | useWindowFocus, 270 | useWindowScroll, 271 | useWindowSize, 272 | watchArray, 273 | watchAtMost, 274 | watchDebounced, 275 | watchDeep, 276 | watchIgnorable, 277 | watchImmediate, 278 | watchOnce, 279 | watchPausable, 280 | watchThrottled, 281 | watchTriggerable, 282 | watchWithFilter, 283 | whenever 284 | } from "./chunk-3GYA4YLH.js"; 285 | import "./chunk-DDXJJ377.js"; 286 | export { 287 | DefaultMagicKeysAliasMap, 288 | StorageSerializers, 289 | TransitionPresets, 290 | assert, 291 | computedAsync as asyncComputed, 292 | refAutoReset as autoResetRef, 293 | breakpointsAntDesign, 294 | breakpointsBootstrapV5, 295 | breakpointsElement, 296 | breakpointsMasterCss, 297 | breakpointsPrimeFlex, 298 | breakpointsQuasar, 299 | breakpointsSematic, 300 | breakpointsTailwind, 301 | breakpointsVuetify, 302 | breakpointsVuetifyV2, 303 | breakpointsVuetifyV3, 304 | bypassFilter, 305 | camelize, 306 | clamp, 307 | cloneFnJSON, 308 | computedAsync, 309 | computedEager, 310 | computedInject, 311 | computedWithControl, 312 | containsProp, 313 | computedWithControl as controlledComputed, 314 | controlledRef, 315 | createEventHook, 316 | createFetch, 317 | createFilterWrapper, 318 | createGlobalState, 319 | createInjectionState, 320 | reactify as createReactiveFn, 321 | createRef, 322 | createReusableTemplate, 323 | createSharedComposable, 324 | createSingletonPromise, 325 | createTemplatePromise, 326 | createUnrefFn, 327 | customStorageEventName, 328 | debounceFilter, 329 | refDebounced as debouncedRef, 330 | watchDebounced as debouncedWatch, 331 | defaultDocument, 332 | defaultLocation, 333 | defaultNavigator, 334 | defaultWindow, 335 | computedEager as eagerComputed, 336 | executeTransition, 337 | extendRef, 338 | formatDate, 339 | formatTimeAgo, 340 | get, 341 | getLifeCycleTarget, 342 | getSSRHandler, 343 | hasOwn, 344 | hyphenate, 345 | identity, 346 | watchIgnorable as ignorableWatch, 347 | increaseWithUnit, 348 | injectLocal, 349 | invoke, 350 | isClient, 351 | isDef, 352 | isDefined, 353 | isIOS, 354 | isObject, 355 | isWorker, 356 | makeDestructurable, 357 | mapGamepadToXbox360Controller, 358 | noop, 359 | normalizeDate, 360 | notNullish, 361 | now, 362 | objectEntries, 363 | objectOmit, 364 | objectPick, 365 | onClickOutside, 366 | onElementRemoval, 367 | onKeyDown, 368 | onKeyPressed, 369 | onKeyStroke, 370 | onKeyUp, 371 | onLongPress, 372 | onStartTyping, 373 | pausableFilter, 374 | watchPausable as pausableWatch, 375 | promiseTimeout, 376 | provideLocal, 377 | provideSSRWidth, 378 | pxValue, 379 | rand, 380 | reactify, 381 | reactifyObject, 382 | reactiveComputed, 383 | reactiveOmit, 384 | reactivePick, 385 | refAutoReset, 386 | refDebounced, 387 | refDefault, 388 | refThrottled, 389 | refWithControl, 390 | resolveRef, 391 | resolveUnref, 392 | set, 393 | setSSRHandler, 394 | syncRef, 395 | syncRefs, 396 | templateRef, 397 | throttleFilter, 398 | refThrottled as throttledRef, 399 | watchThrottled as throttledWatch, 400 | timestamp, 401 | toArray, 402 | toReactive, 403 | toRef, 404 | toRefs, 405 | toValue, 406 | tryOnBeforeMount, 407 | tryOnBeforeUnmount, 408 | tryOnMounted, 409 | tryOnScopeDispose, 410 | tryOnUnmounted, 411 | unrefElement, 412 | until, 413 | useActiveElement, 414 | useAnimate, 415 | useArrayDifference, 416 | useArrayEvery, 417 | useArrayFilter, 418 | useArrayFind, 419 | useArrayFindIndex, 420 | useArrayFindLast, 421 | useArrayIncludes, 422 | useArrayJoin, 423 | useArrayMap, 424 | useArrayReduce, 425 | useArraySome, 426 | useArrayUnique, 427 | useAsyncQueue, 428 | useAsyncState, 429 | useBase64, 430 | useBattery, 431 | useBluetooth, 432 | useBreakpoints, 433 | useBroadcastChannel, 434 | useBrowserLocation, 435 | useCached, 436 | useClipboard, 437 | useClipboardItems, 438 | useCloned, 439 | useColorMode, 440 | useConfirmDialog, 441 | useCountdown, 442 | useCounter, 443 | useCssVar, 444 | useCurrentElement, 445 | useCycleList, 446 | useDark, 447 | useDateFormat, 448 | refDebounced as useDebounce, 449 | useDebounceFn, 450 | useDebouncedRefHistory, 451 | useDeviceMotion, 452 | useDeviceOrientation, 453 | useDevicePixelRatio, 454 | useDevicesList, 455 | useDisplayMedia, 456 | useDocumentVisibility, 457 | useDraggable, 458 | useDropZone, 459 | useElementBounding, 460 | useElementByPoint, 461 | useElementHover, 462 | useElementSize, 463 | useElementVisibility, 464 | useEventBus, 465 | useEventListener, 466 | useEventSource, 467 | useEyeDropper, 468 | useFavicon, 469 | useFetch, 470 | useFileDialog, 471 | useFileSystemAccess, 472 | useFocus, 473 | useFocusWithin, 474 | useFps, 475 | useFullscreen, 476 | useGamepad, 477 | useGeolocation, 478 | useIdle, 479 | useImage, 480 | useInfiniteScroll, 481 | useIntersectionObserver, 482 | useInterval, 483 | useIntervalFn, 484 | useKeyModifier, 485 | useLastChanged, 486 | useLocalStorage, 487 | useMagicKeys, 488 | useManualRefHistory, 489 | useMediaControls, 490 | useMediaQuery, 491 | useMemoize, 492 | useMemory, 493 | useMounted, 494 | useMouse, 495 | useMouseInElement, 496 | useMousePressed, 497 | useMutationObserver, 498 | useNavigatorLanguage, 499 | useNetwork, 500 | useNow, 501 | useObjectUrl, 502 | useOffsetPagination, 503 | useOnline, 504 | usePageLeave, 505 | useParallax, 506 | useParentElement, 507 | usePerformanceObserver, 508 | usePermission, 509 | usePointer, 510 | usePointerLock, 511 | usePointerSwipe, 512 | usePreferredColorScheme, 513 | usePreferredContrast, 514 | usePreferredDark, 515 | usePreferredLanguages, 516 | usePreferredReducedMotion, 517 | usePreferredReducedTransparency, 518 | usePrevious, 519 | useRafFn, 520 | useRefHistory, 521 | useResizeObserver, 522 | useSSRWidth, 523 | useScreenOrientation, 524 | useScreenSafeArea, 525 | useScriptTag, 526 | useScroll, 527 | useScrollLock, 528 | useSessionStorage, 529 | useShare, 530 | useSorted, 531 | useSpeechRecognition, 532 | useSpeechSynthesis, 533 | useStepper, 534 | useStorage, 535 | useStorageAsync, 536 | useStyleTag, 537 | useSupported, 538 | useSwipe, 539 | useTemplateRefsList, 540 | useTextDirection, 541 | useTextSelection, 542 | useTextareaAutosize, 543 | refThrottled as useThrottle, 544 | useThrottleFn, 545 | useThrottledRefHistory, 546 | useTimeAgo, 547 | useTimeout, 548 | useTimeoutFn, 549 | useTimeoutPoll, 550 | useTimestamp, 551 | useTitle, 552 | useToNumber, 553 | useToString, 554 | useToggle, 555 | useTransition, 556 | useUrlSearchParams, 557 | useUserMedia, 558 | useVModel, 559 | useVModels, 560 | useVibrate, 561 | useVirtualList, 562 | useWakeLock, 563 | useWebNotification, 564 | useWebSocket, 565 | useWebWorker, 566 | useWebWorkerFn, 567 | useWindowFocus, 568 | useWindowScroll, 569 | useWindowSize, 570 | watchArray, 571 | watchAtMost, 572 | watchDebounced, 573 | watchDeep, 574 | watchIgnorable, 575 | watchImmediate, 576 | watchOnce, 577 | watchPausable, 578 | watchThrottled, 579 | watchTriggerable, 580 | watchWithFilter, 581 | whenever 582 | }; 583 | //# sourceMappingURL=vitepress___@vueuse_core.js.map 584 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/@theme_index.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": ["../../../../node_modules/vitepress/dist/client/theme-default/index.js", "../../../../node_modules/vitepress/dist/client/theme-default/without-fonts.js", "../../../../node_modules/vitepress/dist/client/theme-default/composables/local-nav.js", "../../../../node_modules/vitepress/dist/client/theme-default/composables/outline.js", "../../../../node_modules/vitepress/dist/client/theme-default/support/utils.js", "../../../../node_modules/vitepress/dist/client/theme-default/composables/data.js", "../../../../node_modules/vitepress/dist/client/theme-default/support/sidebar.js", "../../../../node_modules/vitepress/dist/client/theme-default/composables/sidebar.js"], 4 | "sourcesContent": ["import './styles/fonts.css';\nexport * from './without-fonts';\nexport { default as default } from './without-fonts';\n", "import './styles/vars.css';\nimport './styles/base.css';\nimport './styles/icons.css';\nimport './styles/utils.css';\nimport './styles/components/custom-block.css';\nimport './styles/components/vp-code.css';\nimport './styles/components/vp-code-group.css';\nimport './styles/components/vp-doc.css';\nimport './styles/components/vp-sponsor.css';\nimport VPBadge from './components/VPBadge.vue';\nimport Layout from './Layout.vue';\nexport { default as VPBadge } from './components/VPBadge.vue';\nexport { default as VPButton } from './components/VPButton.vue';\nexport { default as VPDocAsideSponsors } from './components/VPDocAsideSponsors.vue';\nexport { default as VPFeatures } from './components/VPFeatures.vue';\nexport { default as VPHomeContent } from './components/VPHomeContent.vue';\nexport { default as VPHomeFeatures } from './components/VPHomeFeatures.vue';\nexport { default as VPHomeHero } from './components/VPHomeHero.vue';\nexport { default as VPHomeSponsors } from './components/VPHomeSponsors.vue';\nexport { default as VPImage } from './components/VPImage.vue';\nexport { default as VPLink } from './components/VPLink.vue';\nexport { default as VPNavBarSearch } from './components/VPNavBarSearch.vue';\nexport { default as VPSocialLink } from './components/VPSocialLink.vue';\nexport { default as VPSocialLinks } from './components/VPSocialLinks.vue';\nexport { default as VPSponsors } from './components/VPSponsors.vue';\nexport { default as VPTeamMembers } from './components/VPTeamMembers.vue';\nexport { default as VPTeamPage } from './components/VPTeamPage.vue';\nexport { default as VPTeamPageSection } from './components/VPTeamPageSection.vue';\nexport { default as VPTeamPageTitle } from './components/VPTeamPageTitle.vue';\nexport { useLocalNav } from './composables/local-nav';\nexport { useSidebar } from './composables/sidebar';\nconst theme = {\n Layout,\n enhanceApp: ({ app }) => {\n app.component('Badge', VPBadge);\n }\n};\nexport default theme;\n", "import { onContentUpdated } from 'vitepress';\nimport { computed, shallowRef } from 'vue';\nimport { getHeaders } from '../composables/outline';\nimport { useData } from './data';\nexport function useLocalNav() {\n const { theme, frontmatter } = useData();\n const headers = shallowRef([]);\n const hasLocalNav = computed(() => {\n return headers.value.length > 0;\n });\n onContentUpdated(() => {\n headers.value = getHeaders(frontmatter.value.outline ?? theme.value.outline);\n });\n return {\n headers,\n hasLocalNav\n };\n}\n", "import { getScrollOffset } from 'vitepress';\nimport { onMounted, onUnmounted, onUpdated } from 'vue';\nimport { throttleAndDebounce } from '../support/utils';\nimport { useAside } from './aside';\nconst ignoreRE = /\\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\\b/;\n// cached list of anchor elements from resolveHeaders\nconst resolvedHeaders = [];\nexport function resolveTitle(theme) {\n return ((typeof theme.outline === 'object' &&\n !Array.isArray(theme.outline) &&\n theme.outline.label) ||\n theme.outlineTitle ||\n 'On this page');\n}\nexport function getHeaders(range) {\n const headers = [\n ...document.querySelectorAll('.VPDoc :where(h1,h2,h3,h4,h5,h6)')\n ]\n .filter((el) => el.id && el.hasChildNodes())\n .map((el) => {\n const level = Number(el.tagName[1]);\n return {\n element: el,\n title: serializeHeader(el),\n link: '#' + el.id,\n level\n };\n });\n return resolveHeaders(headers, range);\n}\nfunction serializeHeader(h) {\n let ret = '';\n for (const node of h.childNodes) {\n if (node.nodeType === 1) {\n if (ignoreRE.test(node.className))\n continue;\n ret += node.textContent;\n }\n else if (node.nodeType === 3) {\n ret += node.textContent;\n }\n }\n return ret.trim();\n}\nexport function resolveHeaders(headers, range) {\n if (range === false) {\n return [];\n }\n const levelsRange = (typeof range === 'object' && !Array.isArray(range)\n ? range.level\n : range) || 2;\n const [high, low] = typeof levelsRange === 'number'\n ? [levelsRange, levelsRange]\n : levelsRange === 'deep'\n ? [2, 6]\n : levelsRange;\n return buildTree(headers, high, low);\n}\nexport function useActiveAnchor(container, marker) {\n const { isAsideEnabled } = useAside();\n const onScroll = throttleAndDebounce(setActiveLink, 100);\n let prevActiveLink = null;\n onMounted(() => {\n requestAnimationFrame(setActiveLink);\n window.addEventListener('scroll', onScroll);\n });\n onUpdated(() => {\n // sidebar update means a route change\n activateLink(location.hash);\n });\n onUnmounted(() => {\n window.removeEventListener('scroll', onScroll);\n });\n function setActiveLink() {\n if (!isAsideEnabled.value) {\n return;\n }\n const scrollY = window.scrollY;\n const innerHeight = window.innerHeight;\n const offsetHeight = document.body.offsetHeight;\n const isBottom = Math.abs(scrollY + innerHeight - offsetHeight) < 1;\n // resolvedHeaders may be repositioned, hidden or fix positioned\n const headers = resolvedHeaders\n .map(({ element, link }) => ({\n link,\n top: getAbsoluteTop(element)\n }))\n .filter(({ top }) => !Number.isNaN(top))\n .sort((a, b) => a.top - b.top);\n // no headers available for active link\n if (!headers.length) {\n activateLink(null);\n return;\n }\n // page top\n if (scrollY < 1) {\n activateLink(null);\n return;\n }\n // page bottom - highlight last link\n if (isBottom) {\n activateLink(headers[headers.length - 1].link);\n return;\n }\n // find the last header above the top of viewport\n let activeLink = null;\n for (const { link, top } of headers) {\n if (top > scrollY + getScrollOffset() + 4) {\n break;\n }\n activeLink = link;\n }\n activateLink(activeLink);\n }\n function activateLink(hash) {\n if (prevActiveLink) {\n prevActiveLink.classList.remove('active');\n }\n if (hash == null) {\n prevActiveLink = null;\n }\n else {\n prevActiveLink = container.value.querySelector(`a[href=\"${decodeURIComponent(hash)}\"]`);\n }\n const activeLink = prevActiveLink;\n if (activeLink) {\n activeLink.classList.add('active');\n marker.value.style.top = activeLink.offsetTop + 39 + 'px';\n marker.value.style.opacity = '1';\n }\n else {\n marker.value.style.top = '33px';\n marker.value.style.opacity = '0';\n }\n }\n}\nfunction getAbsoluteTop(element) {\n let offsetTop = 0;\n while (element !== document.body) {\n if (element === null) {\n // child element is:\n // - not attached to the DOM (display: none)\n // - set to fixed position (not scrollable)\n // - body or html element (null offsetParent)\n return NaN;\n }\n offsetTop += element.offsetTop;\n element = element.offsetParent;\n }\n return offsetTop;\n}\nfunction buildTree(data, min, max) {\n resolvedHeaders.length = 0;\n const result = [];\n const stack = [];\n data.forEach((item) => {\n const node = { ...item, children: [] };\n let parent = stack[stack.length - 1];\n while (parent && parent.level >= node.level) {\n stack.pop();\n parent = stack[stack.length - 1];\n }\n if (node.element.classList.contains('ignore-header') ||\n (parent && 'shouldIgnore' in parent)) {\n stack.push({ level: node.level, shouldIgnore: true });\n return;\n }\n if (node.level > max || node.level < min)\n return;\n resolvedHeaders.push({ element: node.element, link: node.link });\n if (parent)\n parent.children.push(node);\n else\n result.push(node);\n stack.push(node);\n });\n return result;\n}\n", "import { withBase } from 'vitepress';\nimport { isExternal, treatAsHtml } from '../../shared';\nimport { useData } from '../composables/data';\nexport function throttleAndDebounce(fn, delay) {\n let timeoutId;\n let called = false;\n return () => {\n if (timeoutId)\n clearTimeout(timeoutId);\n if (!called) {\n fn();\n (called = true) && setTimeout(() => (called = false), delay);\n }\n else\n timeoutId = setTimeout(fn, delay);\n };\n}\nexport function ensureStartingSlash(path) {\n return path.startsWith('/') ? path : `/${path}`;\n}\nexport function normalizeLink(url) {\n const { pathname, search, hash, protocol } = new URL(url, 'http://a.com');\n if (isExternal(url) ||\n url.startsWith('#') ||\n !protocol.startsWith('http') ||\n !treatAsHtml(pathname))\n return url;\n const { site } = useData();\n const normalizedPath = pathname.endsWith('/') || pathname.endsWith('.html')\n ? url\n : url.replace(/(?:(^\\.+)\\/)?.*$/, `$1${pathname.replace(/(\\.md)?$/, site.value.cleanUrls ? '' : '.html')}${search}${hash}`);\n return withBase(normalizedPath);\n}\n", "import { useData as useData$ } from 'vitepress';\nexport const useData = useData$;\n", "import { isActive } from '../../shared';\nimport { ensureStartingSlash } from './utils';\n/**\n * Get the `Sidebar` from sidebar option. This method will ensure to get correct\n * sidebar config from `MultiSideBarConfig` with various path combinations such\n * as matching `guide/` and `/guide/`. If no matching config was found, it will\n * return empty array.\n */\nexport function getSidebar(_sidebar, path) {\n if (Array.isArray(_sidebar))\n return addBase(_sidebar);\n if (_sidebar == null)\n return [];\n path = ensureStartingSlash(path);\n const dir = Object.keys(_sidebar)\n .sort((a, b) => {\n return b.split('/').length - a.split('/').length;\n })\n .find((dir) => {\n // make sure the multi sidebar key starts with slash too\n return path.startsWith(ensureStartingSlash(dir));\n });\n const sidebar = dir ? _sidebar[dir] : [];\n return Array.isArray(sidebar)\n ? addBase(sidebar)\n : addBase(sidebar.items, sidebar.base);\n}\n/**\n * Get or generate sidebar group from the given sidebar items.\n */\nexport function getSidebarGroups(sidebar) {\n const groups = [];\n let lastGroupIndex = 0;\n for (const index in sidebar) {\n const item = sidebar[index];\n if (item.items) {\n lastGroupIndex = groups.push(item);\n continue;\n }\n if (!groups[lastGroupIndex]) {\n groups.push({ items: [] });\n }\n groups[lastGroupIndex].items.push(item);\n }\n return groups;\n}\nexport function getFlatSideBarLinks(sidebar) {\n const links = [];\n function recursivelyExtractLinks(items) {\n for (const item of items) {\n if (item.text && item.link) {\n links.push({\n text: item.text,\n link: item.link,\n docFooterText: item.docFooterText\n });\n }\n if (item.items) {\n recursivelyExtractLinks(item.items);\n }\n }\n }\n recursivelyExtractLinks(sidebar);\n return links;\n}\n/**\n * Check if the given sidebar item contains any active link.\n */\nexport function hasActiveLink(path, items) {\n if (Array.isArray(items)) {\n return items.some((item) => hasActiveLink(path, item));\n }\n return isActive(path, items.link)\n ? true\n : items.items\n ? hasActiveLink(path, items.items)\n : false;\n}\nfunction addBase(items, _base) {\n return [...items].map((_item) => {\n const item = { ..._item };\n const base = item.base || _base;\n if (base && item.link)\n item.link = base + item.link;\n if (item.items)\n item.items = addBase(item.items, base);\n return item;\n });\n}\n", "import { useMediaQuery } from '@vueuse/core';\nimport { computed, onMounted, onUnmounted, ref, watch, watchEffect, watchPostEffect } from 'vue';\nimport { isActive } from '../../shared';\nimport { hasActiveLink as containsActiveLink, getSidebar, getSidebarGroups } from '../support/sidebar';\nimport { useData } from './data';\nexport function useSidebar() {\n const { frontmatter, page, theme } = useData();\n const is960 = useMediaQuery('(min-width: 960px)');\n const isOpen = ref(false);\n const _sidebar = computed(() => {\n const sidebarConfig = theme.value.sidebar;\n const relativePath = page.value.relativePath;\n return sidebarConfig ? getSidebar(sidebarConfig, relativePath) : [];\n });\n const sidebar = ref(_sidebar.value);\n watch(_sidebar, (next, prev) => {\n if (JSON.stringify(next) !== JSON.stringify(prev))\n sidebar.value = _sidebar.value;\n });\n const hasSidebar = computed(() => {\n return (frontmatter.value.sidebar !== false &&\n sidebar.value.length > 0 &&\n frontmatter.value.layout !== 'home');\n });\n const leftAside = computed(() => {\n if (hasAside)\n return frontmatter.value.aside == null\n ? theme.value.aside === 'left'\n : frontmatter.value.aside === 'left';\n return false;\n });\n const hasAside = computed(() => {\n if (frontmatter.value.layout === 'home')\n return false;\n if (frontmatter.value.aside != null)\n return !!frontmatter.value.aside;\n return theme.value.aside !== false;\n });\n const isSidebarEnabled = computed(() => hasSidebar.value && is960.value);\n const sidebarGroups = computed(() => {\n return hasSidebar.value ? getSidebarGroups(sidebar.value) : [];\n });\n function open() {\n isOpen.value = true;\n }\n function close() {\n isOpen.value = false;\n }\n function toggle() {\n isOpen.value ? close() : open();\n }\n return {\n isOpen,\n sidebar,\n sidebarGroups,\n hasSidebar,\n hasAside,\n leftAside,\n isSidebarEnabled,\n open,\n close,\n toggle\n };\n}\n/**\n * a11y: cache the element that opened the Sidebar (the menu button) then\n * focus that button again when Menu is closed with Escape key.\n */\nexport function useCloseSidebarOnEscape(isOpen, close) {\n let triggerElement;\n watchEffect(() => {\n triggerElement = isOpen.value\n ? document.activeElement\n : undefined;\n });\n onMounted(() => {\n window.addEventListener('keyup', onEscape);\n });\n onUnmounted(() => {\n window.removeEventListener('keyup', onEscape);\n });\n function onEscape(e) {\n if (e.key === 'Escape' && isOpen.value) {\n close();\n triggerElement?.focus();\n }\n }\n}\nexport function useSidebarControl(item) {\n const { page, hash } = useData();\n const collapsed = ref(false);\n const collapsible = computed(() => {\n return item.value.collapsed != null;\n });\n const isLink = computed(() => {\n return !!item.value.link;\n });\n const isActiveLink = ref(false);\n const updateIsActiveLink = () => {\n isActiveLink.value = isActive(page.value.relativePath, item.value.link);\n };\n watch([page, item, hash], updateIsActiveLink);\n onMounted(updateIsActiveLink);\n const hasActiveLink = computed(() => {\n if (isActiveLink.value) {\n return true;\n }\n return item.value.items\n ? containsActiveLink(page.value.relativePath, item.value.items)\n : false;\n });\n const hasChildren = computed(() => {\n return !!(item.value.items && item.value.items.length);\n });\n watchEffect(() => {\n collapsed.value = !!(collapsible.value && item.value.collapsed);\n });\n watchPostEffect(() => {\n ;\n (isActiveLink.value || hasActiveLink.value) && (collapsed.value = false);\n });\n function toggle() {\n if (collapsible.value) {\n collapsed.value = !collapsed.value;\n }\n }\n return {\n collapsed,\n collapsible,\n isLink,\n isActiveLink,\n hasActiveLink,\n hasChildren,\n toggle\n };\n}\n"], 5 | "mappings": ";;;;;;;;;;;AAAA,OAAO;;;ACAP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO,aAAa;AACpB,OAAO,YAAY;AACnB,SAAoB,WAAXA,gBAA0B;AACnC,SAAoB,WAAXA,gBAA2B;AACpC,SAAoB,WAAXA,gBAAqC;AAC9C,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAgC;AACzC,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,iBAA0B;AACnC,SAAoB,WAAXA,iBAAyB;AAClC,SAAoB,WAAXA,iBAAiC;AAC1C,SAAoB,WAAXA,iBAA+B;AACxC,SAAoB,WAAXA,iBAAgC;AACzC,SAAoB,WAAXA,iBAA6B;AACtC,SAAoB,WAAXA,iBAAgC;AACzC,SAAoB,WAAXA,iBAA6B;AACtC,SAAoB,WAAXA,iBAAoC;AAC7C,SAAoB,WAAXA,iBAAkC;;;AC5B3C,SAAS,wBAAwB;;;ACAjC,SAAS,uBAAuB;;;ACAhC,SAAS,gBAAgB;;;ACAzB,SAAS,WAAW,gBAAgB;AAC7B,IAAM,UAAU;;;ADgBhB,SAAS,oBAAoB,MAAM;AACtC,SAAO,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AACjD;;;AEXO,SAAS,WAAW,UAAU,MAAM;AACvC,MAAI,MAAM,QAAQ,QAAQ;AACtB,WAAO,QAAQ,QAAQ;AAC3B,MAAI,YAAY;AACZ,WAAO,CAAC;AACZ,SAAO,oBAAoB,IAAI;AAC/B,QAAM,MAAM,OAAO,KAAK,QAAQ,EAC3B,KAAK,CAAC,GAAG,MAAM;AAChB,WAAO,EAAE,MAAM,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,EAAE;AAAA,EAC9C,CAAC,EACI,KAAK,CAACC,SAAQ;AAEf,WAAO,KAAK,WAAW,oBAAoBA,IAAG,CAAC;AAAA,EACnD,CAAC;AACD,QAAM,UAAU,MAAM,SAAS,GAAG,IAAI,CAAC;AACvC,SAAO,MAAM,QAAQ,OAAO,IACtB,QAAQ,OAAO,IACf,QAAQ,QAAQ,OAAO,QAAQ,IAAI;AAC7C;AAIO,SAAS,iBAAiB,SAAS;AACtC,QAAM,SAAS,CAAC;AAChB,MAAI,iBAAiB;AACrB,aAAW,SAAS,SAAS;AACzB,UAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,KAAK,OAAO;AACZ,uBAAiB,OAAO,KAAK,IAAI;AACjC;AAAA,IACJ;AACA,QAAI,CAAC,OAAO,cAAc,GAAG;AACzB,aAAO,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,IAC7B;AACA,WAAO,cAAc,EAAE,MAAM,KAAK,IAAI;AAAA,EAC1C;AACA,SAAO;AACX;AAiCA,SAAS,QAAQ,OAAO,OAAO;AAC3B,SAAO,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,UAAU;AAC7B,UAAM,OAAO,EAAE,GAAG,MAAM;AACxB,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,QAAQ,KAAK;AACb,WAAK,OAAO,OAAO,KAAK;AAC5B,QAAI,KAAK;AACL,WAAK,QAAQ,QAAQ,KAAK,OAAO,IAAI;AACzC,WAAO;AAAA,EACX,CAAC;AACL;;;ACnFO,SAAS,aAAa;AACzB,QAAM,EAAE,aAAa,MAAM,OAAAC,OAAM,IAAI,QAAQ;AAC7C,QAAM,QAAQ,cAAc,oBAAoB;AAChD,QAAM,SAAS,IAAI,KAAK;AACxB,QAAM,WAAW,SAAS,MAAM;AAC5B,UAAM,gBAAgBA,OAAM,MAAM;AAClC,UAAM,eAAe,KAAK,MAAM;AAChC,WAAO,gBAAgB,WAAW,eAAe,YAAY,IAAI,CAAC;AAAA,EACtE,CAAC;AACD,QAAM,UAAU,IAAI,SAAS,KAAK;AAClC,QAAM,UAAU,CAAC,MAAM,SAAS;AAC5B,QAAI,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,IAAI;AAC5C,cAAQ,QAAQ,SAAS;AAAA,EACjC,CAAC;AACD,QAAM,aAAa,SAAS,MAAM;AAC9B,WAAQ,YAAY,MAAM,YAAY,SAClC,QAAQ,MAAM,SAAS,KACvB,YAAY,MAAM,WAAW;AAAA,EACrC,CAAC;AACD,QAAM,YAAY,SAAS,MAAM;AAC7B,QAAI;AACA,aAAO,YAAY,MAAM,SAAS,OAC5BA,OAAM,MAAM,UAAU,SACtB,YAAY,MAAM,UAAU;AACtC,WAAO;AAAA,EACX,CAAC;AACD,QAAM,WAAW,SAAS,MAAM;AAC5B,QAAI,YAAY,MAAM,WAAW;AAC7B,aAAO;AACX,QAAI,YAAY,MAAM,SAAS;AAC3B,aAAO,CAAC,CAAC,YAAY,MAAM;AAC/B,WAAOA,OAAM,MAAM,UAAU;AAAA,EACjC,CAAC;AACD,QAAM,mBAAmB,SAAS,MAAM,WAAW,SAAS,MAAM,KAAK;AACvE,QAAM,gBAAgB,SAAS,MAAM;AACjC,WAAO,WAAW,QAAQ,iBAAiB,QAAQ,KAAK,IAAI,CAAC;AAAA,EACjE,CAAC;AACD,WAAS,OAAO;AACZ,WAAO,QAAQ;AAAA,EACnB;AACA,WAAS,QAAQ;AACb,WAAO,QAAQ;AAAA,EACnB;AACA,WAAS,SAAS;AACd,WAAO,QAAQ,MAAM,IAAI,KAAK;AAAA,EAClC;AACA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;AJ3DA,IAAM,WAAW;AAEjB,IAAM,kBAAkB,CAAC;AAQlB,SAAS,WAAW,OAAO;AAC9B,QAAM,UAAU;AAAA,IACZ,GAAG,SAAS,iBAAiB,kCAAkC;AAAA,EACnE,EACK,OAAO,CAAC,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC,EAC1C,IAAI,CAAC,OAAO;AACb,UAAM,QAAQ,OAAO,GAAG,QAAQ,CAAC,CAAC;AAClC,WAAO;AAAA,MACH,SAAS;AAAA,MACT,OAAO,gBAAgB,EAAE;AAAA,MACzB,MAAM,MAAM,GAAG;AAAA,MACf;AAAA,IACJ;AAAA,EACJ,CAAC;AACD,SAAO,eAAe,SAAS,KAAK;AACxC;AACA,SAAS,gBAAgB,GAAG;AACxB,MAAI,MAAM;AACV,aAAW,QAAQ,EAAE,YAAY;AAC7B,QAAI,KAAK,aAAa,GAAG;AACrB,UAAI,SAAS,KAAK,KAAK,SAAS;AAC5B;AACJ,aAAO,KAAK;AAAA,IAChB,WACS,KAAK,aAAa,GAAG;AAC1B,aAAO,KAAK;AAAA,IAChB;AAAA,EACJ;AACA,SAAO,IAAI,KAAK;AACpB;AACO,SAAS,eAAe,SAAS,OAAO;AAC3C,MAAI,UAAU,OAAO;AACjB,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,eAAe,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAChE,MAAM,QACN,UAAU;AAChB,QAAM,CAAC,MAAM,GAAG,IAAI,OAAO,gBAAgB,WACrC,CAAC,aAAa,WAAW,IACzB,gBAAgB,SACZ,CAAC,GAAG,CAAC,IACL;AACV,SAAO,UAAU,SAAS,MAAM,GAAG;AACvC;AA8FA,SAAS,UAAU,MAAM,KAAK,KAAK;AAC/B,kBAAgB,SAAS;AACzB,QAAM,SAAS,CAAC;AAChB,QAAM,QAAQ,CAAC;AACf,OAAK,QAAQ,CAAC,SAAS;AACnB,UAAM,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE;AACrC,QAAI,SAAS,MAAM,MAAM,SAAS,CAAC;AACnC,WAAO,UAAU,OAAO,SAAS,KAAK,OAAO;AACzC,YAAM,IAAI;AACV,eAAS,MAAM,MAAM,SAAS,CAAC;AAAA,IACnC;AACA,QAAI,KAAK,QAAQ,UAAU,SAAS,eAAe,KAC9C,UAAU,kBAAkB,QAAS;AACtC,YAAM,KAAK,EAAE,OAAO,KAAK,OAAO,cAAc,KAAK,CAAC;AACpD;AAAA,IACJ;AACA,QAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ;AACjC;AACJ,oBAAgB,KAAK,EAAE,SAAS,KAAK,SAAS,MAAM,KAAK,KAAK,CAAC;AAC/D,QAAI;AACA,aAAO,SAAS,KAAK,IAAI;AAAA;AAEzB,aAAO,KAAK,IAAI;AACpB,UAAM,KAAK,IAAI;AAAA,EACnB,CAAC;AACD,SAAO;AACX;;;AD7KO,SAAS,cAAc;AAC1B,QAAM,EAAE,OAAAC,QAAO,YAAY,IAAI,QAAQ;AACvC,QAAM,UAAU,WAAW,CAAC,CAAC;AAC7B,QAAM,cAAc,SAAS,MAAM;AAC/B,WAAO,QAAQ,MAAM,SAAS;AAAA,EAClC,CAAC;AACD,mBAAiB,MAAM;AACnB,YAAQ,QAAQ,WAAW,YAAY,MAAM,WAAWA,OAAM,MAAM,OAAO;AAAA,EAC/E,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;;;ADcA,IAAM,QAAQ;AAAA,EACV;AAAA,EACA,YAAY,CAAC,EAAE,IAAI,MAAM;AACrB,QAAI,UAAU,SAAS,OAAO;AAAA,EAClC;AACJ;AACA,IAAO,wBAAQ;", 6 | "names": ["default", "dir", "theme", "theme"] 7 | } 8 | -------------------------------------------------------------------------------- /docs/activist-checklists.md: -------------------------------------------------------------------------------- 1 | 10 | 11 | # Activist Digital Security Checklists 12 | 13 | Plain language steps for digital security, because protecting yourself helps keep your whole community safer. Built by activists, for activists with field-tested, community-verified guides. 14 | 15 | ::: warning 16 | I'm still tweaking the sections on this page. All the checklists are correct and useful, but I'm still fixing some of the recommendations. Do your own research on the tools mentioned on this specific page. 17 | ::: 18 | 19 | ## ✈️ Travel & Flight Security 20 | 21 | *Checklist for both domestic and international flights. Also applies to land/sea border crossings.* 22 | 23 | ::: details   [ ]  **What are your rights when crossing the border** 24 | Read the following articles to learn your rights: 25 | - [Know Your Rights travel guide](https://stopaapihate.org/2025/05/19/know-your-rights-when-traveling/) from stop AAPI Hate 26 | - [Is it safe to travel with your phone right now?](https://www.theverge.com/policy/634264/customs-border-protection-search-phone-airport-rights) from The Verge 27 | - [Can border agents search your electronic devices? It's complicated](https://www.aclu.org/news/privacy-technology/can-border-agents-search-your-electronic) from the ACLU 28 | ::: warning 29 | **Border police CAN search any electronic device** at airports/borders without a warrant, regardless of your status. 30 | ::: 31 | 32 | ::: details   [ ]  **How to fully power down your device** 33 | 34 | 35 | **Android:** Press and hold the power button and select Power off. 36 | 37 | **iPhone:** Press and hold power and volume down buttons, then slide to power off. 38 | 39 | **Laptop:** Select Shut down from your system menu. In an emergency, almost all laptops can be forced to power down by pressing and holding the power button for 5-10 seconds. 40 | ::: 41 | 42 | ::: details   [ ]  **Which apps to uninstall** 43 | 44 | 45 | Consider uninstalling Signal, email & calendar apps, social media apps, docs & notes (Google Docs, Evernote), communication apps (Slack, WhatsApp), and Google Maps. Apps on iPhone can be hidden by long-pressing the app > Require Face ID > Hide and Require Face ID. 46 | 47 | **Apps to consider removing:** 48 | - Signal 49 | - Email & Calendar apps 50 | - Social Media apps (Facebook, Twitter, Instagram, TikTok) 51 | - Docs & notes (Google Docs, Evernote, etc.) 52 | - Communication apps (Slack, WhatsApp, etc.) 53 | - Google Maps 54 | ::: 55 | 56 | ::: details   [ ]  **How to safely remove your password manager** 57 | 58 | 59 | Make absolutely sure you have memorized or written down your master password before uninstalling. For 1Password users, also write down your Secret Key. You can travel with this information if you don't think your possessions will be searched. Keep passwords written on paper in a journal or dayplanner, or have a trusted person share them via secure channel. 60 | 61 | **⚠️ Important:** Never delete your Two-Factor Authentication (2FA) codes - these are hard to restore and not useful unless someone also has your password. 62 | ::: 63 | 64 | ::: details   [ ]  **How to change your passcode** 65 | 66 | 67 | Generate a random 10-digit passcode (don't make one up yourself). 68 | 69 | **iPhone:** Settings > Face ID & Passcode > Change Passcode > Passcode Options > Custom Numeric Code 70 | 71 | **Android:** Settings > Security > Screen Lock > Enter Current Lock > PIN/Password > Choose 10-digit Passcode 72 | 73 | Write your new passcode on paper and keep it safe until memorized. 74 | ::: 75 | 76 | ::: details   [ ]  **Encrypting Laptops** 77 | 78 | 79 | Encryption may need to be enabled on your laptop. 80 | 81 | **MacOS:** System Settings > Privacy & Security [scroll to bottom] > FileVault > Turn on, save Recovery Key securely, do not enable iCloud recovery. 82 | 83 | **Windows:** Settings > Privacy & Security > Device encryption. 84 | ::: 85 | 86 | ::: details   [ ]  **How to hide or deactivate social media accounts** 87 | 88 | 89 | Make Twitter/X private or deactivate, LinkedIn private or deactivate, Instagram private or deactivate, Facebook private or deactivate, TikTok private or deactivate. Consider hiding public posts like blogs and YouTube videos. Use Block Party to assist with this process. 90 | 91 | **Platforms to secure:** 92 | - X / Twitter: make private or deactivate 93 | - LinkedIn: make private or deactivate 94 | - Instagram: make private or deactivate 95 | - Facebook: make private or deactivate 96 | - TikTok: make private or deactivate 97 | ::: 98 | 99 | ::: details   [ ]  **How to set up IVPN** 100 | 101 | 102 | Go to IVPN and click Generate IVPN Account ($6/month or $60/year). Write down your Account ID somewhere safe - you cannot recover it. Download apps for computer and phone, enable launch at login, autoconnect on launch, and background daemon management. Keep VPN on at all times unless having connection issues. 103 | 104 | **Setup Steps:** 105 | 1. Go to [IVPN.net](https://www.ivpn.net) and generate account 106 | 2. Select Standard Plan ($6/month or $60/year) 107 | 3. **Important:** Write down Account ID - cannot be recovered if lost 108 | 4. Download apps for [Mac](https://www.ivpn.net/apps-macos/), [Windows](https://www.ivpn.net/apps-windows/), [iPhone](https://apps.apple.com/app/ivpn/id1193122683), [Android](https://play.google.com/store/apps/details?id=net.ivpn.client) 109 | 5. Configure: Launch at login, Autoconnect on launch, Allow background daemon 110 | ::: 111 | 112 | ## 🏛️ Digital Security for Federal Workers 113 | 114 | *For federal workers who are resisting the authoritarian takeover and want to protect themselves and each other.* 115 | 116 | ::: details   [ ]  **How to set up Signal** 117 | 118 | 119 | Install Signal on your phone, message existing contacts (they must have Signal installed), enable disappearing messages by default and for existing threads. Follow the Signal Checklist for maximum security and privacy. 120 | 121 | **Setup Steps:** 122 | 1. Install [Signal](https://signal.org/download/) on your phone 123 | 2. Message existing contacts who have Signal 124 | 3. Enable disappearing messages by default 125 | 4. Follow the complete [Signal Checklist](#signal-security-checklist) below 126 | ::: 127 | 128 | ::: details   [ ]  **How to change your profile** 129 | 130 | 131 | Change your Signal display name: Signal > Settings > Tap name/icon > Edit profile display name. Change profile photo: Upload a generic photo from online that doesn't relate to your identity, preferences, interests, or location. 132 | 133 | **Profile Security:** 134 | - Use a generic display name unrelated to your real identity 135 | - Use a generic profile photo from online 136 | - Avoid photos that reveal location, preferences, or interests 137 | ::: 138 | 139 | ::: details   [ ]  **How to set your social media profile to be private** 140 | 141 | 142 | **LinkedIn:** Go to Edit Profile > Edit Visibility and adjust settings. Consider fully hibernating your profile temporarily. Tighten other visibility settings and review your activity feed. 143 | 144 | **Twitter/X:** Follow instructions to hide your posts and make account private. 145 | 146 | **Additional Steps:** 147 | - Review and delete sensitive posts from your feed 148 | - Consider temporarily hibernating profiles during sensitive periods 149 | - Adjust all visibility settings to maximum privacy 150 | ::: 151 | 152 | ::: details   [ ]  **How to set up Brave Browser** 153 | 154 | 155 | Install Brave browser (privacy-focused, supports Chrome extensions). Configure Settings > Shields: Select 'Aggressive' for trackers & ads blocking, 'Strict' for HTTPS upgrade, uncheck social media blocking. Optionally enable 'Forget me when I close this site' and disable new tab page. 156 | 157 | **Configuration Steps:** 158 | 1. Install [Brave Browser](https://brave.com/) 159 | 2. Go to Settings > Shields 160 | 3. Select "Aggressive" for trackers & ads blocking 161 | 4. Select "Strict" for HTTPS upgrade 162 | 5. Uncheck all social media blocking options 163 | 6. Optional: Enable "Forget me when I close this site" 164 | ::: 165 | 166 | ::: details   [ ]  **How to physically secure devices** 167 | 168 | 169 | Make sure devices are powered down at end of day and when discussing dissent in your house. Keep devices away in drawer, closet, or room with door closed to ensure conversations aren't overheard if microphone were somehow still on. 170 | 171 | **Physical Security Practices:** 172 | - Power down devices completely at end of day 173 | - Store powered-off devices away from discussion areas 174 | - Use drawers, closets, or separate rooms with doors closed 175 | - Never leave devices on during sensitive conversations 176 | ::: 177 | 178 | ::: details   [ ]  **How to enable and use a guest network** 179 | 180 | 181 | Look at your Wi-Fi router for model/brand. Use Brave Search to find instructions for enabling guest network on your router. Set up Wi-Fi network with different name than main network. On government phone/laptop, forget main network and connect to guest network instead. 182 | 183 | **Setup Process:** 184 | 1. Identify router model/brand 185 | 2. Search for "[Router Model] enable guest network" 186 | 3. Create guest network with different name 187 | 4. On government devices: Forget main network 188 | 5. Connect government devices to guest network only 189 | ::: 190 | 191 | ::: details   [ ]  **How to use Proton Docs** 192 | 193 | 194 | Create free Proton account if needed. Visit Proton Drive > Click 'New' > Select 'New Document'. When ready to share, click 'Share' button and either share with other Proton accounts or enable 'Create public link' for those without Proton accounts. Be careful where you share the link. 195 | 196 | **Setup Steps:** 197 | 1. Create free [Proton](https://proton.me/) account 198 | 2. Go to Proton Drive > Click "New" > "New Document" 199 | 3. For sharing: Click "Share" button 200 | 4. Choose: Share with Proton users OR create public link 201 | 5. **⚠️ Caution:** Be very careful where you share public links 202 | ::: 203 | 204 | ## 📱 Signal Security Checklist 205 | 206 | *Configure Signal to protect your messages and calls* 207 | 208 | ::: details   [ ]  **How to enable disappearing messages** 209 | 210 | 211 | **To change default:** Signal > Settings > Privacy > Disappearing Messages > Set to desired time. 212 | 213 | **For existing threads:** Signal > Open thread > Click person/group name > Disappearing Messages > Set time. 214 | 215 | **⚠️ Note:** Disappearing messages does NOT apply retroactively, so delete old threads manually. 216 | ::: 217 | 218 | ::: details   [ ]  **How to disable Signal notifications** 219 | 220 | 221 | Open Signal > Settings > Notifications > Notification Content > Select 'No Name or Content'. This prevents sensitive information from appearing in notifications when your phone is locked. 222 | 223 | **Why this matters:** Prevents sensitive contact names and message content from appearing on your lock screen. 224 | ::: 225 | 226 | ::: details   [ ]  **How to hide screen in App Switcher** 227 | 228 | 229 | **iPhone:** Signal > Settings > Privacy > Enable 'Screen Lock' then enable 'Hide Screen in App Switcher'. 230 | 231 | **Android:** Signal > Settings > Privacy > Enable 'Screen lock' then enable 'Screen Security'. 232 | 233 | **Benefit:** Prevents Signal content from being visible when switching between apps. 234 | ::: 235 | 236 | ::: details   [ ]  **How to change your profile** 237 | 238 | 239 | **Change display name:** Signal > Settings > Tap name/icon > Edit profile display name. 240 | 241 | **Change photo:** Signal > Settings > Tap name/icon > Edit photo > Upload generic photo unrelated to your identity/preferences/interests/location. 242 | 243 | **Security Tip:** Use names and photos that don't reveal your real identity or preferences. 244 | ::: 245 | 246 | ::: details   [ ]  **How to enable usernames and hide your phone number** 247 | 248 | 249 | First change your profile display name if it's your full name. 250 | 251 | **Set username:** Signal > Settings > Tap name/icon > Tap @ symbol > Edit username > Use something unrelated to your identity ending in 2+ numbers. 252 | 253 | **Hide number:** Signal > Settings > Privacy > Phone Number > 'Who Can See My Number' > Select 'Nobody'. 254 | 255 | **Sharing:** Share your username instead of phone number for new contacts. 256 | ::: 257 | 258 | ::: details   [ ]  **How to disable link previews** 259 | 260 | 261 | Signal > Settings > Chats > Disable 'Generate Link Previews'. This prevents Signal from automatically fetching and displaying previews of links you send, which could reveal your IP address to third-party websites. 262 | 263 | **Privacy Benefit:** Prevents your IP address from being revealed to external websites when you share links. 264 | ::: 265 | 266 | ## 📢 Digital Security for Direct Action Organizing 267 | 268 | *For anyone organizing a direct action or protest where the risk of surveillance and arrest is higher.* 269 | 270 | ::: details   [ ]  **Follow Security Essentials checklist** 271 | 272 | 273 | Do everything in the Security Essentials checklist, including the 'enhanced security' section. This provides the foundation for secure organizing communications and practices. 274 | 275 | **Reference:** Complete the [Security Essentials](#security-essentials) checklist below as your foundation. 276 | ::: 277 | 278 | ::: details   [ ]  **Follow Prepare for a Protest checklist** 279 | 280 | 281 | Do everything in the Prepare for a Protest checklist, including the 'enhanced security' section. This ensures you're protected during higher-risk activities. 282 | 283 | **Reference:** Complete the [Prepare for a Protest](#prepare-for-a-protest) checklist below. 284 | ::: 285 | 286 | ::: details   [ ]  **How to set up secure Signal** 287 | 288 | 289 | Install Signal, set username (ex: @cloudy.52) and share this instead of phone number. Set default disappearing messages to 1 week for new chats, shorter as action approaches (1 hour or 5 minutes day-of). Disable Signal notifications so they aren't visible when phone is locked. 290 | 291 | **Timeline for Disappearing Messages:** 292 | - **Planning phase:** 1 week 293 | - **Week of action:** 1 day 294 | - **Day of action:** 1 hour or 5 minutes 295 | - **During action:** Consider 5 minutes or less 296 | ::: 297 | 298 | ::: details   [ ]  **How to set up and use CryptPad** 299 | 300 | 301 | Create account at cryptpad.fr. Enable doc password if containing sensitive information. Enable auto-deletion when possible to reduce digital paper trail after action. For sharing: use Share button > Link > Select 'View' or 'Edit' > Copy URL (don't just copy-paste the URL like Google Docs). 302 | 303 | **Setup Steps:** 304 | 1. Create account at [CryptPad.fr](https://cryptpad.fr) 305 | 2. Enable document password for sensitive content 306 | 3. Enable auto-deletion when possible 307 | 4. **Sharing:** Use Share button > Link > Select permissions > Copy URL 308 | 5. **⚠️ Important:** Don't just copy-paste URL from browser 309 | ::: 310 | 311 | ::: details   [ ]  **How to establish digital security agreements** 312 | 313 | 314 | Create phone security agreements around who brings phones and security level needed. Send participants link to protest checklist. For high-arrest-risk folks, suggest leaving phone home, bringing secondary phone, or following enhanced security. Create photo privacy agreements for how photos are shared and face protection. 315 | 316 | **Agreement Topics:** 317 | - **Phone Security:** Who brings phones, what security measures required 318 | - **Photo Privacy:** How photos shared, face protection protocols 319 | - **Arrest Risk:** Special measures for high-risk participants 320 | - **Communication:** Secure channels and protocols 321 | ::: 322 | 323 | ::: details   [ ]  **How to protect against doxing attacks** 324 | 325 | 326 | Lock down social media privacy settings (Facebook, Twitter, Instagram, especially LinkedIn with workplace/location). Remove data from brokers using DeleteMe service or manually. Consider PO Box instead of street address for packages/accounts/payments, especially if moving soon. 327 | 328 | **Immediate Steps:** 329 | - Make all social media accounts private 330 | - **Especially critical:** LinkedIn (shows workplace/location) 331 | - Use [DeleteMe](https://joindeleteme.com/) or manual data broker removal 332 | - Consider PO Box for address privacy 333 | 334 | **📚 Detailed Guide:** [Equality Labs Anti-Doxing Guide](https://www.equalitylabs.org/anti-doxing-guide) (start at page 25) 335 | ::: 336 | 337 | ## 🔍 Action Research & Scouting 338 | 339 | *For anyone doing sensitive online research or in-person scouting who wants to protect their identity.* 340 | 341 | ::: details   [ ]  **How to use private navigation** 342 | 343 | 344 | Use Organic Maps (iPhone, Android) for most private mapping when getting directions for scouting. Best to save 'offline map' for region needed. Alternatively, print paper directions. Apple Maps also offers good privacy with offline maps saved. Disable location services and keep phone in airplane mode while scouting from time you leave house until you return. 345 | 346 | **Private Navigation Options:** 347 | 1. **[Organic Maps](https://organicmaps.app/)** (most private) 348 | - Download offline maps for your area 349 | - No tracking or data collection 350 | 2. **Apple Maps** (good privacy) 351 | - Download offline maps 352 | - Better privacy than Google Maps 353 | 3. **Printed directions** 354 | - Print from [OpenStreetMap](https://www.openstreetmap.org/) 355 | - Use [Tor Browser](https://www.torproject.org/) for extra privacy 356 | 357 | **Scouting Security:** 358 | - Disable location services completely 359 | - Keep phone in airplane mode 360 | - Leave smart watches at home 361 | - Disable Bluetooth trackers 362 | ::: 363 | 364 | ## 📱 Secondary Phone Checklist 365 | 366 | *How to set up an alternate phone for actions and activism that has less data. For anyone who is higher risk of arrest who wants to invest in protecting their data.* 367 | 368 | ::: details   [ ]  **Understand 'Burner Phone' vs 'Secondary Phone'** 369 | 370 | 371 | **Burner phone:** Truly anonymous, disconnected from identity, used few times before discarding - requires great effort for true anonymity. 372 | 373 | **Secondary phone:** Second phone with minimal info in case of confiscation, reusable over many actions. Goal is harm reduction, not anonymity. 374 | 375 | **Consider if you are:** 376 | - An organizer/leader in social movement spaces 377 | - Likely to be targeted based on identity (POC, LGBTQ+, documentation status, etc.) 378 | - Working with targeted communities 379 | - Someone with very sensitive data on your phone 380 | ::: 381 | 382 | ::: details   [ ]  **What data am I protecting?** 383 | 384 | 385 | Your phone contains: all contacts (friends, family, organizers/activists), location data and map history (can determine where you've been and who you've met), message history (texts, Signal, WhatsApp), years of email history, browser history/bookmarks/passwords, all photos (including of other people without their consent), calendar events (meetings - who, when, where), documents (Google docs, encrypted tools if signed in). 386 | 387 | **Data at Risk:** 388 | - **Contacts:** Everyone in your phone becomes visible to authorities 389 | - **Location History:** Shows everywhere you've been and who you've met with 390 | - **Messages:** Texts, Signal, WhatsApp conversations going back years 391 | - **Photos:** Including photos of others who didn't consent to seizure 392 | - **Calendar:** Meeting details reveal organizing activities 393 | - **Browser Data:** Search history, bookmarks, saved passwords 394 | - **Documents:** Google Docs, encrypted tools if logged in 395 | ::: 396 | 397 | ::: details   [ ]  **What you'll need** 398 | 399 | 400 | **Equipment & Costs:** 401 | - Secondary smartphone (used or new): $60+ or free if donated 402 | - SIM card: $5 403 | - Prepaid plan: ~$15/month (cheapest) or $100/year (best long-term) 404 | 405 | **Time & Difficulty:** 406 | - Setup time: 3 hours 407 | - Technical difficulty: Moderate 408 | - Maintenance: 30 minutes after each use 409 | ::: 410 | 411 | ::: details   [ ]  **How to set up the phone** 412 | 413 | 414 | Factory reset device if used. Skip/decline all optional setup (phone, location tracking, analytics, cloud backup). **IMPORTANT:** Do NOT sign in with normal Apple/Google Account during setup - look for 'skip' button. Activate phone BEFORE making Apple/Google account since they require phone number and you want to use new number. 415 | 416 | **Setup Process:** 417 | 1. Factory reset device ([iPhone](https://support.apple.com/HT201274) / [Android](https://support.google.com/android/answer/6088915)) 418 | 2. **Skip ALL optional features:** 419 | - Location tracking 420 | - Analytics/usage data 421 | - Cloud backup 422 | - Account sign-in (look for "Skip" buttons) 423 | 3. **⚠️ Critical:** Never sign in with your main Apple/Google account 424 | 4. Activate phone first, then create new accounts 425 | ::: 426 | 427 | ::: details   [ ]  **How to set up separate Signal profile** 428 | 429 | 430 | Follow standard Signal activation for new number, then set up username. Tell contacts your new Signal username by messaging from main Signal first to verify identity. Message your main Signal from new one to send info between accounts with disappearing messages on. Join minimal relevant groups and leave when no longer active/relevant. 431 | 432 | **Signal Setup:** 433 | 1. Install Signal with new phone number 434 | 2. Set up username (e.g., @cloudy.52) 435 | 3. **Verify identity:** Message contacts from main Signal first 436 | 4. **Bridge accounts:** Message between your two Signals 437 | 5. **Minimize exposure:** Join only essential groups 438 | 6. **Clean up:** Leave groups when no longer needed 439 | 440 | **⚠️ Remember:** Every Signal group provides more data if phone is confiscated. 441 | ::: 442 | 443 | ::: details   [ ]  **Before and after each action** 444 | 445 | 446 | **Before each action:** - Ensure phone number active and not expired 447 | - Check minutes/data remaining if not unlimited plan 448 | - Charge phone 449 | - Download offline maps 450 | 451 | **After each action:** - Clear all app data (messages, Browse, maps) 452 | - Remove Signal threads and leave unneeded groups 453 | - Clear browser/navigation history 454 | - **If confiscated:** Consider selling and getting new phone (factory reset may not remove spyware) 455 | ::: 456 | 457 | ## ✊ Prepare for a Protest 458 | 459 | *Protect yourself and your community while protesting or attending any kind of action where arrest risk and surveillance is higher.* 460 | 461 | ::: details   [ ]  **If arrest risk is going up, turn your phone off!** 462 | 463 | 464 | When fully powered off, phone is more secure against data extraction by police. Data stays encrypted until you turn on and enter passcode for first time. The number one protection is turning phone off if you think you're getting closer to a risky situation. Remind others to turn off phones too. 465 | 466 | **iPhone tip:** Press screen lock button 5 times to quickly bring up 'power off' option. 467 | 468 | **Why this works:** When powered off completely, your phone's data remains encrypted and is much harder for police to access. 469 | ::: 470 | 471 | ::: details   [ ]  **How to disable GPS location tracking** 472 | 473 | 474 | **iPhone:** Settings > Privacy & Security > Disable 'Location Services' (Shortcut: Say to Siri 'Disable location tracking'). 475 | 476 | **Android:** Settings > Location > Disable 'Use Location'. 477 | 478 | Print maps or save offline maps for phone use. Leave smart watches or Bluetooth trackers at home or disable their tracking. 479 | 480 | **Additional Steps:** 481 | - Print directions from [OpenStreetMap](https://www.openstreetmap.org/) 482 | - Download offline maps in [Organic Maps](https://organicmaps.app/) 483 | - Remove/disable smartwatches, AirTags, Tile trackers 484 | - Consider putting devices in a Faraday bag 485 | ::: 486 | 487 | ::: details   [ ]  **How to change your passcode** 488 | 489 | 490 | Generate a random 10-digit passcode (don't make one up yourself). 491 | 492 | **iPhone:** Settings > Face ID & Passcode > Change Passcode > Passcode Options > Custom Numeric Code. 493 | 494 | **Android:** Settings > Security > Screen Lock > Enter Current Lock > PIN/Password > Choose 10-digit Passcode. 495 | 496 | Write new passcode on paper, keep it safe until memorized. 497 | 498 | **⚠️ Important:** Use a truly random passcode - humans are terrible at making up random numbers. 499 | ::: 500 | 501 | ::: details   [ ]  **How to disable face/fingerprint unlock** 502 | 503 | 504 | **iPhone:** Settings > Face ID & Passcode > Disable 'Use Face ID for iPhone Unlock' (can leave rest enabled). 505 | 506 | **Android:** Settings > Lock Screen (or Security) > Biometrics and Security > Disable both 'Face Recognition' and 'Fingerprint Unlock' for phone unlocking. 507 | 508 | **Why this matters:** Police can potentially force you to unlock with biometrics, but cannot force you to reveal your passcode. 509 | ::: 510 | 511 | ::: details   [ ]  **How to install and use Signal** 512 | 513 | 514 | Install Signal on phone. Message/call existing contacts using phone number or ask for their Signal username - they must have Signal installed too. Enable disappearing messages and disable notifications showing content. 515 | 516 | **Quick Setup:** 517 | 1. Install [Signal](https://signal.org/download/) 518 | 2. Connect with existing contacts 519 | 3. Enable disappearing messages (5-15 minutes for protests) 520 | 4. Disable notification content display 521 | 5. Follow complete [Signal Checklist](#signal-security-checklist) above 522 | ::: 523 | 524 | ::: details   [ ]  **How to take photos while protecting identities** 525 | 526 | 527 | Try not to capture faces when possible. Disable automatic cloud uploads (Google Photos, iCloud Photos) so you can review before uploading. If you capture faces, use the blurring tool in Signal when sending anywhere. If organizing with a known group, discuss documentation and sharing agreements in advance. 528 | 529 | **Photo Security:** 530 | - **Prevention:** Avoid capturing faces when possible 531 | - **Cloud uploads:** Disable automatic backup to review first 532 | - **Face protection:** Use Signal's blur tool before sharing 533 | - **Group agreements:** Discuss photo/video protocols in advance 534 | - **Consider:** Photos may be used to identify and target others 535 | ::: 536 | 537 | ::: details   [ ]  **How to use private navigation** 538 | 539 | 540 | Turn off location services before leaving for the action. Keep the phone in airplane mode as much as possible so the carrier doesn't know your location. Use printed directions if possible - print from OpenStreetMap via Tor Browser for privacy. Use the Organic Maps app for private mapping - open it before leaving to download offline maps. 541 | 542 | **Navigation Options (most to least private):** 543 | 1. **Printed directions** (most secure) 544 | - Print from [OpenStreetMap](https://www.openstreetmap.org/) 545 | - Access via [Tor Browser](https://www.torproject.org/) for extra privacy 546 | 2. **Organic Maps** with offline maps 547 | - Download maps before leaving home 548 | - Works without an internet connection 549 | 3. **Airplane mode** + saved maps 550 | - Prevents cell tower tracking 551 | - Still allows offline navigation 552 | ::: 553 | 554 | ::: details   [ ]  **How to select phone number for arrest** 555 | 556 | 557 | Decide who to call if you're arrested. If there's no active jail support hotline in your area, pick an emergency contact (a friend/trusted comrade for legal support - get their consent in advance). For higher-risk actions, organizers may have established a specific legal hotline. Larger cities may have an NLG jail support hotline. Write the legal number on your body in sharpie where it won't rub off (upper arm, leg, torso). 558 | 559 | **Emergency Contact Options:** 560 | 1. **Jail support hotline** (if available in your area) 561 | 2. **Trusted friend/comrade** with legal knowledge 562 | 3. **National Lawyers Guild** hotline (major cities) 563 | 4. **Action-specific** legal support number 564 | 565 | **⚠️ Remember:** Get consent from personal contacts in advance. 566 | 567 | **Write number on body:** Use a Sharpie on your upper arm, leg, or torso where it won't rub off. 568 | 569 | **📚 Resources:** [National Lawyers Guild Jail Support](https://www.nlg.org/know-your-rights/jail-support/) 570 | ::: 571 | 572 | ## 🔐 Security Essentials 573 | 574 | *Essentials that everyone should do to protect themselves from surveillance and attackers.* 575 | 576 | ::: details   [ ]  **How to set up Signal** 577 | 578 | 579 | Install Signal on your phone. Message existing contacts using their phone number (they must have Signal installed). For new contacts you don't trust yet, exchange usernames instead of phone numbers when possible. To start a new message: Press the 'Create' icon, then type the person's phone number or username. Follow the Signal Checklist for maximum security and privacy. 580 | 581 | **Setup Steps:** 582 | 1. Install [Signal](https://signal.org/download/) on your phone 583 | 2. Message existing contacts (they need Signal too) 584 | 3. **For new/untrusted contacts:** Use usernames, not phone numbers 585 | 4. **New message:** Press "Create" icon > enter phone number or username 586 | 5. **Complete setup:** Follow the [Signal Checklist](#signal-security-checklist) above 587 | ::: 588 | 589 | ::: details   [ ]  **How to set up Brave Browser** 590 | 591 | 592 | Install Brave (a privacy-focused browser that supports Chrome extensions) on your computer/phone. Import your configuration from Chrome/other browsers. Configure Settings > Shields: Select 'Aggressive' for trackers & ads blocking, 'Strict' for HTTPS upgrade, and uncheck social media blocking. Optional: Enable 'Forget me when I close this site,' disable the new tab page, and disable toolbar items (Brave Rewards, VPN, Wallet, Leo AI). 593 | 594 | **Setup Process:** 595 | 1. Install [Brave Browser](https://brave.com/) 596 | 2. Import bookmarks/settings from your current browser 597 | 3. **Configure Shields:** Settings > Shields 598 | - **Trackers & ads blocking:** "Aggressive" 599 | - **HTTPS upgrade:** "Strict" 600 | - **Social media blocking:** Uncheck all 601 | 4. **Optional privacy features:** 602 | - Enable "Forget me when I close this site" 603 | - Disable the new tab page 604 | - Remove toolbar items you don't need 605 | ::: 606 | 607 | ::: details   [ ]  **How to set up private search** 608 | 609 | 610 | **Brave Search:** This is the default in Brave browser, or you can follow instructions for other browsers. 611 | 612 | **DuckDuckGo:** Follow instructions to make DuckDuckGo your default search engine. 613 | 614 | Both options prevent your search history from being tracked and sold. 615 | 616 | **Setup Options:** 617 | 1. **[Brave Search](https://search.brave.com/)** - No tracking, independent index 618 | 2. **[DuckDuckGo](https://duckduckgo.com/)** - No tracking, uses other sources 619 | 3. **[Startpage](https://www.startpage.com/)** - Google results without tracking 620 | 621 | **Why this matters:** Google tracks and profiles every search you make. 622 | ::: 623 | 624 | ::: details   [ ]  **How to run updates** 625 | 626 | 627 | Keep all your devices current with security updates. iPhone: Check model eligibility, update the OS, and enable automatic updates. Android: Check Samsung/Pixel models, update the OS, and enable automatic updates. Mac: Ensure it's not on the 'obsolete' list, update the OS, and enable automatic App Store updates. Windows: Update the OS and enable automatic Microsoft Store updates. For other apps, check the Help menu for updates. 628 | 629 | **Device-Specific Instructions:** 630 | 631 | **iPhone:** 632 | - Check [model eligibility](https://support.apple.com/guide/iphone/supported-models-iphe3fa5df43/ios) 633 | - Settings > General > Software Update 634 | - Enable automatic updates 635 | 636 | **Android:** 637 | - Check [Samsung](https://security.samsungmobile.com/workScope.smsb) or [Pixel](https://support.google.com/pixelphone/answer/4457705) support 638 | - Settings > System > System update 639 | - Enable automatic updates 640 | 641 | **Mac:** 642 | - Ensure not on the [obsolete list](https://support.apple.com/102662) 643 | - System Settings > General > Software Update 644 | - Enable automatic updates 645 | 646 | **Windows:** 647 | - Settings > Update & Security > Windows Update 648 | - Enable automatic updates 649 | ::: 650 | 651 | ::: details   [ ]  **How to set up private mapping** 652 | 653 | 654 | **iPhone:** Apple Maps is installed by default. Go to Settings > Privacy & Security > Location Services > System Services, then disable iPhone Analytics, Routing & Traffic, and Improve Maps. 655 | 656 | **All platforms:** Install Organic Maps, and open it once in your area to download offline navigation data. Both options are more private than Google Maps. 657 | 658 | **Setup Steps:** 659 | 660 | **Apple Maps (iPhone):** 661 | 1. Already installed by default 662 | 2. Settings > Privacy & Security > Location Services > System Services 663 | 3. Disable: iPhone Analytics, Routing & Traffic, Improve Maps 664 | 665 | **Organic Maps (All devices):** 666 | 1. Install [Organic Maps](https://organicmaps.app/) ([iPhone](https://apps.apple.com/app/organic-maps/id1567437057) / [Android](https://play.google.com/store/apps/details?id=app.organicmaps)) 667 | 2. Open the app in your area to download offline maps 668 | 3. **Benefits:** Completely private, works offline, no tracking 669 | ::: 670 | 671 | ::: details   [ ]  **How to review location permissions** 672 | 673 | 674 | **iPhone:** Settings > Privacy & Security > Location Services. Review each app: Never (best for most), Ask Next Time (rarely needed), While Using App (essential navigation only), Always (almost no app needs this). Set Photos to Never to avoid revealing location in sent photos. Disable System Services > Significant Locations. 675 | 676 | **Android:** Settings > Privacy > Permission manager > Location. You'll see similar options: Don't allow, Ask every time, Allow only while using, Allow all the time. 677 | 678 | **Permission Levels (most to least secure):** 679 | 680 | **iPhone:** 681 | - **Never** (best for most apps) 682 | - **Ask Next Time** (for rarely needed location) 683 | - **While Using App** (essential navigation only) 684 | - **Always** (almost no app should have this) 685 | 686 | **Android:** - **Don't allow** (best for most apps) 687 | - **Ask every time** (for rarely needed location) 688 | - **Allow only while using app** (essential navigation only) 689 | - **Allow all the time** (almost no app should have this) 690 | 691 | **⚠️ Critical:** Set the Photos app to "Never" to prevent location data from being included in shared photos. 692 | ::: 693 | 694 | ::: details   [ ]  **How to opt out of data broker websites** 695 | 696 | 697 | This process is very time-consuming to do manually, so it's recommended to pay for an automation service. Sign up for EasyOptOuts ($20/year). Fill out the form with your current/past phone numbers, emails, addresses, and housemates. After 1-2 weeks, you'll receive an email with removal details. Do separate Google searches for your name, email, phone number, and address to find any remaining sites for manual removal. 698 | 699 | **Automated Option:** 700 | 1. Sign up for [EasyOptOuts](https://easyoptouts.com/) ($20/year) 701 | 2. Fill out the comprehensive form (all past info) 702 | 3. Wait 1-2 weeks for a removal report 703 | 4. **Follow-up:** Google search your details to find remaining sites 704 | 705 | **Manual Option:** 706 | - [Big-ass data broker opt-out list](https://github.com/yaelwrites/Big-Ass-Data-Broker-Opt-Out-List) 707 | - Very time-consuming but free 708 | - Expect to spend 10+ hours 709 | 710 | **Why this matters:** Data brokers sell your personal info (address, phone, family) to anyone, including bad actors. 711 | ::: 712 | 713 | ::: details   [ ]  **How to set up IVPN** 714 | 715 | 716 | Go to IVPN and click Generate IVPN Account ($6/month or $60/year). Select the Standard Plan (or Pro for 2+ devices). Write your Account ID somewhere safe - it cannot be recovered if lost. Enter your payment details or order a voucher card for more privacy. Download the apps for your computer/phone, install them, and enter your Account ID. Enable: Launch at login, Autoconnect on launch, and Allow background daemon. Keep the VPN on at all times unless you're having connection issues. 717 | 718 | **Setup Steps:** 719 | 1. Go to [IVPN.net](https://www.ivpn.net/) > "Generate IVPN Account" 720 | 2. **Plan:** Standard ($6/month) or Pro ($9/month for 3+ devices) 721 | 3. **⚠️ Critical:** Write down your Account ID - it CANNOT be recovered if lost 722 | 4. **Payment:** Credit card or [voucher cards](https://www.amazon.com/s?k=ivpn+voucher) for more privacy 723 | 5. **Download apps:** [Computer](https://www.ivpn.net/apps/) / [Mobile](https://www.ivpn.net/apps/) 724 | 6. **Configure:** Enable launch at login, autoconnect, and background daemon 725 | 726 | **Alternative:** [Mullvad VPN](https://mullvad.net/) - Similar privacy focus, accepts cash payments 727 | ::: 728 | 729 | ::: details   [ ]  **How to set up 1Password** 730 | 731 | 732 | Download and install 1Password ($3/month). Create a strong, random master password using a passphrase generator - it should be memorable but not used elsewhere. Write the master password on paper and destroy it after you've memorized it. Import your existing passwords, and install the browser extension and mobile app. Update your most important passwords using the random generator if you were re-using similar ones. 733 | 734 | **Setup Process:** 735 | 1. Download [1Password](https://1password.com/) ($3/month) 736 | 2. **Master Password:** Use a [passphrase generator](https://bitwarden.com/password-generator/) 737 | - It should be memorable but unique 738 | - Write it on paper and destroy it after memorization 739 | 3. **Import** existing passwords from your browser 740 | 4. **Install extensions:** [Browser](https://1password.com/downloads/#browsers) and [mobile](https://1password.com/downloads/#mobile) apps 741 | 5. **Update passwords:** Change reused passwords using the 1Password generator 742 | 743 | **⚠️ Security Note:** Your master password protects everything - make it strong and unique. 744 | 745 | **Free Alternative:** [Bitwarden](https://bitwarden.com/) offers similar features at no cost. 746 | ::: 747 | 748 | ::: details   [ ]  **How to set up two-factor authentication** 749 | 750 | 751 | Install an authenticator app: 1Password (which has a built-in authenticator) or Ente Auth. Optional: Create an account for backup (Ente encrypts your data). Set up 2FA on your accounts: Go to the Security/Privacy settings and look for '2FA'/'two-factor'/'multi-factor authentication'. Select the 'authenticator app' option if it's available (and save the backup codes in your password manager). If only SMS is available, use that. Common sites to secure include Google, Apple ID, Facebook, Twitter/X, and Instagram. 752 | 753 | **Authenticator Apps:** 754 | 1. **1Password** (if you have it) - Built-in authenticator 755 | 2. **[Ente Auth](https://ente.io/auth/)** - Privacy-focused, end-to-end encrypted 756 | 3. **Avoid:** SMS when possible (it can be intercepted) 757 | 758 | **Setup Process:** 759 | 1. Go to your account's Security/Privacy settings 760 | 2. Look for "2FA," "Two-factor," or "Multi-factor authentication" 761 | 3. **Choose "Authenticator app"** over SMS when available 762 | 4. **Save backup codes** in your password manager 763 | 5. Test the login with your new setup 764 | 765 | **Essential Accounts to Secure:** 766 | - Email accounts (Gmail, etc.) 767 | - [Apple ID](https://support.apple.com/en-us/HT204915) 768 | - Social media accounts 769 | - Financial accounts 770 | - Work accounts 771 | 772 | **📚 Check which sites support 2FA:** [2FA Directory](https://2fa.directory/) 773 | ::: 774 | 775 | ::: details   [ ]  **How to use Proton Mail** 776 | 777 | 778 | Sign up for a free ProtonMail account. Choose a random username that's not connected to your identity. When verifying that you're human, choose 'CAPTCHA,' not 'email.' When asked for a recovery method, choose 'Maybe later' (but you must save your password securely). Messages between Proton users are automatically end-to-end encrypted. Messages to other providers are not encrypted, but you can send a password-protected email. 779 | 780 | **Setup Steps:** 781 | 1. Sign up for a free [ProtonMail](https://proton.me/mail) account 782 | 2. **Username:** Choose a random name unconnected to your identity 783 | 3. **Verification:** Choose "CAPTCHA," not "email" 784 | 4. **Recovery method:** Choose "Maybe later" (save your password safely!) 785 | 5. **⚠️ Important:** You must secure your password since there's no recovery option 786 | 787 | **Encryption Levels:** 788 | - **Proton to Proton:** Automatic end-to-end encryption 789 | - **Proton to others:** Not encrypted, but you can send a password-protected message 790 | - **Still beneficial:** It's harder for the government to access via backdoors 791 | 792 | **📚 More Info:** [Proton Security Features](https://proton.me/security) 793 | ::: 794 | 795 | ## 📚 Additional Resources 796 | 797 | ### 🛡️ Essential Security Tools 798 | 799 | - **[Signal](https://signal.org/)** - Encrypted messaging and calls 800 | - **[Brave Browser](https://brave.com/)** - Privacy-focused web browser 801 | - **[Organic Maps](https://organicmaps.app/)** - Private, offline navigation 802 | - **[IVPN](https://www.ivpn.net/)** - No-logs VPN service 803 | - **[1Password](https://1password.com/)** - Password manager 804 | - **[Proton Mail](https://proton.me/mail)** - Encrypted email 805 | - **[Tor Browser](https://www.torproject.org/)** - Anonymous web browsing 806 | 807 | ### 📖 Further Reading 808 | 809 | - **[Equality Labs Anti-Doxing Guide](https://www.equalitylabs.org/)** - Comprehensive privacy protection 810 | - **[Electronic Frontier Foundation](https://www.eff.org/issues/privacy)** - Digital rights and privacy 811 | - **[National Lawyers Guild](https://www.nlg.org/)** - Know your rights resources 812 | - **[Security in a Box](https://securityinabox.org/)** - Digital security toolkit 813 | 814 | ### 🚨 Emergency Resources 815 | 816 | - **National Lawyers Guild Jail Support:** Check for local chapters 817 | - **ACLU Know Your Rights:** [aclu.org/know-your-rights](https://www.aclu.org/know-your-rights/) 818 | - **Stop AAPI Hate Travel Guide:** For border crossing rights 819 | 820 | ::: warning 821 | This information is for educational purposes. Laws and technologies change frequently. Always consult with legal experts and security professionals for your specific situation. 822 | 823 | This guide is based on content from [ActivistChecklist](https://ActivistChecklist.org), which I read and modified based on a stricter threat model. 824 | ::: 825 | --------------------------------------------------------------------------------