131 lines
4.9 KiB
Markdown
131 lines
4.9 KiB
Markdown
# VNOX — Client
|
|
|
|
> Native desktop client for VNOX. Voice, text, no cloud.
|
|
|
|
[](LICENSE)
|
|
[](https://www.rust-lang.org/)
|
|
[](docs/00-status.md)
|
|
|
|
---
|
|
|
|
## What is this?
|
|
|
|
The official desktop client for [VNOX](https://github.com/loki5512344/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](docs/00-status.md) for a full breakdown.
|
|
|
|
---
|
|
|
|
## Quick start
|
|
|
|
**Requirements:** Rust 1.85+, a running [VNOX Server](https://github.com/loki5512344/Vnox)
|
|
|
|
```bash
|
|
# 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](LICENSE)
|
|
LNEx protocol specification: **CC0** (public domain)
|