Thanks for your interest in contributing. This is a voice agent platform — contributions that improve voice quality, add TTS providers, improve the frontend UX, or make setup easier are all welcome.
The voice pipeline requires a running gateway. The default is OpenClaw, but any gateway plugin works — including the example-gateway stub for offline development. If you don't have a gateway, you can still contribute to:
- Frontend UI (the face, settings panel, music player)
- TTS provider implementations (unit-testable in isolation)
- Documentation, setup scripts, tests
- Canvas system (HTML page display layer)
| Branch | Purpose | Who pushes directly |
|---|---|---|
main |
Stable, released code | Nobody — PR only, 1 review required |
dev |
Integration / in-progress work | Maintainers only |
Contributors always open PRs targeting dev, not main.
Maintainers periodically merge dev → main to cut a release.
git clone https://github.com/MCERQUA/OpenVoiceUI
cd OpenVoiceUI
python3 -m venv venv
venv/bin/pip install -r backend/requirements.txt
cp .env.example .env
# Edit .env — set CLAWDBOT_AUTH_TOKEN and GROQ_API_KEY at minimum
venv/bin/python3 server.pyOpen http://localhost:5001 in your browser.
routes/ Flask blueprints — one file per feature area
services/ Backend services
gateway_manager.py Gateway registry, plugin loader, router
gateways/ Gateway implementations
base.py GatewayBase abstract class
openclaw.py OpenClaw implementation
tts.py TTS service wrapper
tts_providers/ TTS provider implementations
plugins/ Gateway plugins (gitignored, drop-in)
example-gateway/ Reference implementation
README.md Plugin authoring guide
src/ Frontend (vanilla JS ES modules)
adapters/ LLM/voice framework adapters
core/ EventBus, VoiceSession, EmotionEngine
features/ MusicPlayer, Soundboard
ui/ AppShell, SettingsPanel, ThemeManager
profiles/ Agent configuration JSON files
prompts/ System prompt (hot-reloaded, no restart needed)
config/ Server config YAML
- Copy
tts_providers/base_provider.pyas a starting point - Implement
generate(text, voice, speed) -> bytes(returns raw PCM or MP3) - Register it in
tts_providers/providers_config.json - Add any required env vars to
.env.example - Update the TTS provider table in
README.md
- Copy
src/adapters/_template.js - Implement the four lifecycle methods:
init,start,stop,destroy - Register it in
src/shell/adapter-registry.js - Document required config keys in your adapter's comments
Gateway plugins connect the server to any LLM backend (LangChain, AutoGen, direct API calls, etc.) and run alongside OpenClaw simultaneously.
- Copy
plugins/example-gateway/toplugins/my-gateway/ - Edit
plugin.json— set youridand any required env vars inrequires_env - Implement
gateway.py— subclassGatewayBase, implementstream_to_queue() - Restart the server — it auto-discovers plugins on startup
- Set
"gateway_id": "my-gateway"in a profile'sadapter_configto route traffic to it
See plugins/README.md for the full event protocol and gateway_manager.ask() for inter-gateway calls.
Python:
- Follow existing patterns — Flask blueprints, logging via
logger = logging.getLogger(__name__) - No bare
print()statements — uselogger.debug()/logger.info() - Add new env vars to
.env.examplewith a comment explaining them
JavaScript:
- Vanilla ES modules, no build step required
- Follow the EventBus pattern for cross-component communication
- Keep adapters self-contained — no direct DOM manipulation outside
ui/
- Fork the repo and create a branch:
git checkout -b feature/my-thing - Make your changes
- Run the test suite:
venv/bin/python3 -m pytest tests/ -q - Test end-to-end locally (voice in → TTS audio out if relevant)
- Submit a PR targeting
dev(notmain) — fill out the PR template - Keep PRs focused — one feature or fix per PR
Before submitting security-related PRs, read:
- docs/ARCHITECTURE.md — Understand how systems connect
- docs/PR-REVIEW-CHECKLIST.md — What reviewers check
- SECURITY.md — Vulnerability reporting policy
Every PR is reviewed against the PR Review Checklist. The maintainer will:
- Code review — Check the PR against the review checklist (security, tag system, display pipeline, tests)
- Test locally — Create a
devtest/pr-<number>branch, apply changes, run full test suite + manual voice test - Merge or request changes — If tests pass, the original PR is merged (you keep full commit credit). If tests fail, specific feedback is provided.
This process ensures that every change is verified in context before it reaches dev. Security fixes in particular are tested carefully because they often touch systems that are tightly coupled (e.g., the tag system spans 4 files — see the Architecture doc).
Use the bug report template.
Include logs from journalctl -u openvoiceui -f (production) or your terminal (development). The most useful logs are usually gateway connection errors or TTS provider errors.
Open a GitHub Discussion or file an issue with the question label.