# Current status (Phase 2 prep / v0.1.x) This file describes what the repository actually does today. Protocol and security docs may describe future phases. When in doubt, trust this file. Last updated: 2026-06-29. --- ## What works - **Gateway (TCP):** Ed25519 client auth, sessions, channel join/leave, text chat, SQLite history, guilds, roles, permissions, invites, audit log, rate limiting. - **Gateway (HTTP admin):** `GET /health`, `GET /version`, `GET /metrics` (Prometheus exposition). Default bind 0.0.0.0:7601. - **Voice node (UDP):** relay between clients in the same channel; members expire after 30 s idle; jitter buffer wired into relay path. - **Client:** connect UI, channel list, text chat, net layer, voice capture/playback wired to UI, friends/DM panel, guild bar with create + invite-accept popups, right-side member list panel, message context menu (react/edit/delete/reply/copy), custom status + activity status, block list, channel create UI, encrypted identity vault. - **Server identity:** gateway generates or loads `server_identity.json` in the configured data directory. - **UI refactoring:** modular structure (`app/`, `chat/`, `connect/`, `sidebar/`, `members/`, `state/`, `settings/`). - **Session management:** reconnect with exponential backoff, node switching. - **Audio pipeline:** PTT / VAD / always-on modes, configurable bitrate, jitter buffer. - **Noise suppression:** RNNoise (feature-gated, off by default). - **Bookmarks:** save/remove nodes in connect screen. - **Docker:** multi-stage builds for gateway + voice-node, docker-compose. - **UDP voice encryption:** ChaCha20-Poly1305 AEAD on voice packets (Phase 1.1 — DONE). - **Direct Messages:** 1:1 DM with persistent history, canonical DM ID format (Phase 1.1 — DONE). - Protocol: DmStart (0x0060), DmMessage (0x0061), DmHistory (0x0062), DmReadAck, DmSearch. - Database: `direct_messages` and `dm_messages` tables with indexes. - Handlers: dm_start, dm_send, dm_history with server-authoritative timestamps and sender validation. - Delivery: targeted broadcast to online recipient; offline messages persisted to DB. - Last 50 messages returned on DM open and history fetch. - UI: sidebar DM list with unread badges, DM conversation panel, search bar. - **Community model (Phase 1.2 — DONE):** guilds, roles with permission bits, invites (permanent + temporary), guild member kick, audit log on every guild mutation. - **Friends system (Phase 1.2 — DONE):** friend requests, accept/decline, friend list with Online/All/Pending/Blocked tabs, pending count badge, Add Friend popup, per-friend DM shortcut and remove. - **Block list (Phase 1.3 — DONE):** block/unblock commands wired end-to-end, Blocked tab UI with input + Unblock button. - **Presence system (Phase 1.2/1.3 — DONE):** ONLINE / IDLE / DND / INVISIBLE status cycler in user bar, custom status text, activity type (playing/listening/watching/streaming) + activity text, broadcast on change, presence sync on connect. - **Phase 1.3 chat polish:** message reactions (emoji), message editing (with "(edited)" marker), message deletion, typing indicators (multi-user), read receipts, **replies** (with italic reply indicator showing original author + snippet), **context menu** (quick-react, reply, copy, edit, delete). - **Speaking indicators (Phase 1.3 — DONE):** green dot/ring on local user when transmitting (PTT/VAD), green highlight on remote voice panel members when voice packets arrive, voice activity banner with speaker attribution ("🔊 alice is talking"). - **Per-user speaking attribution (Phase 1.3 — DONE):** voice packet plaintext extended with sender_id (raw Ed25519 pubkey), receivers attribute activity to specific user. - **Right-side member list panel:** shows online members of the active text channel with avatars and status dots. - **Rate limiting (Phase 2 — DONE):** per-session token bucket on chat/DM messages (default 5/s, burst 10), `ErrorCode::RateLimited` reply on exceed. - **Prometheus metrics (Phase 2 — DONE):** counters for messages, DMs, voice packets, connections, auth failures, rate-limited events, errors, guilds, friends requests, sessions, channels, uptime. - **Identity encryption at rest (Phase 2 — DONE):** Argon2id passphrase + ChaCha20-Poly1305 AEAD, opt-in via passphrase; backward-compatible with legacy plain `identity.json`. - **Channel creation UI (Phase 1.3 — DONE):** "Create a Channel" popup with name + type (text/voice) selector — adds channel to local sidebar. --- ## Implemented in code but incomplete | Area | Reality | |------|---------| | Voice capture/playback | Starts when a voice channel is selected; Opus over UDP via net layer, encrypted. | | SDK crate | Present as a stub; not a usable public API yet. | | Federation crate | Stub only (`// TODO`). | | RNNoise | Feature-gated, no-op stub by default. Enable with `--features rnnoise`. | | Slint migration | Plan exists at `docs/superpowers/plans/2026-05-31-slint-migration.md`; deferred — egui UI continues to be improved. | | Server-side channel creation | Client-side channels work locally; gateway still needs `ChannelCreate` packet + storage (Phase 2). | | Identity export/import UI | Vault API is ready (`identity::save(identity, Some(passphrase))`), but no UI modal yet. | --- ## Specified in docs, not implemented yet | Feature | Target phase | |---------|--------------| | TLS 1.3 on TCP | Phase 2 | | Seed phrase / encrypted keyfile export UI | Phase 2 | | Gateway to voice-node membership signaling | Phase 2 | | Protobuf payloads (replacing JSON) | Phase 2 | | `/health` HTTP endpoint on gateway | ✅ DONE | | Rate limiting | ✅ DONE | | Prometheus metrics | ✅ DONE | | Identity keypair encryption at rest (Argon2id passphrase) | ✅ DONE | | Published Docker images (`ghcr.io/vnox/...`) | Not published yet | | Server-side channel create/edit/delete | Phase 2 | | Federation protocol spec | Phase 3 | --- ## Security notes - **TCP control plane:** Encrypted with ChaCha20-Poly1305 (✅ Phase 1.1) - **UDP voice data:** Encrypted with ChaCha20-Poly1305 (✅ Phase 1.1) - **Client auth:** Ed25519 challenge-response; identity proven, transport encrypted. - **Server pubkey:** Real (Ed25519), verified during handshake. - **Ephemeral keys:** X25519 ECDH with HKDF-SHA256 key derivation for forward secrecy. - **Voice node:** Transparent relay (does not decrypt voice — encrypted end-to-end between clients). - **Identity at rest:** Optional Argon2id passphrase + ChaCha20-Poly1305 AEAD vault (✅ Phase 2). - **Rate limiting:** Per-session token bucket on chat + DM (✅ Phase 2). --- ## Local development Use `dev/config.toml`. See [dev/README.md](../dev/README.md). Quick start: ```sh cargo run -p vnox-gateway -- --config dev/config.toml cargo run -p vnox-voice-node -- --config dev/config.toml cargo run -p vnox-client ``` Automated voice relay check (gateway + voice-node must already be running): ```sh cargo run -p vnox-client --bin vnox-e2e-voice ``` --- ## Where to read more - Architecture: [01-architecture.md](01-architecture.md) - Protocol (target design): [02-protocol/README.md](02-protocol/README.md) - Community Model: [07-community-model.md](07-community-model.md) - Gateway Events: [08-gateway-events.md](08-gateway-events.md) - Database Schema: [10-database.md](10-database.md) - Roadmap: [06-roadmap.md](06-roadmap.md) - Releases: [CHANGELOG.md](../CHANGELOG.md)