Kryptovox is a self-hosted, end-to-end encrypted chat app with the feel of iMessage — bubbles, tapbacks, replies, and read receipts. Messages are encrypted on your device, and your server only ever stores ciphertext.
Most "private" chat apps still decrypt your messages on their servers. Kryptovox encrypts on your device with keys that never leave it — and then runs the whole thing on hardware you own.
X25519 key agreement with AES-256-GCM, per message and per recipient device — using the browser's Web Crypto, with private keys non-extractable. The server stores only ciphertext.
FastAPI, PostgreSQL, and Redis in Docker Compose — built to live on a Synology NAS behind a Cloudflare Tunnel, with no inbound ports.
Familiar bubbles, tapback reactions, quoted replies, read receipts, and typing indicators — realtime over WebSockets, smooth even in long conversations.
Public registration works only to create the very first admin — after that, the admin provisions every account. Your server, your people, nobody else.
Everything you expect from a polished chat app — encrypted end to end.
Direct messages and named groups with admin controls — add, remove, rename, leave.
React to any message with tapback emoji, and reply with a quoted preview — iMessage-style.
See delivery, reads, and live typing indicators across every conversation.
Real notifications on desktop and installed mobile PWAs, with keys generated on your server.
Verify any conversation with a fingerprint of every member device's keys — spot key changes instantly.
Sign in on multiple devices, see them all in Settings, and revoke any one of them.
A Spotlight-style jump box to fly between conversations without touching the mouse.
Rate limiting, CSRF defenses, strict input validation, CSP/HSTS, and nightly backups in the stack.
Display names, plus per-user control over read receipts and typing indicators.
Every message gets a random AES-256-GCM key, wrapped for each recipient device via X25519 key agreement — all in the browser's Web Crypto engine, with identity keys marked non-extractable. What travels the wire and lands in your database is ciphertext.
Even the person running the server — you — can't read anyone else's messages. That's the point.
You need Docker with Compose. Built for a Synology NAS behind a Cloudflare Tunnel — no inbound ports.
Copy the example env — the defaults work for a local trial.
One compose command brings up the app, Postgres, and Redis.
The first account registered becomes the admin, who invites everyone else.
Open https://localhost:5173, register — that first account is the admin. For production, point a Cloudflare Tunnel at your NAS and use your HTTPS domain.