Netherchat netherchat
Read the docs
The war room that vanishes.

Messaging that lives
below the surface

Self-hostable, end-to-end encrypted coordination for incidents and sensitive operations — with signed, verifiable records of what was decided.

Self-hostable, end-to-end encrypted, real-time messaging. A blind-relay server that cannot read your messages — proven by the build graph, not a promise. Your server. Your keys. Your rules.

$ curl -fsSL https://netherchat.com/install | bash

macOS · Linux · Windows (WSL2) · or docker run -p 3000:3000 salkreiner/netherchat

“We cannot read your messages.” Said literally.

The encryption lives in the client. The server is a blind relay — it routes ciphertext and sealed key blobs it has no key to open.

⛓️

Enforced by the build graph

The crypto package lives under tui/internal; Go's rules make it physically unreachable from the server binary. CI fails if that ever changes. It's a property of the import graph, not marketing.

🔑

Keys never touch the server

Identities are generated and stored on each device. Room keys are wrapped per-recipient with nacl/box and relayed as opaque blobs. No escrow, no recovery — by design.

📡

Zero telemetry, zero persistence

No analytics, no phone-home, ever. By default nothing is written to disk — rooms evaporate when empty. A Wireshark capture shows ciphertext only.

Honest about limits: forward secrecy is per-epoch (not per-message), and the group key-distribution layer is custom over audited primitives — slated for external review before any paid tier, with MLS (RFC 9420) as the migration target. See encryption.md.

Built for engineering teams

Designed to scale to everyone else without compromising the developer experience. Built for engineering teams; trusted for incident response and high-stakes coordination.

End-to-end encrypted

X25519 + XChaCha20-Poly1305 + Ed25519, audited pure-Go and WebCrypto-grade primitives. The same crypto in the terminal and the browser.

One static binary

No runtime, no dependencies. A ~7 MB FROM scratch image, or a single binary per platform. curl … | bash and you're done.

Terminal & browser

A modern TUI for power users and this web client for everyone else — both speak one documented wire protocol to the same server.

Eight themes, instant

nether, abyss, ember, ghost, sprinkles, dracula, gruvbox, solarized — switch with no reload. Try the picker above.

Pipes & webhooks

echo "deploy done" | netherchat send #ops. Every room gets an inbound webhook for CI and alerts. Any alert source can open a locked-down war room — a monitoring page, a CI failure, or a security tool posting a finding.

Ephemeral by default

/vanish rotates the room key and clears history. Room TTLs, one-time invite tokens, invite-only rooms.

Proven by a capture you run

netherchat doctor --paranoid runs a live packet capture against the relay and proves it routes only ciphertext — no plaintext, ever. Not a claim. A test you run yourself.

Incident timeline, two audiences

netherchat report renders the sealed record as a standalone HTML timeline — human-readable for leadership, cryptographically verifiable by engineers. One file, no server, works forever.

Relay-less when it matters

netherchat pair --lan forms an encrypted war room with no server at all — same keys, same crypto, zero infrastructure. When even the relay is suspect, the conversation continues.

Decisions you can prove

🔗

Signed, attributed decisions

Every /decide, /action, and approval is Ed25519-signed by the person who said it, hash-chained to everything before it, and sealed into a record you can verify offline — forever, with no server and no account.

✓✓

Cryptographic two-person rule

High-stakes actions — scuttle a room, run a runbook, approve an artifact — require N-of-M independent Ed25519 signatures before they fire. Not a policy. A protocol primitive.

📋

AI drafted, human approved

An agent proposes an artifact (hash only — content never crosses). A named human approves under the two-person rule. The sealed record proves who drafted it, who approved it, and when — verifiable offline after the room is gone.

🔍

Verify with no server

netherchat verify record.json checks the full hash chain and every signature offline, after the room is gone, on any machine. VALID or TAMPERED — no account, no relay, no trust required.

🔥

Proof of destruction

Scuttle a room and a co-signed receipt is written before the keys are zeroized — proof of what was destroyed and when. The one artifact that outlives the room, verifiable offline. Ephemerality you can prove, not just promise.

👁

Proven blind, not promised

doctor --paranoid taps the live relay and shows only ciphertext crossing the wire, entropy-checked. Not a README claim — a capture you run yourself against the real server.

Run it yourself in one line

1

Start the relay

$ docker run -p 3000:3000 salkreiner/netherchat
2

Install the terminal client

$ curl -fsSL https://netherchat.com/install | bash
3

Join from a browser

Share a one-time /break-glass link. Anyone clicks it, types a name, and they're in the room — no install, no account.

Make it yours