Real-time captioning platform with on-device translation. Built with ElevenLabs Scribe and Supabase.
- Real-time speech-to-text transcription (100-200ms latency)
- Live caption broadcasting to unlimited viewers
- On-device translation with Chrome built-in AI (Chrome 138+)
- Automatic language detection
- GitHub OAuth authentication
- Caption history and event management
- Node.js 18+
- pnpm
- Supabase account
- ElevenLabs API key
- GitHub account (for OAuth)
- Clone and install
git clone https://github.com/yourusername/v0_realtime_scribe.git
cd v0_realtime_scribe
pnpm install- Set up Supabase
- Create project at supabase.com
- Run migrations from
supabase/migrations/in order - Or use CLI:
supabase start(for local dev)
- Configure GitHub OAuth
- Create OAuth App at github.com/settings/developers
- Callback URL:
http://localhost:3000/auth/callback - Add credentials to Supabase Dashboard → Authentication → Providers
- Environment variables
Create .env.local:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
NEXT_PUBLIC_SITE_URL=http://localhost:3000
ELEVENLABS_API_KEY=your_api_key- Run
pnpm devVisit http://localhost:3000
Broadcaster:
- Sign in, create an event
- Go to
/broadcast/[uid], click "Start Recording" - Grant microphone access and speak
Viewer:
- Visit
/view/[uid] - Select language for on-device translation (Chrome 138+)
Deploy to Vercel:
- Import repo at vercel.com
- Add environment variables
- Update GitHub OAuth callback URL for production
- SCRIBE_SETUP.md - ElevenLabs configuration
- GITHUB_AUTH_SETUP.md - OAuth setup
- TRANSLATION_FEATURE.md - Translation details
- Token fails: Check
ELEVENLABS_API_KEYin.env.local - No microphone: Grant permissions, use HTTPS
- No captions: Check Supabase connection and RLS policies
- Translation unavailable: Use Chrome 138+
Built with ElevenLabs Scribe, Supabase Realtime, and Next.js
