Your accounts, unlinkable by default.

Veil carries the reads your apps make through the Ethereum Foundation's anon-rpc over Tor, with one circuit per account, so the providers your apps talk to never see your IP or tell your accounts apart. And it keeps dapps working even when their providers block Tor.

No account · no telemetry · open source · Chrome & Brave
YOUR ACCOUNTS WHAT PROVIDERS SEE 0x a1b2… 0x c3d4… 0x e5f6… Without Veil Direct NO TOR · YOUR IP 203.0.113.7 SAME PERSON 203.0.113.7 SAME PERSON 203.0.113.7 SAME PERSON With Veil Veil ANON-RPC · TOR 185.220.101.63 UNRELATED VISITOR 185.220.101.108 UNRELATED VISITOR 23.129.64.217 UNRELATED VISITOR

With Veil off, every account exits from one IP, so a provider links them. With Veil on, each account gets its own Tor circuit and a distinct exit.

Why it's different

Privacy shouldn't wait for apps to adopt it.

The real fix is apps integrating anon-rpc, but only a couple have, all opt-in, and until the rest do, you are the one who pays, with every read exposed. Veil moves the decision to you: no new app to learn, turn it on once, and every wallet and dapp you already use is private the moment you open it.

The apps you already open, private the moment you do.

The old way: app by app

Each dapp and wallet has to integrate privacy itself. Only a couple have, all opt-in. You wait, app by app, and most never do.

With Veil: your decision

Turn it on once. Every wallet and dapp you already use is private, per account, with zero changes from them.

Why a VPN or Tor Browser isn't enough

A VPN gives all your accounts one IP, so they still look like one person. Tor Browser isolates by site, not by account, so two wallets on the same dapp share an exit, and many providers block it outright. Veil gives each account its own circuit.

VPN / Tor Browser one exit

account A→203.0.113.7
account B→203.0.113.7
account C→203.0.113.7
A, B, C → one person

Veil a circuit per account

acct:0x28c6…→171.25.193.78
acct:0xd8dA…→45.9.168.92
neutral→185.220.101.98
three strangers
See it work

One toggle. Everything else is designed, not left to errors.

The extension is the part most people see: a single switch, a popup that shows exactly what each tab protected, a live feed of every read it carries over Tor, and an honest prompt when a site fights back.

Welcome to Veil

Private by default

One route per account over Tor. Re-routes around providers that block it - and never falls back to direct without asking.

Protection is on
Dapp reads leave through Tor
Hidden
  • Your IP
  • Accounts linked
Still visible
  • Addresses you query
First run. Honest about what's hidden and what isn't - before you turn it on.
stake.lido.fi
Veil
Private · Tor ready in 1s
This tab
stake.lido.fi
  • 21 requests protected
  • 2 accounts on 2 separate routes · 1 shared
Today1,284 req · 9 sites
Everyday. Per-tab: what's protected, how many separate routes, what got re-routed.
app.aave.com
Veil
PRIVACY CHOICE

app.aave.com's data provider blocks anonymous access.

We can't route this request privately and can't safely re-route it. You can allow a direct (non-private) connection for this site - or keep it blocked.

Keep blocked
Allow direct for this site
We remember your choice. Change it anytime in the popup.
When a site fights back. The only path to a direct connection - your explicit, per-site choice.
Honest about privacy

Private where it counts, honest where it can't be.

Privacy you don't actually have is worse than none.

Hidden from providers
  • Your IP address
    On every dapp read.
  • That your accounts belong together
    For RPC traffic, each account gets its own route, so providers see unrelated strangers.
Still visible
  • The addresses you query
    Providers still see which addresses you read. Hiding that needs private information retrieval (PIR), which is on the roadmap.
  • Your wallet's own account calls
    Some wallets ask their own backend for all your accounts in one call. Veil removes your IP from it, but that backend still sees your accounts grouped together, a link made inside the wallet, not by the reads Veil routes.
How it works

One intercept, a circuit per account, nothing silently direct.

Veil sits between the page and its RPC provider. No change to the dapp, no new endpoint - it catches the reads the app already makes and carries each one over Tor, hash-pinned and sandboxed.

  1. 1

    Catch the read in the page

    At document_start, before the dapp's own scripts run, Veil wraps window.fetch and XMLHttpRequest. Every JSON-RPC read goes through one of those, so a single hook covers viem, ethers v5/v6 and raw XHR with no per-app integration. The rare read over a WebSocket or Web Worker isn't wrapped yet, a negligible slice of traffic.

  2. 2

    Key it to one account, blind the id

    Veil reads which account the request is for - from the params, or from inside eth_call calldata, ignoring the zero address - and gives it an anon-rpc isolation key. The same account always rides the same Tor circuit; two accounts never share one. The JSON-RPC id is blinded (viem numbers requests from one global counter) so a provider can't stitch routes back together by id.

  3. 3

    Send it over Tor, sandboxed

    The read is handed to the anon-rpc harness: a null-origin, sandboxed iframe running tor-js, a full Tor client compiled to WebAssembly. Its code is fetched at runtime but hash-pinned on-chain and verified before it runs, with no access to your keys, DOM or cookies. It builds a circuit through a blind KPS gateway that relays only encrypted bytes - never your traffic or destination - and reaches the provider from a Tor exit unique to that account.

  4. 4

    Re-route around a block, only after a real one

    If a provider refuses Tor (Aave's blocked all 16 of our test reads), Veil re-sends standard reads to a Tor-friendly provider on the same chain - but only after a real block, and only for endpoints it knows are a single standard RPC. A multichain gateway is never blindly re-routed (that would break it); it falls to your per-site choice.

  5. 5

    Never silently direct

    A read that can't be made private is blocked, or asks you - per site - before any direct connection. Nothing leaves in the clear, and nothing leaks while the first circuit is still building.