Browser-based live captions and translation for meetings, presentations, and multilingual accessibility.
Run npm --prefix frontend run dev and open http://localhost:5173/?demo=1 for a synthetic demo using the production React interface. It requests no microphone permission and calls no transcription or translation provider.
- streams tab, screen, or microphone audio as mono PCM over WebSocket;
- transcribes with Deepgram and translates with Google Cloud;
- merges interim/final captions with speaker diarization;
- protects organizer operations separately from participant access;
- exports caption logs while documenting their privacy implications;
- keeps provider credentials and meeting passwords out of URLs and bundles.
Browser audio → WebSocket → Deepgram → translation → live overlay
↘ SQLite session/caption history
See architecture and privacy for boundaries and trade-offs.
Requires Node.js 20+ and provider credentials for the real pipeline.
npm ci
npm --prefix backend ci
npm --prefix frontend ci
cp backend/.env.example backend/.env
npm run devRequired backend values:
ADMIN_PASSWORD=replace_with_a_long_random_password
DEEPGRAM_API_KEY=your_deepgram_api_key
ALLOWED_ORIGIN=http://localhost:5173Configure either Google Application Default Credentials plus TRANSLATE_PROJECT_ID, or TRANSLATE_API_KEY. Never commit .env or service-account JSON files.
- participant UI:
http://localhost:5173 - organizer UI:
http://localhost:5173/admin - backend:
http://localhost:8080
npm test
npm run build
npm run audit:public
npm audit --omit=dev --audit-level=high
npm --prefix backend audit --omit=dev --audit-level=highTests cover password hashing and fail-closed organizer endpoints without calling external providers. CI adds full-history Gitleaks scanning.
Use TLS (https/wss), a restricted ALLOWED_ORIGIN, secret injection, and explicit consent/retention rules for transcripts. SQLite and the active-user counter target one application instance; adopt shared storage only when horizontal scaling is required.
MIT