v0.4.2veilchat / veilchat-protocolMIT GitHub ↗ npm veilchat ↗ npm protocol ↗

Veli Chat

E2EE · serverless · ephemeral · Tor v3 · RAM-only · padded

Two-party terminal chat that leaves nothing on disk. Every session generates an ephemeral X3DH bundle and a Tor v3 onion, exchanges one invite code out-of-band, completes a Double Ratchet handshake, then speaks XChaCha20-Poly1305 over 6-bucket padded frames. State lives in RAM and is wiped on /quit.

npx veilchat npm i -g veilchat && veil checking npm… checking GitHub…

Threat model

Assumes: Tor is not globally blocked, invite code is exchanged out-of-band (Signal, in-person).
Protects: confidentiality, forward secrecy, post-compromise, metadata minimization (no accounts, no logs, padded).
Does not: hide that you use Tor, protect if endpoint is compromised, or provide group chat. Safety numbers must be compared aloud via /whois (4×4 grid, BLAKE2b).
Crypto
X3DHDouble RatchetXChaCha20-Poly1305Ed25519BLAKE2b@noble/* audited
Transport
Tor v3 onionsSOCKS56 buckets 256B–256KiB--cover traffic--stealth (alt screen)Panic wipe
Ship
Node 22+ pnpm 9TypeScript 5.6pnpm workspacesbin veil / veilchatMITNo telemetry

Install & use

# fastest — no install
npx veilchat
# or global
npm i -g veilchat && veil
# inside: /help, /whois, /sendfile <path>, /quit

Flow: gen X3DH bundle + onion → share one invite code OOB → dial .onion via Tor → X3DH → Double Ratchet → chat → /quit wipes RAM. Verify with /whois 4×4 safety numbers aloud — if they match, no MITM.

Readme & threat model ↗ Issues MIT

Why it matters for internships

Shows you can reason about protocol composition (X3DH → Double Ratchet → padded transport), ship to npm with bins, and document a realistic threat model — not just demo crypto. The Ghost Track write-up proves you can break; Veli proves you can build with the same primitiv.