Tier 1 — New features: - E2E encrypted friend list: server stores opaque blob (POST/GET /v1/friends), protocol-level encrypt/decrypt with HKDF-derived key, 4 tests - Telegram Bot API compatibility: /bot/register, /bot/:token/getUpdates, sendMessage, getMe — TG-style Update objects with proper message mapping - ETH address resolution: GET /v1/resolve/:address (0x.../alias/@.../fp), bidirectional ETH↔fp mapping stored on key registration - Seed recovery: /seed command in TUI + web client - URL deep links: /message/@alias, /message/0xABC, /group/#ops - Group members with online status in GET /groups/:name/members Tier 2 — UX polish: - TUI: /friend, /friend <addr>, /unfriend <addr> with presence checking - Web: friend commands, showGroupMembers() on group join - Web: ETH address in header, clickable addresses (click→peer or copy) - Bot: full WireMessage→TG Update mapping (encrypted base64, CallSignal, FileHeader, bot_message JSON) Documentation: - USAGE.md rewritten: complete user guide with all commands - SERVER.md rewritten: full admin guide with all 50+ endpoints - CLIENT.md rewritten: architecture, commands, keyboard, storage - LLM_HELP.md created: 1083-word token-optimized reference for helper LLM Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
12 KiB
featherChat Usage Guide
Version: 0.0.21
Installation
Build from Source
Requirements: Rust 1.75+, cargo
git clone <repo-url>
cd warzone
cargo build --release
# Binaries output to target/release/:
# warzone-server — relay server (with embedded web client)
# warzone-client — CLI / TUI client
WASM Build (Web Client)
Requirements: wasm-pack
cd crates/warzone-wasm
wasm-pack build --target web
# Output in pkg/ — copy to the web client directory
Linux Cross-Compile
The scripts/build-linux.sh script builds Linux x86_64 binaries on a Hetzner Cloud VPS.
# Full pipeline: create VM, build, download binaries
./scripts/build-linux.sh --all
# Or step by step:
./scripts/build-linux.sh --prepare # Create VM, install deps, upload source
./scripts/build-linux.sh --build # Build release binaries on the VM
./scripts/build-linux.sh --transfer # Download binaries to target/linux-x86_64/
./scripts/build-linux.sh --destroy # Delete the VM
# One-command ship to all production servers:
./scripts/build-linux.sh --ship # prepare + build + transfer + deploy + destroy
Server Configuration
warzone-server --bind 0.0.0.0:7700 --data-dir ./warzone-data
| Flag | Default | Description |
|---|---|---|
--bind |
0.0.0.0:7700 |
Listen address |
--data-dir |
./warzone-data |
sled database path |
Environment variables:
| Variable | Default | Description |
|---|---|---|
WARZONE_ADMIN_PASSWORD |
admin |
Password for admin alias ops |
RUST_LOG |
info |
Log level filter |
Identity
Generate a New Identity
warzone-client init
# Prompts for passphrase
# Displays fingerprint + 24-word BIP39 mnemonic
# SAVE THE MNEMONIC — it is the only way to recover your identity
The seed is stored at ~/.warzone/identity.seed, encrypted with Argon2id + ChaCha20-Poly1305.
Recover from Mnemonic
warzone-client recover abandon ability able about above absent absorb abstract ...
# Prompts for passphrase, restores the same identity
View Your Identity
warzone-client info
# Fingerprint: a3f8:c912:44be:7d01:9e5a:3b2c:7f80:12d4
In the TUI, use /info to display your fingerprint, /seed to display your 24-word recovery mnemonic, and /eth to display your Ethereum address.
Ethereum Address
Your ETH address is derived from the same seed via domain-separated HKDF. One seed, dual identity.
warzone-client eth
# Fingerprint: a3f8:c912:44be:7d01:9e5a:3b2c:7f80:12d4
# Ethereum: 0x71C7656EC7ab88b098defB751B7401B5f6d8976F
Addressing
featherChat supports three addressing modes. All three work anywhere a peer address is accepted:
| Format | Example | Description |
|---|---|---|
| Fingerprint | a3f8:c912:44be:7d01:9e5a:3b2c:7f80:12d4 |
SHA-256 of Ed25519 pubkey, 8 groups of 4 hex digits |
| Alias | @alice |
Human-readable, server-resolved |
| ETH address | 0x71C7...976F |
Ethereum address derived from the same seed |
TUI Client
Launch the interactive terminal UI:
warzone-client chat --server http://your-server:7700
warzone-client chat @alice --server http://your-server:7700
warzone-client chat a3f8:c912:... --server http://your-server:7700
Complete Command Reference
Peer and Navigation
| Command | Description |
|---|---|
/peer <fingerprint> |
Set DM peer by fingerprint |
/p @alias |
Set DM peer by alias (short form of /peer) |
/peer 0x... |
Set DM peer by ETH address |
/r [message] |
Reply to last DM sender; optionally include an inline message |
/dm |
Switch to DM mode (clear group context) |
/peer a3f8:c912:44be:7d01:9e5a:3b2c:7f80:12d4
/p @alice
/peer 0x71C7656EC7ab88b098defB751B7401B5f6d8976F
/r
/r hey, got your message
/dm
Groups
| Command | Description |
|---|---|
/g <name> |
Switch to group (auto-joins if not a member) |
/gcreate <name> |
Create a new group (you become creator) |
/gjoin <name> |
Join an existing group |
/gleave |
Leave the current group |
/gkick <fp_or_alias> |
Kick a member (creator only) |
/gmembers |
List members of the current group with online status |
/glist |
List all groups on the server |
/gcreate ops-team
/g ops-team
/gmembers
/gkick @mallory
/gleave
/glist
When in a group, the header bar shows #groupname and all messages are sent to that group.
Alias Management
| Command | Description |
|---|---|
/alias <name> |
Register an alias for your fingerprint |
/aliases |
List all registered aliases |
/unalias |
Remove your alias |
Alias rules: 1-32 alphanumeric characters (plus _ and -), case-insensitive, normalized to lowercase. TTL is 365 days of inactivity, with a 30-day grace period. Registration returns a recovery key — save it.
File Transfer
| Command | Description |
|---|---|
/file <path> |
Send a file to the current peer or group |
/file /path/to/document.pdf
/file ./photo.jpg
Files are split into 64 KB chunks, each encrypted with the Double Ratchet session key. The recipient reassembles and verifies a SHA-256 hash over the complete file. Maximum file size is 10 MB. Received files are saved to the current directory.
Contacts and History
| Command | Description |
|---|---|
/contacts or /c |
List all contacts with message counts |
/history or /h |
Show message history for current peer (last 50) |
/history <fp> |
Show history for a specific peer |
Identity and Security
| Command | Description |
|---|---|
/info |
Show your fingerprint |
/eth |
Show your Ethereum address |
/seed |
Show your 24-word recovery mnemonic |
/devices |
List your active device sessions |
/kick <device_id> |
Revoke a specific device session |
Friend List
| Command | Description |
|---|---|
/friend |
List friends with online/offline status |
/friend <address> |
Add a friend by fingerprint or alias |
/unfriend <address> |
Remove a friend |
The friend list is end-to-end encrypted and stored on the server as an opaque blob. The server cannot read it. Presence status (online/offline) is shown next to each friend.
General
| Command | Description |
|---|---|
/help or /? |
Show command list |
/quit or /q |
Exit the TUI |
Keyboard Navigation
| Key | Action |
|---|---|
| PageUp / PageDown | Scroll messages by 10 |
| Up / Down (when input is empty) | Scroll messages by 1 |
| Ctrl+End | Snap scroll to bottom |
| Left / Right | Move cursor in input |
| Home / Ctrl-A | Beginning of line |
| End / Ctrl-E | End of line |
| Ctrl-U | Clear input |
| Ctrl-W | Delete word before cursor |
| Ctrl-C | Quit |
Receipt Indicators
| Indicator | Meaning |
|---|---|
| Single tick | Sent (no confirmation yet) |
| Double tick (gray) | Delivered (decrypted by recipient) |
| Double tick (blue) | Read (viewed by recipient) |
Web Client
Access
Navigate to the server URL in a browser (e.g., http://your-server:7700). The web client generates a new identity automatically on first visit. Your seed is stored in localStorage — back it up using /seed.
The web client uses the same E2E encryption as the TUI, compiled to WASM.
URL Deep Links
The web client supports deep links for direct navigation:
| URL | Effect |
|---|---|
/message/@alice |
Opens a DM with the alias @alice |
/message/0xABC... |
Opens a DM with an ETH address |
/group/#ops |
Opens the group #ops |
Share these links to let someone jump straight into a conversation.
Clickable Addresses
Fingerprints and addresses displayed in messages are clickable. Clicking an address sets it as your DM peer. If you are currently typing, clicking copies the address instead.
Supported Commands
The web client supports the same slash commands as the TUI: /peer, /p, /r, /dm, /g, /gcreate, /gjoin, /gleave, /gkick, /gmembers, /glist, /alias, /aliases, /unalias, /file, /contacts, /c, /history, /h, /info, /eth, /seed, /friend, /unfriend, /devices, /kick, /help, /quit.
Groups
Creating and Using Groups
/gcreate ops-team # Create (you become creator)
/g ops-team # Switch to group (auto-joins if needed)
/gjoin ops-team # Explicitly join an existing group
Once in a group, all messages you type go to that group. The server fans out to all members.
Membership
/gmembersshows all members with aliases and online status.- The creator can kick members with
/gkick <fingerprint_or_alias>. - Any member can leave with
/gleave.
Sender Keys
The protocol uses Sender Keys for efficient group encryption. Each member generates a random 32-byte chain key, distributes it to all other members over 1:1 encrypted channels, and encrypts group messages with their sender key. This gives O(1) encryption cost per message instead of O(N). Sender keys are rotated on member join or leave.
File Transfer
Files are transferred end-to-end encrypted through the relay server.
- The sender reads the file and splits it into 64 KB chunks.
- A
FileHeadermessage is sent with the filename, total size, chunk count, and SHA-256 hash. - Each
FileChunkis encrypted with the Double Ratchet session and sent sequentially. - The recipient reassembles all chunks and verifies the SHA-256 hash.
- The completed file is saved to the current directory.
Maximum file size: 10 MB. Chunk size: 64 KB.
Friend List
The friend list provides presence tracking for contacts you care about.
/friend <address>adds a friend (by fingerprint or alias)./friendlists all friends with their current online/offline status./unfriend <address>removes a friend.
The friend list is encrypted client-side and stored on the server as an opaque blob. The server relays it but cannot read its contents.
Federation
Federation connects two featherChat servers so that users on different servers can message each other transparently.
Setup
Each server needs a federation config file:
{
"server_id": "alpha",
"shared_secret": "long-random-string-shared-between-both-servers",
"peer": {
"id": "bravo",
"url": "http://10.0.0.2:7700"
},
"presence_interval_secs": 5
}
Start the server with federation enabled:
warzone-server --bind 0.0.0.0:7700 --federation federation.json
How It Works
The two servers maintain a persistent WebSocket connection between them. When a client on server Alpha sends a message to a fingerprint registered on server Bravo, server Alpha forwards the message over the federation link. The recipient's server delivers it via their normal WebSocket connection. Presence information is exchanged on a configurable interval.
From the user's perspective, federation is transparent. You address peers the same way regardless of which server they are on.
Multi-Device
Setup
- On the new device, recover from mnemonic:
warzone-client recover <24 words> - Register with the server:
warzone-client register --server http://... - Both devices share the same fingerprint and receive messages.
Device Management
/deviceslists all active sessions for your identity./kick <device_id>revokes a specific device session.
Ratchet sessions are per-device and not synchronized between devices. Use encrypted backup/restore (warzone-client backup / warzone-client restore) to transfer session state.
Encrypted Backup and Restore
# Export sessions and pre-keys, encrypted with your seed
warzone-client backup my-backup.wzb
# Restore on another device (requires same seed)
warzone-client restore my-backup.wzb
The backup contains all Double Ratchet sessions and pre-key secrets. It is encrypted with HKDF(seed, info="warzone-history") + ChaCha20-Poly1305.