VNOX-Client/docs/04-clients/desktop.md

195 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```