2/2
anonymity π€ privacy π«‘
since this post on May 19. not papers, not testnets β running code
at real URLs.
THE EUREKA
one Ed25519 keypair, derived from a BIP-39 mnemonic at solana's
SLIP-0010 path m/44'/501'/0'/0', is simultaneously:
β’ a solana wallet (base58 of the pubkey)
β’ a Tor v3 .onion (base32 of pubkey β checksum β version)
β’ a Tape/PDA storage namespace
same 32 bytes, three encodings. phantom's mnemonic is a hidden
service key. you just didn't know.
THE CHAT APP β cohort (cwtch fork)
profile create = BIP-39 mnemonic β solana wallet Tor v3 .onion
cwtch peer id in one shot. SOL / SPL / Token-2022 send dialogs use
the same key that runs your .onion. killed the "Add Server" button
because groups are on-chain now β program EsrqfUpGβ¦BRqhG on mainnet,
BcwsnKq3β¦aRKv on devnet, no relay operator to subpoena. hybrid
persistence per group: on-chain leg (public, no operator) via-relay
leg (private metadata, single point of failure) β pick your trade.
THE PUBLISHER β
publish.ouija.social
burner wallet generated in your browser β signs a publish challenge
with ed25519 β we host a real Tor v3 .onion at the matching pubkey.
mnemonic lives in localStorage only. no phantom connect. your real
wallet never touches the page. "host this .onion for me" β browser
derives the Tor HS expanded secret (SHA-512(seed) clamped), POSTs
to /api/host-onion β server does ADD_ONION via Tor control port AND
writes the keys to disk so the HS survives container restarts.
middleware rewrites Host:<onion>.onion β /sites/<onion> so tor
browser visitors see a π§
served-over-tor banner instead of a
clearnet one.
THE RELAY β ouija-relay
go daemon, local HTTP signer on 127.0.0.1:18964, per-launch random
bearer token, listens on loopback only. holds the ed25519 key in
memory so the chat app chrome extension MCP browser dapps
don't have to. phantom-style approval prompts (osascript modal on
mac, /v1/pending-approvals for any client) before sign-message /
sign-tx / transfer-sol. trust-origin TTL so the chat app doesn't
nag every signature.
THE MCP β ouija-mcp
two paths for agents, neither of which surfaces a mnemonic:
β’ ephemeral_create β generates a burner in MCP-process memory.
key dies on server restart. agent gets its own throwaway
identity per session.
β’ relay_sign_* β forwards to the local ouija-relay so agents
drive the USER'S persistent wallet via HTTP. relay prompts the
human for approval; the LLM never sees the key material.
THE ADAPTER β @ouija/wallet-standard
TS package implementing the solana wallet standard, backed by the
local relay. window.ouija appears in any dapp via standard register.
custom ouija:identity feature exposes the matching .onion so dapps
that know about it can read it without re-deriving. agent-grade API
(OuijaAgentClient, BurnerSigner) for playwright / node drivers β
same flows, no browser.
THE NAMING β AllDomains Β· .stacc
register yourname.stacc β owner = your burner β anyone with the
ouija-onion-resolver chrome extension types yourname.stacc in the
URL bar β extension intercepts pre-DNS, reads on-chain owner,
derives the .onion from that pubkey, redirects the tab. no DNS,
no CA, no domain registrar. the name follows the key.
THE FUNDING GUIDE β /privacy-funding
because the first thing a chain analyst follows is "where did this
burner get its SOL from":
β’ houdiniswap, changenow β chain hops to break the graph
β’ XMR bridge (Kraken β Monero β swap to SOL via Trocador) β
actual unlinkability
β’ cash β SOL via LocalCoinSwap β no digital trail at all
each entry says EXPLICITLY what it breaks and what it doesn't
(chain graph yes, IP / fingerprint / stylometry no).
THE TRUST DISCLOSURE β /trust-tradeoffs
on every published page footer: we know your key when you used the
convenience button. self-host the Tor HS yourself if your threat
model needs it (we ship the 4-command recipe). no warrant canary
lies, no "trust us bro."
THE DEPLOY
fly.io single container, tor next.js persistent volume. on
every redeploy
start.sh scans /data/tor/hidden-services/ and brings
every persisted onion back up before next.js takes its first
request. clearnet at
publish.ouija.social, .onion via the same
machine.
obfuscation as the default. zero protocol secrets β the math is in
@noble/curves and the derivation matches a published test vector
you can verify offline. no ZK theater. no marketing-deck encryption.
the only trust assumption is whether the convenience operator turns
evil, and we tell you exactly what that costs how to opt out.
that's the right shape for privacy in 2026.