VNOX-Server/docs/community/contributing.md

4.5 KiB

Contributing


License

VNOX is licensed under GPL-3.0. See ../LICENSE.md for the full text and what this means for plugins and protocol implementations.

The LNEx protocol specification is additionally licensed under CC0 (public domain) — anyone can implement it under any license.


Before you start

  1. Check existing issues — your idea or bug may already be tracked.
  2. For significant changes, open an issue first to discuss approach.
  3. For small fixes (typos, docs, obvious bugs), PRs are welcome directly.

Setting up the dev environment

Prerequisites

  • Rust stable (latest) — rustup update stable
  • System audio libraries:
    • Linux: apt install libasound2-dev libopus-dev pkg-config
    • macOS: brew install opus
    • Windows: opus ships with the crate, no extra step
  • Docker (optional, for running a local node)

Build

git clone https://github.com/vnox/vnox
cd vnox

# Build everything
cargo build

# Build release
cargo build --release

# Run gateway (dev mode)
cargo run -p vnox-gateway -- --config dev/config.toml

# Run voice node
cargo run -p vnox-voice-node -- --config dev/config.toml

# Run client
cargo run -p vnox-client

Running tests

# All tests
cargo test

# Specific crate
cargo test -p vnox-gateway

# With logs
RUST_LOG=debug cargo test -p vnox-gateway -- --nocapture

Repository structure

vnox/
├── client/         # Desktop client (egui + wgpu)
│   └── src/
│       ├── ui/     # egui panels and widgets
│       ├── audio/  # cpal capture/playback, Opus encode/decode
│       ├── net/    # LNEx client, quinn UDP
│       └── identity/ # keypair, auth
│
├── gateway/        # TCP gateway
│   └── src/
│       ├── auth/   # identity verification, sessions
│       ├── channels/ # channel management
│       ├── proto/  # LNEx packet handling
│       └── storage/ # SQLite / Postgres
│
├── voice-node/     # UDP voice relay
│   └── src/
│       ├── relay/  # packet routing per channel
│       └── jitter/ # jitter buffer
│
├── protocol/       # LNEx .proto schemas
│   └── *.proto
│
├── plugins/        # Plugin runtime + example plugins
│   └── examples/
│
├── sdk/            # Client SDK (future)
├── docs/           # This documentation
└── dev/            # Dev config, test fixtures
    └── config.toml

Code style

  • cargo fmt before committing — enforced in CI
  • cargo clippy -- -D warnings must pass — enforced in CI
  • No unwrap() in library code — use proper error propagation
  • No unsafe without a comment explaining why it's safe
  • Public API items must have doc comments

Commit messages

Follow conventional commits:

feat(gateway): add rate limiting per IP
fix(client): handle reconnect on TCP drop
docs(protocol): clarify voice packet sequence field
chore(deps): update tokio to 1.37

Types: feat, fix, docs, chore, refactor, test, perf

Scope is the crate or subsystem: gateway, client, voice-node, protocol, docs.


Pull requests

  • Keep PRs focused — one concern per PR
  • Include tests for non-trivial changes
  • Update docs if the change affects user-facing behavior
  • CI must pass before merge

PR title follows the same format as commit messages.


Governance

VNOX uses the BDFL model — the maintainer makes final decisions on all matters.

For large or breaking changes (especially LNEx protocol changes), open an issue and discuss before implementing. Protocol PRs without prior discussion will not be merged.


Protocol changes

Changes to the LNEx protocol are treated differently from implementation changes.

  • Any change to packet format, auth flow, or behavior must be documented in docs/02-protocol/ before implementation
  • Breaking changes require a LNEx version bump
  • Non-breaking additions are allowed within the same version with a changelog entry
  • Protocol PRs require more review time than implementation PRs

Where to start

Good first issues are tagged good first issue on GitHub.

If you want to contribute but don't know where:

  1. Run a node locally and report anything confusing about the setup process
  2. Improve documentation — anything unclear in docs/ is a valid fix
  3. Write tests for existing gateway or voice-node code
  4. Implement a feature from the Phase 1 checklist in ../06-roadmap.md