Proof Docs GitHub Console
Don't trust, verify

Every privacy claim, linked to the test that checks it.

PARANOID is open source. On every change, GitHub's own machines rebuild it from scratch and run the full test suite, a real bubblewrap sandbox and a real Tor network check. The logs are public; nobody, including us, can edit them.

Tests
47 / 47
0 failed, 0 skipped
Live bubblewrap
Pass
real bwrap, Ubuntu 24.04
Live Tor
Pass
real Tor network
Commit
run 41899533592 · 4 Nov 2026

Live checks

Two checks run against the real thing, not a stand-in. Output copied from the public run log (exit addresses truncated by the script itself).

Tor isolation LIVE

A real Tor daemon; requests go through PARANOID's own SOCKS5 code. torproject.org must confirm every exit is Tor; one conversation must keep its exit; three conversations must not share one.

conversation A, request 1: exit 192.42.116.x  IsTor=true
conversation A, request 2: exit 192.42.116.x  IsTor=true
conversation B:            exit 83.217.9.x    IsTor=true
conversation C:            exit 171.25.193.x  IsTor=true
PASS: every exit is Tor, a conversation keeps
      its circuit, conversations are isolated

scripts/verify-tor.ts

bubblewrap sandbox LIVE

A real bwrap. Before running, the isolation probe must find uid 65534, only the loopback interface, no /mnt, /home, /root or /etc/passwd, and a read-only /usr; the test then runs a script inside and checks the same from its output. The run fails if this test is skipped.

✔ live: real bubblewrap blocks network and host files
ℹ tests 1
ℹ pass 1
ℹ fail 0
ℹ skipped 0

test/bwrap.test.ts#L140

Property → evidence

Each link opens the exact test, at the verified commit. Tests use a recording stand-in for the AI provider, so they can assert what the provider would have received.

PropertyEvidenceKind
The AI provider receives only the sanitized text, over Tor, and the answer is restored on your machineprivacy.test.ts#L30test
If local sanitization fails, the original prompt is never sent (server error, bad JSON, wrong count, empty output, model server down)sanitizer.test.ts#L68sanitizer.test.ts#L76privacy.test.ts#L10test
Raw identifiers never reach even the local model: deterministic rules run firstsanitizer.test.ts#L60sanitizer.test.ts#L9test
People and organizations named by the local model are masked even if its rewrite would keep themsanitizer.test.ts#L42test
Code is kept byte for byte; identifiers reintroduced by the rewrite are masked againsanitizer.test.ts#L25test
Without verified Tor, nothing is sent: no fallback to a direct connectionprivacy.test.ts#L19tor.test.ts#L71test
Each conversation gets its own Tor circuit; DNS is resolved by the Tor exit, not locallytor.test.ts#L57tor.test.ts#L45CI runtest + live
A profile never downgrades itself: a missing layer means 409 and nothing forwardedserver.test.ts#L86server.test.ts#L47privacy.test.ts#L71test
Sending an unsanitized prompt is impossible outside Standard modeprivacy.test.ts#L54privacy.test.ts#L63test
Paranoid never uses your API key: it pays only with a zkAPI lease, and a foreign lease endpoint is refusedprivacy.test.ts#L87test
Agent tools run sandboxed, never implicitly; their output is re-masked before the model sees itprivacy.test.ts#L107privacy.test.ts#L132test
The JavaScript sandbox exposes no network, filesystem or process APIprivacy.test.ts#L107test
The shell sandbox has no network, no host files and no privileges, and is offered only after its isolation probe passesbwrap.test.ts#L140bwrap.test.ts#L31bwrap.test.ts#L100CI runtest + live
Websites cannot drive the local daemon: foreign Host, Origin and cross-site requests are refused (DNS rebinding, CSRF)server.test.ts#L27server.test.ts#L122test
The API cannot point the sanitizer off your machine or the provider at another hostserver.test.ts#L111test
Cover traffic needs verified Tor and stays within its budgetsprivacy.test.ts#L171privacy.test.ts#L185test
No invented balances: the wallet lives in your browser and the daemon never reports funds it does not holdserver.test.ts#L103test
The zkAPI relay only reaches the SDK's pinned hosts, and only over Torserver.test.ts#L56server.test.ts#L76test

What this does not prove

Tests show the code does what it claims. They do not cover everything:

Verify it yourself

Same commands as the public run, on your machine:

git clone https://github.com/paranoidfamily/paranoid
cd paranoid
git checkout b288eb3
npm ci
npm test                               # 47 tests (the live bwrap test runs where bwrap exists)
node scripts/verify-tor.ts 9050        # needs a running Tor on 127.0.0.1:9050

PARANOID is not affiliated with Vitalik Buterin, the Ethereum Foundation, Open Anonymity or the Tor Project. The verification run is executed by GitHub Actions on GitHub-hosted runners.