# 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 (`#0d0d0d` base, `#ff6b35` accent) - 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 ```bash # 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 ```