End-to-end encrypted terminal chat. X25519 key exchange, AES-256-GCM messages, forward secrecy, group chats, offline queues. Self-hosted, no accounts, no bullshit.
Everything you need for private comms. Nothing you don't.
X25519 key exchange with AES-256-GCM message encryption. Ed25519 signatures on every message. The server sees only opaque ciphertext — always.
Per-message ephemeral ratchet keys. Compromising today's session key reveals nothing about past messages. Each message is independently protected.
Invite others to groups via encrypted per-member key bundles. Each member gets their own encrypted copy of the group key. The server never sees plaintext group membership.
Send to someone who's offline. Messages queue on the server as ciphertext and are delivered automatically when they reconnect. Up to 500 messages queued per user.
One command wipes all local state — keys, saved servers, message history. Disappear completely. Nothing lingers on disk after /ghost.
Run your own server with one command. No third-party infrastructure, no vendor lock-in. Your server, your rules. Quickstart clones, configures, and launches it in seconds.
Up and running in under a minute.
Run zypher server quickstart. It clones the server repo, writes a config with a random JWT secret and master password, and starts a local daemon. Takes about 10 seconds. Skip this if you already have a server.
Run zypher new. Enter the server URL, choose a username and password. Your X25519 identity key and Ed25519 signing key are generated locally and published to the server as a key bundle. Your private keys never leave your machine.
Run zypher <server> <user>, e.g. zypher local alice. Zypher fetches the recipient's public key bundle from the server, performs an X25519 ECDH handshake, verifies their Ed25519 identity, and opens an encrypted channel. The key fingerprint is displayed so you can verify out-of-band.
Type messages. Use /chat @groupname to switch to a group or create one with an invite. Use /inbox to read queued messages, /status to check presence, /keys to verify fingerprints, and /ghost to vanish completely.
Real crypto. Clear threat model.
Session keys are derived via X25519 Diffie-Hellman between the sender's ephemeral key and the recipient's published pre-key. The shared secret is hashed to produce a 256-bit session key. The server never touches private keys.
Every message payload is encrypted with AES-256-GCM using a fresh random IV and per-message ratchet key. The GCM authentication tag detects any tampering. The server stores and forwards only opaque ciphertext blobs.
Every message is signed with the sender's Ed25519 private key. The recipient verifies the signature against the sender's published identity key. Impersonation requires breaking Ed25519 — not just compromising the server.
Per-message ephemeral ratchet keys mean each message uses a different encryption key derived from the previous one. Compromising one session key does not expose past messages. History stays private even if your current keys are stolen.
The full CLI. This is all of it.
zypher server quickstart # clone, configure & launch zypher server stop # stop the local daemon zypher server status # show daemon status
zypher new # add server, register/login zypher local alice # chat on saved server "local" zypher settings # manage servers & accounts zypher help # show help
/chat <name> # switch to a DM /chat @group # switch to a group /who # show current recipient /status # online status /keys # show key fingerprint /inbox # read queued messages /ghost # wipe local data & exit /quit # exit
/groups # list your groups /invite <user> # invite to current group /chat <name> # switch to a DM /chat @group # switch another group /ghost # wipe local data & exit /quit # exit