Prerequisites
- Python 3.11+ (
python --version) - Git
- Node.js 18+ if you are working on the dashboard frontend (
src/dashboard/frontend/)
Clone and install
1
Fork and clone
2
Create a virtual environment and install
dev extra pulls in the livekit and dashboard extras plus pytest, ruff-adjacent tooling not covered by pre-commit (mypy is installed separately, see below), and the ClickHouse/DuckDB test dependencies. Every voicegw subcommand needs the livekit extra: cli/__init__.py imports the LiveKit CLI module at package load time, so an editable install without it fails to import voicegateway.cli at all.Pre-commit hooks
ruff check --fix and ruff format on every commit (.pre-commit-config.yaml). They do not run mypy: mypy runs in CI only. Run it locally before pushing:
Running tests
asyncio_mode = "auto" is set in pyproject.toml, so async test functions run without a @pytest.mark.asyncio decorator. See Testing for fixtures and patterns.
Verify everything works
Dashboard frontend
There is no separate dashboard backend process.voicegw serve (the daemon) serves both /v1/* and /api/* plus the built React SPA at /, all on one port (0.0.0.0:8080 by default). voicegw dashboard does not start anything; it opens your browser at that same address.
To work on the frontend with hot reload:
http://localhost:5173 and proxies /api, /v1, and /static/branding to http://localhost:8080. npm run build produces the production bundle the daemon serves from disk.
Documentation site
Docs source lives in this repo underdocs/. Mintlify renders it at https://docs.voicegateway.dev from the default branch. Change the docs in the same PR as any behavior or API change; see Contributing.
Environment variables for development
The_test_env autouse fixture sets fake API keys for the whole test suite, so you do not need real provider keys to run pytest. For manual testing against real providers: