No description
| .cargo | ||
| docs | ||
| src | ||
| .gitignore | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CHANGELOG.md | ||
| LICENSE | ||
| README.md | ||
VNOX — Client
Native desktop client for VNOX. Voice, text, no cloud.
What is this?
The official desktop client for VNOX — a self-hosted voice and text communication platform. Connects to a VNOX server over the LNEx protocol.
- Connects to gateway via TCP (text, auth, channels, guilds, DMs)
- Connects to voice node via UDP (encrypted Opus voice packets)
- Opus audio encoding/decoding with adaptive jitter buffer
- Native UI built with Slint — no Electron, no web views
Features
Implemented
- Auth: Ed25519 keypair generation, challenge-response login, reconnect with exponential backoff
- Encryption: ChaCha20-Poly1305 AEAD + X25519 ECDH key exchange
- Text chat: Persistent history, reactions, replies, edit, delete, typing indicators, read receipts
- Channel management: Join, leave, create, delete; text and voice channels
- Guilds: Create, list, leave, member list with roles, kick, audit log viewer
- Roles: Role list, assign/unassign with permission checks
- Direct Messages: 1:1 DMs with persistent history, unread badges, search
- Friends: Requests, accept/decline, Online/All/Pending/Blocked tabs
- Presence: Online/Idle/DND/Invisible, custom status text, activity display
- Voice: PTT / VAD / always-on modes, configurable bitrate, per-user volume
- Jitter buffer: Adaptive mode, configurable target latency
- Noise suppression: RNNoise (feature-gated, off by default)
- Identity vault: Optional Argon2id + ChaCha20-Poly1305 encrypted keyfile
- Keyfile export/import: Encrypted or plain JSON with passphrase
- Bookmarks: Save/remove server nodes in connect screen
Planned
- In-game overlay (Phase 2)
- Federation support (Phase 3)
- Mobile client (Phase 3)
Status
Phase 1 is implemented. Not production ready.
| Feature | Status |
|---|---|
| Connect to server | ✅ Working |
| Text chat | ✅ Working |
| Channel management | ✅ Working |
| Guilds & roles | ✅ Working |
| Direct Messages | ✅ Working |
| Friends & presence | ✅ Working |
| Voice (send/receive) | 🔧 Partial (audio pipeline) |
| Encryption | ✅ ChaCha20-Poly1305 + X25519 |
| In-game overlay | 🔲 Phase 2 |
| Mobile client | 🔲 Phase 3 |
See docs/00-status.md for a full breakdown.
Quick start
Requirements: Rust 1.85+, a running VNOX Server
# Terminal 1 — gateway
cargo run -p vnox-gateway -- --config dev/config.toml
# Terminal 2 — voice node
cargo run -p vnox-voice-node -- --config dev/config.toml
# Terminal 3 — client
cargo run -p vnox-client
The client connects to 127.0.0.1:7600 by default. You can change the address in the UI on the connect screen.
Opus on Windows
audiopus_sys builds libopus from source via CMake. CMake 4.x policy flag is already set in .cargo/config.toml — no manual steps needed.
Tech stack
| Layer | Technology |
|---|---|
| UI | Slint |
| Networking | Tokio (async TCP + UDP) |
| Audio | cpal + rodio + opus + rnnoise |
| Identity | ed25519-dalek + x25519-dalek |
| Crypto | ChaCha20-Poly1305 + Argon2id |
| Protocol | LNEx v1 (JSON, Phase 1) |
Project structure
src/
├── main.rs # Entry point
├── ui/ # Slint UI (slint files + Rust glue)
├── net/ # LNEx TCP + UDP networking
│ ├── crypto/ # Session encryption
│ ├── framing/ # Packet read/write
│ ├── voice/ # UDP voice send/recv
│ └── session/ # Connection lifecycle, reconnection
├── audio/ # Audio pipeline
│ ├── capture.rs # Mic → Opus encode
│ ├── playback.rs # Opus decode → speaker
│ ├── config.rs # Bitrate, VAD, jitter settings
│ └── processing/ # VAD, noise suppression
├── identity_vault.rs # Argon2id-encrypted keyfile
├── app.rs # UI state and event dispatch
└── jitter/ # Jitter buffer
License
Client code: GPL-3.0 — see LICENSE
LNEx protocol specification: CC0 (public domain)