Thank you for your interest in contributing. This document covers the workflow, design rules, and things to know before opening a PR.
Read CLAUDE.md first. It contains the design contract, key behaviours that must not be broken, and the full tech stack. It is short and worth reading entirely.
git clone https://github.com/Soumyadipgithub/SyncSpeak.git
cd SyncSpeak
# Frontend + Tauri
npm install
# Python engine
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
pip install webrtcvad-wheels # Windows only — pre-built binary
# Run in dev mode
npm run devTwo API keys are required. Enter them in Settings → AI Authentication on first launch. See docs/setup.md for a full walkthrough.
| Branch | Purpose | Who can merge into it |
|---|---|---|
main |
Production — what users run | Maintainer only (via PR from develop) |
develop |
Integration — all PRs land here | Maintainer approval required on every PR |
develop is the default branch. Every PR you open must target develop, not main.
The maintainer promotes develop → main when a release is ready.
CI will reject your PR automatically if your branch name does not follow this format:
<type>/issue-<number>-<short-description>
<type>/<short-description> ← if no issue exists
Valid types:
| Type | Use for |
|---|---|
feat |
New functionality |
fix |
Bug fix |
docs |
Documentation only |
refactor |
Code restructure, no behaviour change |
chore |
Build, deps, config |
hotfix |
Critical production fix (urgent) |
Examples:
feat/issue-12-add-hindi-punctuation
fix/issue-7-tts-feedback-loop
docs/update-pipeline-diagram
refactor/vad-state-cleanup
chore/upgrade-groq-sdk
hotfix/stt-400-errorRules:
- All lowercase, hyphen-separated words
- No spaces, underscores, or capital letters in the description
- Include the issue number when one exists:
fix/issue-7-description
1. Fork the repo
2. Create your branch from develop:
git checkout develop
git pull origin develop
git checkout -b feat/issue-42-your-feature
3. Make your changes and test:
npm run dev
4. Push and open a PR → target: develop (not main)
5. CI runs automatically (branch name + Python + TypeScript + Rust checks)
6. Maintainer reviews and approves
7. Maintainer merges — your branch is auto-deleted
8. Periodically, maintainer merges develop → main for a release
- Do not open a PR against
main— it will not be considered - Do not push directly to
developormain— both are protected - Do not name your branch
fix-thingormy-feature— the CI branch check will fail
Check the Issues tab. Issues labelled good first issue are self-contained and well-scoped.
If you want to add something not in the issue tracker, open an issue first to discuss — especially for provider swaps, architecture changes, or anything that touches the audio pipeline.
These behaviours exist for specific reasons (documented in CLAUDE.md):
| Behaviour | File | Why |
|---|---|---|
sd._terminate(); sd._initialize() before stream open |
sidecar_main.py |
Fixes Windows WASAPI -9985 stale device error |
device=None fallback |
sidecar_main.py |
Recovers when mic is held by Teams/Zoom |
_tts_active flag in audio_callback |
sidecar_main.py |
Prevents TTS voice from being re-transcribed |
| VAD state reset after TTS | sidecar_main.py |
Stops partial captures bleeding into next utterance |
500ms pre-buffer (deque(maxlen=5)) |
sidecar_main.py |
Prevents first syllable from being clipped |
- Every panel must use
var(--glass-bg)+backdrop-filter: var(--liquid-blur)— no solid backgrounds - Do not add Tailwind CSS
- Use
var(--liquid-morph)for all CSS transitions - Full token reference: docs/design-system.md
Do not swap out Sarvam AI or Groq without opening a discussion issue first. The choice of providers is documented in docs/pipeline.md with specific reasons for each.
Keys are always entered via the Settings modal and saved to %APPDATA%\com.syncspeak.app\config.json. Do not add .env file support or environment variable fallbacks — the GUI-only flow is intentional.
Use short imperative subject lines:
fix: prevent TTS feedback loop during active translation
feat: add voice preview caching for offline playback
docs: update pipeline.md with v3 VAD architecture
No ticket numbers required.
Open a Discussion for questions that aren't bug reports or feature requests.