Chat privately.
No trace. No cloud.

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.

View on GitHub npm package
$ npm install -g zypher-chat
alice — local server
$ zypher local bob
bob — local server
$ zypher local alice

What you get

Everything you need for private comms. Nothing you don't.

E2E

End-to-end encrypted

X25519 key exchange with AES-256-GCM message encryption. Ed25519 signatures on every message. The server sees only opaque ciphertext — always.

FS

Forward secrecy

Per-message ephemeral ratchet keys. Compromising today's session key reveals nothing about past messages. Each message is independently protected.

GRP

Encrypted group chats

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.

Offline message queues

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.

👻

Ghost mode

One command wipes all local state — keys, saved servers, message history. Disappear completely. Nothing lingers on disk after /ghost.

SRV

Self-hosted

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.

How it works

Up and running in under a minute.

1

Spin up a server

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.

2

Register and connect

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.

3

Start a conversation

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.

4

Chat — and join groups

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.

Security model

Real crypto. Clear threat model.

Key exchange X25519

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.

Message encryption AES-256-GCM

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.

Identity verification Ed25519

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.

Forward secrecy Ratchet

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.

Key exchange per message:
Ephemeral X25519 Identity pre-key Ed25519 sig AES-256-GCM payload

Commands

The full CLI. This is all of it.

Server management

zypher server quickstart  # clone, configure & launch
zypher server stop        # stop the local daemon
zypher server status      # show daemon status

Connect & chat

zypher new              # add server, register/login
zypher local alice      # chat on saved server "local"
zypher settings         # manage servers & accounts
zypher help             # show help

In-chat commands (DMs)

/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

In-chat commands (groups)

/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