Real-time AI transcription for meetings.
- Frontend: Next.js, TypeScript, Tailwind, Zustand
- Backend: Fastify, TypeScript, Deepgram SDK, OpenAI SDK, Playwright
- Storage: In-memory (no database required)
apps/
client/ → Next.js frontend (port 3000)
server/ → Fastify backend (port 3001)
npm installBackend — copy and fill in apps/server/.env:
cp apps/server/.env.example apps/server/.envPORT=3001
DEEPGRAM_API_KEY=your-deepgram-key
OPENAI_API_KEY=your-openai-key
FRONTEND_URL=http://localhost:3000
Frontend — copy and fill in apps/client/.env.local:
cp apps/client/.env.example apps/client/.env.localNEXT_PUBLIC_BACKEND_URL=http://localhost:3001
NEXT_PUBLIC_BACKEND_WS_URL=ws://localhost:3001
npm run dev:servernpm run dev:webOpen http://localhost:3000.
- Open the app → click New Session
- Click Start Recording — transcript segments appear live as chat bubbles
- Click Summarize last 2 min in the sidebar — calls OpenAI to summarize
- Click Generate PDF in the sidebar — renders a report PDF via Playwright
- Click Stop Recording when done
Audio format settings are in apps/server/src/routes/stream.ts. Look for // TODO: comments. You may need to adjust:
encoding(e.g.linear16,opus)sample_rate(e.g.16000,48000)channels
The frontend sends audio via MediaRecorder (webm/opus by default). If Deepgram needs raw PCM, switch to an AudioWorklet-based recorder on the frontend.
PDFs are saved to /tmp/generated/ and served by the backend at /files/. On first run you may need to install Playwright browsers:
cd apps/server
npx playwright install chromium| Method | Route | Description |
|---|---|---|
| GET | /health |
Health check |
| POST | /sessions |
Create a new session |
| GET | /sessions/:id |
Get session details |
| GET | /sessions/:id/transcript |
Get full transcript |
| POST | /sessions/:id/summaries/recent |
Summarize last 2 minutes |
| POST | /sessions/:id/pdf |
Generate PDF report |
| WS | /sessions/:id/stream |
Live transcription WebSocket |
- Authentication
- Persistent database (everything is in-memory, resets on server restart)
- Speaker identification (just Speaker 0, Speaker 1, etc.)
- Production deployment config