4.9 KiB
4.9 KiB
Desktop Client
The primary VNOX client. Native, fast, lightweight.
Stack
| Layer | Technology |
|---|---|
| Language | Rust |
| UI framework | egui |
| Renderer | wgpu |
| Audio capture/playback | cpal |
| Audio processing | rodio |
| Voice codec | opus (libopus bindings) |
| Networking | quinn (QUIC/UDP), tokio |
| Serialization | prost (Protobuf) |
Why egui
- immediate mode UI: simple to reason about, no complex state trees
- runs on wgpu: same renderer as the rest of the GPU pipeline
- truly cross-platform: one codebase, same behavior on Windows/macOS/Linux
- no runtime dependencies: ships as a single binary
Why wgpu
- modern GPU API (Vulkan / Metal / DX12 / WebGPU backend)
- future-proof for overlay rendering and spatial audio visualizations
- native on all tier-1 platforms
Platforms
| Platform | Status |
|---|---|
| Linux x86_64 | Phase 1 |
| Windows x86_64 | Phase 1 |
| macOS (Apple Silicon) | Phase 1 |
| macOS (Intel) | Phase 1 |
| Linux ARM64 | Phase 2 |
Audio pipeline
cpal (capture)
│ PCM f32 48000Hz
▼
RNNoise (noise suppression)
▼
AEC (echo cancellation)
▼
VAD (voice activity detection)
▼
opus encode
▼
LNEx UDP packet → voice-node
Playback:
LNEx UDP packet ← voice-node
▼
jitter buffer
▼
opus decode
▼
rodio (playback)
▼
cpal (output device)
Audio device selection is configurable in Settings → Voice and Settings → Audio Output.
Design system
The client follows the VNOX Hi-Fi Minimalism design system.
Full specification: docs/04-clients/design-system.md
Key decisions:
- monospace font throughout (IBM Plex Mono)
- warm dark palette (
#0d0d0dbase,#ff6b35accent) - no round server icons — square with abbreviation, 40px sidebar
- latency indicator bottom-left, next to identity
- no separate member list panel — voice users shown inline in channel list
Layout
┌──────────────────────────────────────────────────────┐
│ titlebar: dots · VNOX wordmark · connected node │
├────────┬──────────────────┬───────────────────────── │
│ nodes │ channels │ main (chat / voice) │
│ 40px │ 190px │ flex │
│ │ │ │
│ NC ◄ │ nightcore.lnex │ #general │
│ DV · │ ───────────── │ ───────────────────── │
│ GG │ # general ◄ │ messages │
│ VD │ # dev-talk │ │
│ + │ # plugins │ │
│ │ │ │
│ │ ~ lobby │ │
│ │ · raven │ ───────────────────── │
│ │ · 0xmist │ #general › [input] │
│ │ 🔇 lurker_7 │ │
│ │ ~ gaming │ │
│ │ ───────────── │ │
│ │ ● 12ms lnex v1 │ │
│ │ [YU] you 🎤 🎧 ⚙ │ │
└────────┴──────────────────┴──────────────────────────┘
Settings
Settings are stored locally. No settings are synced to the server.
Voice
- input device
- input volume
- noise suppression (RNNoise on/off)
- echo cancellation (on/off)
- activation mode: push-to-talk / voice activity / always on
- VAD threshold
- Opus bitrate (8–128k)
- Opus frame interval (10 / 20 / 40ms)
Audio output
- output device
- output volume
- jitter buffer size
- adaptive jitter buffer (on/off)
Network
- relay address
- auto relay selection
- UDP port
- force relay only (disable direct)
Identity
- view pubkey
- export keypair
- seed phrase backup
- rotate keypair
Appearance
- color scheme
- UI scale
- font
Keybinds
- push-to-talk key
- mute toggle
- deafen toggle
- overlay toggle
Plugins
- installed plugin list
- enable / disable per plugin
Advanced (debug)
- log level
- log voice packets
- show packet stats
- disable encryption (dev only)
Building from source
# Prerequisites: Rust stable, system audio libs
# Linux (Ubuntu/Debian)
apt install libasound2-dev libopus-dev
# macOS
brew install opus
# Build
git clone https://github.com/vnox/vnox
cd vnox/client
cargo build --release
# Binary
./target/release/vnox-client