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
- Test end-to-end locally (voice in → TTS audio out if relevant)
- Submit a PR — fill out the PR template
- Keep PRs focused — one feature or fix per PR
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.