Serverless · End-to-End Encrypted · Onion Routing
A privacy-first desktop messenger that routes every message through the Anyone Protocol onion routing hidden services. No central servers. No phone number. No metadata harvesting. Your .anyone address is your only identity.
Features · How It Works · Architecture · Getting Started · Security Model · Roadmap · FAQ · License
Most messengers route your conversations through corporate servers that can see who you talk to, when, and how often - even when they can't read the contents. AnonChat is built differently:
-
No central servers - messages travel peer-to-peer between devices over Anyone Protocol hidden services.
-
Onion-routed transport - your IP is never exposed to the people you talk to; everyone is reachable only through a
.anyoneaddress. -
End-to-end encryption - a Signal-inspired Double Ratchet with authenticated (signed) prekeys protects every message.
-
Local-first - all history lives on your device, encrypted at rest. Nothing is uploaded anywhere.
-
No identifiers - no phone number, no email, no account. You are your key.
-
End-to-end encryption - Double Ratchet (X3DH handshake, forward secrecy) over NIST P-256, AES-256-GCM, HKDF/HMAC-SHA256.
-
Signed prekeys - your medium-term prekey is signed by a separate identity signing key (ECDSA P-256), so a man-in-the-middle can't substitute it. Verification is fail-closed.
-
Anyone Protocol hidden services for all transport - content and network location are hidden.
-
Encrypted at rest - history is sealed with a PBKDF2-600k + AES-GCM key. Optionally bound to the OS keychain for frictionless unlock, or protected by a PIN.
-
Trust-on-first-use pinning with safety-number verification per contact.
-
Real-time 1:1 messaging over the onion network, with optimistic send and delivery status.
-
Group chats (up to 10 members) with admin controls, descriptions, and member management.
-
Replies, reactions, and disappearing messages (per-conversation TTL).
-
Voice messages and drag-and-drop file / image / video sharing (session-only by design).
-
Read receipts (opt-in), pinned conversations, unread separators, and jump-to-latest.
-
Message search across a conversation, and local petnames for contacts.
-
Neutral dark & light themes, adjustable chat font size.
-
OpenMoji emoji picker (~1,270 emoji) organized into the categories you expect - Recent, Smileys, People, Animals, Food, Activities, Travel, Objects, Symbols, Flags.
-
Six languages out of the box: English, Spanish, French, Italian, German, Portuguese.
-
Live Circuits / Relays panel and World globe showing the actual relays your traffic passes through - nickname, fingerprint, bandwidth, and flags.
-
Hidden-service health and bootstrap status.
-
Manual circuit rotation.
-
Identity creation — on first launch, AnonChat generates your encryption keys and starts an Anyone Protocol hidden service. Your
.anyoneaddress is derived from your key. -
Address exchange — you and your contact share
.anyoneaddresses through a channel you already trust (in person, or another secure app). Never rely on a stranger sending you one. -
Session establishment — adding a contact fetches and pins their public keys and signed prekey; the first message runs an X3DH handshake to derive a shared secret.
-
Secure messaging — every message is sealed with the Double Ratchet and routed as ciphertext through the onion network. Your node only ever relays encrypted payloads.
-
No phone number or email
-
No account or central server logs
-
No IP exposure to peers
-
Only encrypted payloads over anonymous routing
AnonChat is an Electron desktop app wrapping a local Node.js backend and a sandboxed web UI. There is no cloud component — the "server" is a loopback process on your own machine that speaks to the Anyone network.
| Layer | Technology |
|---|---|
| Desktop shell | Electron 42 (Chromium 148, Node 22 LTS) |
| UI | Vanilla JS in a sandboxed renderer (contextIsolation, sandbox, no nodeIntegration) |
| Local backend | Express / Node.js (server.js) — onion-facing + loopback routers |
| Encryption | WebCrypto: Double Ratchet + X3DH, P-256, AES-256-GCM, ECDSA-signed prekeys |
| Transport | Anyone Protocol hidden services (.anyone addresses) |
| At-rest | PBKDF2-600k + AES-GCM, optional OS-keychain key wrapping (safeStorage) |
| i18n | 6 languages, ~220 keys each |
anyone-chat/
├── server.js # local backend: onion-facing + loopback APIs
├── start.js # bootstrap + process supervision
├── public/ # web UI (sandboxed renderer)
│ ├── app.js # client logic
│ ├── ratchet.js # Double Ratchet + X3DH + signed prekeys
│ ├── crypto.js # primitives
│ ├── i18n.js # 6-language strings
│ ├── emoji/ # OpenMoji PNGs
│ └── styles.css
├── lib/ # circuits, outbox, pow, ratelimit, store
└── desktop/ # Electron main process, preload, splash, packaging
-
Node.js 22 LTS
-
An Anyone Protocol
anonbinary, v0.4.10.2 or newer (required for.anyoneaddress support). Either place it on yourPATHasanon, or pointANON_BINARYat it. -
Linux, macOS, or Windows
AnonChat can be started in two modes:
Desktop app (Electron shell — recommended):
# Clone
git clone https://github.com/xmranonp/anyone-chat.git
cd anyone-chat
# 1. Install backend dependencies (express, ws, etc.)
npm install
# 2. Install the Electron shell and build tooling
cd desktop && npm install
# 3. Stage the app + portable Node runtime + anon binary into desktop/resources/.
# Required once after cloning, and again whenever you re-extract a build tarball.
ANON_BIN=/path/to/anon-v0.4.10.2/anon ./prepare-resources.sh
# 4. Launch the Electron desktop app.
ANON_BIN=/path/to/anon-v0.4.10.2/anon npm startWeb-only mode (no Electron — opens in your browser at http://localhost:4000):
# From the repo root (after npm install):
ANON_BINARY=/path/to/anon-v0.4.10.2/anon npm startPackaging stages the app, a portable Node runtime, and the anon binary into a
distributable. Run the staging script from desktop/ with ANON_BIN pointing
at your anon binary, then build:
cd desktop
# Install the build tooling (Electron + electron-builder)
npm install
# Stage resources (copies the anon binary + Node runtime into desktop/resources/)
ANON_BIN=/path/to/anon-v0.4.10.2/anon ./prepare-resources.sh
# Build for your platform (build each native package on its own OS):
npm run build # Ubuntu/Debian -> AppImage + .deb
npm run build:pacman # Arch/CachyOS -> .pacman + AppImage (needs libxcrypt-compat)
# Windows: run in PowerShell — use prepare-resources.ps1, then:
# npm run build:win # -> NSIS installer (.exe)AnonChat layers three independent protections:
-
Transport — Anyone Protocol onion routing hides both message content and your network location.
-
Application — a Double Ratchet (X3DH + forward secrecy) encrypts every message end-to-end, with signed prekeys authenticating the handshake.
-
Storage — local history is encrypted at rest (PBKDF2-600k + AES-GCM), optionally bound to the OS keychain or a PIN.
| Threat | Mitigation |
|---|---|
| Server compromise | No servers exist to compromise |
| Network surveillance | Anyone Protocol onion routing |
| Message interception | Double Ratchet end-to-end encryption |
| Prekey substitution / MITM | ECDSA-signed prekeys, pinned per contact (fail-closed) |
| Replay | Per-message consumed-key set in the ratchet |
| Offline disk access | At-rest encryption (keychain- or PIN-derived key) |
| Metadata analysis | No central server means no central metadata to collect |
-
Anyone Protocol hidden-service transport
-
Double Ratchet + X3DH end-to-end encryption
-
Signed prekeys (authenticated handshake)
-
Group conversations
-
Voice messages & file sharing (image, video and files)
-
Reactions, replies, disappearing messages
-
Encrypted-at-rest storage (PIN + OS keychain)
-
OpenMoji emoji picker, 6-language UI, dark/light themes
-
Live circuits / relays panel
-
Visualization of the latest used circuits via an interactive world map of relays
-
Reliable offline delivery hardening
-
Android version
Note: It is worth noting that this roadmap is a living document and is subject to change without prior notice.
AnonChat is provided as-is for privacy-focused communication. It implements industry-standard techniques, but no software can guarantee absolute security, and the cryptography has not been formally audited by an independent third party. You are responsible for your own operational security.
Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). See LICENSE for the full text.
Bundled third-party components (globe.gl, three.js, OpenMoji, Natural Earth data, the Anyone anon daemon, and npm dependencies) remain under their own licenses — see THIRD-PARTY-LICENSES.md.
Built for people who believe privacy is a right, not a feature.