{"config":{"lang":["en"],"separator":"[\\s\\u200b\\-_,:!=\\[\\]()\"`/]+|\\.(?!\\d)|&[lg]t;|(?!\\b)(?=[A-Z][a-z])","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Hello, and welcome to the Hitchhiker's Guide.","text":"

9FA5 436D 0EE3 6098 5157 3825 17EC A05F 768D EDF6

You'll use it to verify the checksum and GPG signature of all files for authenticity. Please share this project if you enjoy it and you think it might be useful to others.

Anonymous Planet is a collective of volunteers.

Das Kolburn Nope "},{"location":"about/","title":"Anonymous Planet","text":"

Anonymous Planet are the maintainers of the Hitchhiker's Guide and the PSA Community. It is responsible for maintaining the projects and code repositories. This project is part of our ongoing efforts to provide open-source tools and resources for the community, with regular updates and improvements added to the changelog.

The purpose: providing an introduction to various online tracking techniques, online ID verification techniques, and detailed guidance to creating and maintaining (truly) anonymous online identities. It is written with the hopes that good people (e.g., activists, journalists, scientists, lawyers, whistle-blowers, etc.) will be able to fight oppression, censorship and harassment! The website and projects are free (as in freedom) and not affiliated with any donor or projects discussed.

Where do I start?

Start either by going to the beginning or using the search at top right of the page. It is also available at whatever point you are in your reading.

Notes on the journey

This guide is a work in progress. It will probably never be \"finished\". You may (will) find broken links when you click on some search results and during some navigation steps. Please report these. Otherwise, most of the search functionality is a great experience and can help you find linked topics. Try to search for something in one section of the reading. It will show up in many other places.

Disclaimer

There might be some wrong or outdated information in this guide because no one is perfect. Your experience may vary. Remember, check regularly for an updated version of this guide. Please do your own independent, well-thought research. There is no one resource online that can provide 100% security, anonymity, and/or privacy.

This guide is a non-profit open-source initiative, licensed under Creative Commons Attribution-NonCommercial 4.0 International (cc-by-nc-4.0 [Archive.org]).

Feel free to submit issues (please do report anything wrong) using GitHub Issues at: https://github.com/Anon-Planet/thgtoa/issues. We also accept Merge Requests (MR) from our Gitlab and many other places. Do not hesitate to report issues and suggestions!

Discuss ideas on Matrix for real-time chat

We offer a Matrix.org hosted space of our own. Check it out!

Follow us on:

To contact me, see the updated information on the website or send an e-mail to contact@anonymousplanet.org

Please consider donating if you enjoy the project and want to support the hosting fees or support the funding of initiatives like the hosting of Tor Exit Nodes.

"},{"location":"about/#recommended-reading","title":"Recommended Reading","text":"

Some of those resources may, in order to sustain their project, contain or propose:

Note that these websites could contain affiliate/sponsored content and/or merchandising. This guide does not endorse and is not sponsored by any commercial entity in any way.

If you skipped those, you should really still consider viewing this YouTube playlist from the Techlore Go Incognito project (https://github.com/techlore-official/go-incognito [Archive.org]) as an introduction before going further: https://www.youtube.com/playlist?list=PL3KeV6Ui_4CayDGHw64OFXEPHgXLkrtJO [Invidious]. This guide will cover many of the topics in the videos of this playlist with more details and references as well as some added topics not covered within that series. This will just take you 2 or 3 hours to watch it all.

Anonymous Planet does not participate in any sponsoring, endorsement, advertising, or other affiliate programs for any entity. We only rely on anonymous donations in a closed, transparent loop system.

Privacy related Blogs and personal websites Useful resources We are not affiliated with Anonymous or Riseup

One or two of our community members uses or has used the resources of Riseup. We are not affiliated with Riseup in any manner.

We also hold no affiliation with the Anonymous [Wikiless] [Archive.org] hacker collective.

"},{"location":"about/#license","title":"License","text":"

This guide is an open-source non-profit initiative, licensed under Creative Commons Attribution-NonCommercial 4.0 International and is not sponsored/endorsed by any commercial/governmental entity. This means that you are free to use our guide for pretty much any purpose excluding commercially as long as you do attribute it. There are no ads or any affiliate links.

"},{"location":"changelog/","title":"Release Notes","text":"

Notable changes to the guide and its tooling. Follows Keep a Changelog and Semantic Versioning.

"},{"location":"changelog/#v123","title":"v1.2.3","text":"

CI/CD pipeline split into independent stages, dark PDF quality improved, release signing automated, and the changelog now updates itself on every build. Skipping v1.2.2 which was a placeholder and contained broken Python unsuitable for a tag/release.

Added

Changed

Fixed

"},{"location":"changelog/#v121","title":"v1.2.1","text":"

First automated PDF build and the start of the CI pipeline.

Added

Changed

Fixed

"},{"location":"code/","title":"Content Contributions","text":"

You can submit bugs and feature requests with detailed information about your issue or idea:

For those of you who are looking to add content to the guide, include the following:

"},{"location":"code/#pull-requests","title":"Pull Requests","text":"

When reporting guide issues:

"},{"location":"code/#large-prs","title":"Large PRs","text":"

Please split large sets of changes into multiple PRs. For example, a PR that adds Windows 11 support, removes Windows AME references, and fixes typos can be split into 3 PRs. This makes PRs easier to review prior to merging.

For an example of what not to do, see: https://github.com/Anon-Planet/thgtoa/pull/51. This PR contains enough changes to split into multiple smaller and individually reviewable PRs.

"},{"location":"code/#updating-prs","title":"Updating PRs","text":"

While a PR is being reviewed, modifications may be made to it by the reviewer prior to merging. If this is the case, a new branch will be created for the PR's review. If you would like to submit a change to a PR that is in the process of being reviewed, do not update the PR directly. This will only cause merge conflicts and delay the PR from being merged. Instead, submit your changes to the PR's review branch.

For an example of what not to do, see: https://github.com/Anon-Planet/thgtoa/pull/51. Instead of submitting changes to the PR directly, they should have been submitted as changes to the PR's associated review branch.

Thank you for taking the few moments to read this far! You're already way ahead of the curve, so keep it up!

"},{"location":"code/develop/","title":"Developer Guide","text":"

This page covers everything you need to contribute to the project, run the build pipeline locally, configure GitHub secrets, and cut a signed release.

"},{"location":"code/develop/#prerequisites","title":"Prerequisites","text":"

Install these before anything else.

Linux / macOSWindows
# Python 3.11+\npython3 --version\n\n# poppler (pdftoppm) and qpdf\nsudo apt install poppler-utils qpdf       # Debian / Ubuntu\nbrew install poppler qpdf                 # macOS\n\n# GPG\nsudo apt install gnupg                    # Debian / Ubuntu\nbrew install gnupg                        # macOS\n\n# Python dependencies\npip install \"mkdocs-material[imaging]\" pillow numpy\n
# Python 3.11+ from https://python.org\n\n# poppler \u2014 download from https://github.com/oschwartz10612/poppler-windows/releases\n# Extract and add the bin\\ folder to PATH\n\n# qpdf \u2014 download from https://github.com/qpdf/qpdf/releases\n# Extract and add the bin\\ folder to PATH\n\n# GPG \u2014 download Gpg4win from https://gpg4win.org\n\n# Python dependencies\npip install \"mkdocs-material[imaging]\" pillow numpy\n

You also need Google Chrome or Microsoft Edge installed for the light-mode PDF build (headless Chromium).

"},{"location":"code/develop/#repository-layout","title":"Repository layout","text":"
.github/\n  workflows/\n    build.yml        \u2190 builds PDFs, uploads artifact\n    sign.yml         \u2190 hashes + GPG signs, uploads signatures artifact\n    release.yml      \u2190 publishes GitHub Release with all assets\n    changelog.yml    \u2190 auto-updates docs/changelog/index.md\n    publish.yml      \u2190 deploys MkDocs site to GitHub Pages\ndocs/\n  guide/index.md     \u2190 the guide (single Markdown file)\n  changelog/         \u2190 release notes\n  code/              \u2190 this page\nexport/              \u2190 PDF output (gitignored except .sha256, .b2, .sig)\npgp/                 \u2190 public signing keys\nscripts/\n  build_guide_pdf.py \u2190 MkDocs + Chromium PDF builder\n  convert.py         \u2190 pixel-based dark mode PDF converter\n  tag_release.py     \u2190 interactive signed-tag helper for maintainers\n  update_changelog.py\u2190 auto-generates changelog entries from git log\n  setup_workflow.py  \u2190 GitHub Secrets setup assistant\n  verify_pdf.py      \u2190 signature verification helper\n
"},{"location":"code/develop/#building-locally","title":"Building locally","text":""},{"location":"code/develop/#build-both-pdfs","title":"Build both PDFs","text":"
python scripts/build_guide_pdf.py --both\n

This builds the MkDocs site, renders it to export/thgtoa.pdf via headless Chromium, then calls scripts/convert.py to produce export/thgtoa-dark.pdf.

Flag Effect --both Light PDF then dark PDF (no flag) Light PDF only --dark Dark PDF only (light PDF must already exist)"},{"location":"code/develop/#build-only-the-dark-pdf-from-an-existing-light-pdf","title":"Build only the dark PDF from an existing light PDF","text":"
python scripts/convert.py export/thgtoa.pdf export/thgtoa-dark.pdf\n

Options:

Flag Default Description --dpi 200 Rasterization DPI. 150 = smaller file, 300 = sharper but slow --batch-size 50 Pages per batch. Reduce if you hit OOM --bg 1f1f31 Background colour (hex) --text e0e0e0 Body text colour (hex) --link 5e8bde Link / blue element colour (hex)"},{"location":"code/develop/#preview-the-mkdocs-site","title":"Preview the MkDocs site","text":"
mkdocs serve\n

Opens at http://127.0.0.1:8000.

"},{"location":"code/develop/#pushing-changes","title":"Pushing changes","text":"

The pipeline triggers automatically when you push to main \u2014 no manual steps are needed for normal contributions.

push to main\n    \u2502\n    \u25bc\nbuild.yml          builds thgtoa.pdf + thgtoa-dark.pdf\n    \u2502 (workflow_run on success)\n    \u25bc\nsign.yml           SHA-256 + BLAKE2b hashes, GPG detached signatures\n    \u2502 (workflow_run on success)\n    \u25bc\nrelease.yml        VirusTotal scan \u2192 tagged GitHub Release\n    \u2502\nchangelog.yml      prepends new ## [vX.Y.Z] entry \u2192 commits back to main\n

Each stage runs independently and can be re-triggered manually from the Actions tab. If the build succeeds but signing fails (e.g. an expired key), you can re-run only sign.yml pointing at the existing build artifact without rebuilding the PDFs.

Before you push

"},{"location":"code/develop/#github-secrets","title":"GitHub Secrets","text":"

These must be configured in Settings \u2192 Secrets and variables \u2192 Actions before the pipeline will fully work. The build step requires no secrets; signing and releasing require all of them.

"},{"location":"code/develop/#gpg_private_key","title":"GPG_PRIVATE_KEY","text":"

The ASCII-armored private key used to sign PDFs and hash files.

# Export the release signing key\ngpg --armor --export-secret-keys C3023DBEA3FB38C438BA1EEDCEC60AEDE8B992A2\n

Copy the entire output (including -----BEGIN PGP PRIVATE KEY BLOCK----- and the closing line) and paste it as the secret value.

Key security

This is the release signing key. Only repository admins should have access to it. Never commit it to the repository or share it outside of GitHub Secrets.

"},{"location":"code/develop/#gpg_passphrase","title":"GPG_PASSPHRASE","text":"

The passphrase protecting the private key above. Must match exactly \u2014 no trailing newline.

"},{"location":"code/develop/#vt_api_key","title":"VT_API_KEY","text":"

A VirusTotal API key with file upload permissions. Used by release.yml to scan both PDFs before publishing the release.

Get one by creating a free account at virustotal.com \u2192 API key under your profile. The free tier allows 4 lookups/minute and 500/day, which is sufficient for the two PDFs per release.

"},{"location":"code/develop/#changelog_pat","title":"CHANGELOG_PAT","text":"

A GitHub Personal Access Token with contents: write scope on this repository.

Why it's needed: changelog.yml commits back to main after each build. Commits made with the default GITHUB_TOKEN do not trigger further workflow runs (GitHub's loop-prevention policy). A PAT bypasses this so the changelog commit itself can be picked up by downstream workflows if needed.

Creating one:

  1. Go to GitHub \u2192 Settings \u2192 Developer settings \u2192 Personal access tokens \u2192 Fine-grained tokens
  2. Set repository access to Only select repositories \u2192 this repo
  3. Under Permissions \u2192 Repository permissions, set Contents to Read and write
  4. Set an expiration and add it as the CHANGELOG_PAT secret

If this secret is absent, changelog.yml falls back to GITHUB_TOKEN \u2014 the commit still happens, it just won't trigger further workflows.

"},{"location":"code/develop/#secrets-summary","title":"Secrets summary","text":"Secret Required by What happens if missing GPG_PRIVATE_KEY sign.yml Signing step fails \u2014 no .sig files produced GPG_PASSPHRASE sign.yml GPG import succeeds but signing fails VT_API_KEY release.yml VirusTotal step fails \u2014 release is not published CHANGELOG_PAT changelog.yml Falls back to GITHUB_TOKEN \u2014 changelog still updates, but commit won't trigger downstream workflows"},{"location":"code/develop/#cutting-a-release","title":"Cutting a release","text":"

Releases are tagged manually by maintainers. The tag_release.py script handles everything interactively.

"},{"location":"code/develop/#requirements","title":"Requirements","text":""},{"location":"code/develop/#import-the-release-key-first-time-only","title":"Import the release key (first time only)","text":"
gpg --import pgp/anonymousplanet-release.asc\n
"},{"location":"code/develop/#run-the-release-tagger","title":"Run the release tagger","text":"
python scripts/tag_release.py\n

The script will:

  1. Check the working tree is clean and you are on main
  2. Detect the latest tag and propose the next patch version
  3. Pull the matching changelog entry and format it as the tag message
  4. Show you the full tag message for review
  5. Ask for confirmation before creating anything
  6. Create a GPG-signed annotated tag with git tag -s
  7. Verify the signature
  8. Print the push command

To specify a version explicitly:

python scripts/tag_release.py --version v1.2.4\n

To preview without creating the tag:

python scripts/tag_release.py --dry-run\n

To use a different signing key:

python scripts/tag_release.py --key <fingerprint>\n
"},{"location":"code/develop/#push-the-tag","title":"Push the tag","text":"
git push origin v1.2.4\n
"},{"location":"code/develop/#trigger-the-release-workflow","title":"Trigger the release workflow","text":"

Pushing a tag does not automatically trigger release.yml (it listens to workflow_run from sign.yml, not tag pushes). After pushing the tag, go to Actions \u2192 Release \u2192 Run workflow and paste the most recent sign.yml run ID to publish the GitHub Release.

"},{"location":"code/develop/#verifying-a-release","title":"Verifying a release","text":"

Anyone can verify the authenticity of a release download.

# Import the release signing key\ngpg --import pgp/anonymousplanet-release.asc\n\n# Verify the PDFs\ngpg --verify thgtoa.pdf.sig      thgtoa.pdf\ngpg --verify thgtoa-dark.pdf.sig thgtoa-dark.pdf\n\n# Verify the hash files themselves\ngpg --verify sha256sums.txt.sig sha256sums.txt\ngpg --verify b2sums.txt.sig     b2sums.txt\n\n# Check the PDF hashes match\nsha256sum -c sha256sums.txt\nb2sum     -c b2sums.txt\n

A successful verify looks like:

gpg: Signature made ...\ngpg: Good signature from \"Anonymous Planet (Release) ...\"\n
"},{"location":"code/develop/#troubleshooting","title":"Troubleshooting","text":"

cairosvg missing during MkDocs build Install the imaging extras: pip install \"mkdocs-material[imaging]\". This is required by the social plugin.

KeyError: 'JPEG' in convert.py Pillow needs libjpeg for RGB\u2192PDF encoding. The script works around this by quantizing to palette mode before saving, so this error should not appear with the current code. If it does, reinstall Pillow after installing libjpeg: sudo apt install libjpeg-dev && pip install --force-reinstall pillow.

qpdf: can't find PDF header An older version of convert.py tried to pass PNG files to qpdf. Make sure you are running the current version \u2014 qpdf only accepts PDF inputs to --pages.

GPG signing fails on CI with No secret key The GPG_PRIVATE_KEY secret is missing or malformed. Re-export with gpg --armor --export-secret-keys <fingerprint> and paste the full block including the header and footer lines.

GPG signing fails with Bad passphrase The GPG_PASSPHRASE secret has a trailing space or newline. Paste it again carefully with no surrounding whitespace.

release.yml fails on VirusTotal The VT_API_KEY is missing, invalid, or over the rate limit (500 requests/day on the free tier). Check the secret and re-run the workflow after a few minutes.

Footnote warnings from MkDocs (link '#fnref:N' has no anchor) A footnote definition [^N]: exists without a matching inline citation [^N] in the body text. Add the citation where it belongs in the guide, or remove the orphaned definition.

"},{"location":"constitution/","title":"A Constitution for an Anonymous Planet.","text":"

To amend the rules and regulations of the network and of the PSA community, this constitution is hereby set forth. It is applicable to all the projects of the initiative, especially the Hitchhiker's Guide to Online Anonymity. All members/collaborators must abide by these lines when contributing within the context of the initiative.

"},{"location":"constitution/#requirements","title":"Requirements","text":"

Content is licensed under Creative Commons Attribution NonCommercial to prevent commercial usage.

"},{"location":"constitution/#anonymity-above-everything","title":"Anonymity above everything.","text":"

Anonymity is necessary to maintain the balance of power, specifically to help journalists, whistleblowers, lawyers, scientists, and victims of oppression. Anonymity first, even if that means using non-free and/or proprietary means. Security and privacy are second, again, even if using non-free or non-open-source and/or proprietary means. In this sense, the ends may at times justify proprietary means.

"},{"location":"constitution/#independence","title":"Independence.","text":"

The Anonymous Planet initiative has no affiliation with the \"Anonymous\" collective and does not endorse their activities. Any overlap of their activities and our guide are purely coincidental.

"},{"location":"constitution/#accessibility","title":"Accessibility.","text":"

We will strive to always keep available the following methods of reading the Hitchhiker's Guide:

"},{"location":"constitution/#freedom","title":"Freedom.","text":"

Maintain free, open-source, and non-commercial nature of all our projects. This does not mean proprietary and/or closed-source tools won't be recommendeded. All scientific knowledge should be free for anyone and we support and encourage Sci-Hub and LibGen. Any attempt to erode the freedom of information and flow of knowledge of our projects, in any manner, is hostile.

"},{"location":"constitution/#verifiability-falsifiability-and-reproducibility","title":"Verifiability, falsifiability and reproducibility.","text":"

We will make every effort to be transparent about any and all bias we have. Anyone claiming to be unbiased is lying, therefore we will not falsely claim to be.

All our content shall be verifiable, reproducible and fact-checked:

"},{"location":"constitution/#innocence","title":"Innocence.","text":"

Suspected offenders are innocent until proven guilty, with zero tolerance for abuse of power or position.

Any accusing/moderating member is:

Any offender has the right to:

"},{"location":"constitution/#freedom-of-thought","title":"Freedom of thought.","text":"

Open-minded and pragmatic - with no tolerance for gatekeeping.

Critical thinking and fact-checking are strongly encouraged; we welcome criticism including of a harsh nature (excluding ad-hominem and slurs).

"},{"location":"constitution/#we-do-not-tolerate-intolerance","title":"We do not tolerate intolerance.","text":"

See the Paradox of Tolerance, which includes hate speech.

"},{"location":"constitution/#no-analytics","title":"No analytics.","text":"

Note that, while we will never use analytics, the (now free) platforms hosting our content might be gathering such analytics outside of our control, such as Github pages. As the initiative progresses, we will strive to avoid these as soon as possible.

"},{"location":"constitution/#no-profit","title":"No profit.","text":"

Any excess donations will only be used to support our main projects first and possibly support other intitiatives (like hosting Tor exit nodes). In all cases, we abide by the following principles:

Disclaimer: it is possible that, coincidentally, a donation could correlate with a recommendation. It will then be clearly stated that while the donation was welcome, the donating entity will not be gaining visibility/coverage/endorsement/recommendations due to such a donation.

"},{"location":"constitution/#core-goals","title":"Core Goals.","text":"

Help people in need of anonymity to maintain both their physical and digital safety.

"},{"location":"constitution/#non-goals","title":"Non-Goals.","text":"

Help any people who are using this knowledge for bad purposes. Helping people takes precedence and we know our content can be used nefariously. Our initiative believes in having one good person given an anonymous voice, safely, is worth the risk of having several using our content for evil. As we do adhere to a fair \"rule of law\" system which, having 9 criminals and 1 innocent person free, is much better than having one innocent person in prison among 9 criminals.

Yours faithfully, Anonymous Planet

"},{"location":"contribute/","title":"How to Get Involved","text":"

There are multiple ways you can add to the guide. Donations to support this project are welcome but are entirely optional. Those donations are mainly used to pay for Tor onion hosting (VPS), mail hosting, domain name registration, and to maintain/run Tor exit nodes. No profit is ever being made. All donations and spendings are being logged here below for transparency. Some costs for load balancer servers have been omitted for privacy reasons, but are not paid for with existing Anonymous Planet finances.

Current project donation goals:

"},{"location":"contribute/#donate-using-monero-xmr","title":"Donate using Monero (XMR)","text":"

Total Monero donations received: 7.101317184263 XMR Total Monero remaining: 2.059336719397 XMR

Here is the address for the main project:

46crzj54eL493BA68pPT4A1MZyKQxrpZu9tVNsfsoa5nT85QqCt8cDTfy1fcTH1oyjdtUbhmpZ4QcVtfEXB337Ng6PS21ML

"},{"location":"contribute/#donate-using-bitcoin-btc","title":"Donate using Bitcoin (BTC)","text":"

Total Bitcoin donations received: 1.89353 mBTC Total Bitcoin remaining: 0 mBTC

Here are the addresses for the main project:

SegWit address: bc1qp9g2c6dquh5lnvft50esxsl97kupdpyqyd4kkv Legacy address: 1BBgBSVe6w4DWq2BewUQhDEjsNovhfPswD

___

"},{"location":"contribute/#content-contributions","title":"Content Contributions","text":"

You can easily contribute code or information suggestions at our code repositories listed at the bottom of the website and on the Mirrors tab above. We have many options that are easily accessible. Please follow our contributing guidelines and use good PR syntax.

Thank you for any contribution. All donations will be mentioned on this page.

"},{"location":"contribute/#donations-log","title":"Donations log","text":""},{"location":"contribute/#spendings-log","title":"Spendings log","text":"