An accessible AI-powered meeting assistant that provides real-time transcription, topic tracking, AI-generated summaries, transcript translation, and post-meeting Q&A.
- Integrates with Recall.ai to join Zoom meetings (Google Meet and Microsoft Teams coming soon...)
- Real-time transcription via webhooks
- Topic tracking with periodic updates sent to meeting chat
- Video playback with synced transcript navigation (click transcript to seek)
- AI-generated summaries using Gemini
- Transcript translation to 10+ languages (Spanish, French, German, Portuguese, Chinese, Japanese, Korean, Hindi, Arabic)
- Q&A interface β ask questions about the meeting content
- PDF export of meeting summaries
- Browse and load previous meeting transcripts
- View past recordings and regenerate summaries
| Summary | Q&A |
|---|---|
![]() |
![]() |
| Layer | Technology |
|---|---|
| Backend | FastAPI, Python 3.9+ |
| Frontend | Next.js 15 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS 4 |
| AI/LLM | OpenAI-compatible API (GPT-4o-mini), Google Gemini |
| Translation | deep-translator |
| Meeting Bot | Recall.ai |
- Python 3.9+
- Node.js 18+ (20+ recommended)
- ngrok installed + logged in (
ngrok config add-authtoken ...) - A Recall.ai API key
- An LLM API key (OpenAI-compatible) for topic tracking and Q&A
- A Google Gemini API key for summaries
zoomer/
βββ backend/
β βββ main.py # FastAPI app with all endpoints
β βββ llm_client.py # OpenAI/Gemini LLM integration
β βββ qa_engine.py # Q&A engine for post-meeting questions
β βββ topic_tracker.py # Real-time topic detection
β βββ tangent_detector.py # Meeting tangent detection
β βββ translate.py # Translation utilities
β βββ store.py # In-memory meeting state
β βββ transcripts/ # Saved transcript files (JSONL)
β βββ requirements.txt
β βββ .env # Backend config (do not commit)
βββ frontend/
β βββ app/
β β βββ page.tsx # Home page (start meeting / view history)
β β βββ meeting/ # Live meeting view
β β βββ post-meeting/ # Recap page (video, transcript, summary, Q&A)
β βββ components/ui/ # Reusable UI components
β βββ package.json
βββ docs/images/ # Screenshots for README
βββ .gitignore
βββ README.md
cd backend
py -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txtCreate backend/.env:
# Recall.ai
RECALL_API_KEY=YOUR_RECALL_KEY
RECALL_BASE_URL=https://us-west-2.recall.ai
# Public URL for webhooks (set after starting ngrok)
PUBLIC_BASE_URL=
# Webhook token auth
WEBHOOK_TOKEN=dev-secret-token
# Topic tracking
TOPIC_TRACKER_ENABLED=true
TOPIC_CHECK_INTERVAL_S=60
# LLM (OpenAI-compatible) β for topic tracking and Q&A
LLM_API_KEY=YOUR_LLM_KEY
LLM_MODEL=gpt-4o-mini
LLM_BASE_URL=https://api.openai.com/v1
# Gemini β for meeting summaries
GEMINI_API_KEY=YOUR_GEMINI_KEYcd frontend
npm installngrok http 8000Copy the forwarding URL (e.g., https://xxxxxx.ngrok-free.dev) and update PUBLIC_BASE_URL in backend/.env.
cd backend
.\.venv\Scripts\Activate.ps1
uvicorn main:app --reload --port 8000 --env-file .envVerify: http://localhost:8000/healthz β {"ok": true}
cd frontend
npm run devOpen: http://localhost:3000
| Method | Endpoint | Description |
|---|---|---|
GET |
/healthz |
Health check |
GET |
/transcripts |
List saved transcripts |
POST |
/start-meeting-bot |
Start a bot to join a meeting |
POST |
/meeting/{bot_id}/agenda |
Set/update meeting agenda |
GET |
/meeting/{bot_id}/topic |
Get current meeting topic |
GET |
/meeting/{bot_id}/status |
Get bot status + recording URL |
GET |
/meeting/{bot_id}/transcript |
Get full transcript |
GET |
/meeting/{bot_id}/summary |
Generate AI summary |
POST |
/meeting/{bot_id}/leave |
Tell bot to leave meeting |
POST |
/qa |
Ask a question about a meeting |
POST |
/translate-file |
Translate transcript to another language |
POST |
/recall/webhook/realtime/ |
Webhook for real-time transcripts |
POST |
/recall/webhook/bot-status/ |
Webhook for bot status changes |
- Open http://localhost:3000
- Enter your meeting link (Zoom, Google Meet, etc.)
- Optionally add a meeting topic/context
- Click Connect Assistant
- The bot will join and start transcribing
After the meeting ends (or select a previous meeting from the home page):
- Transcript tab: View/translate the full transcript, click to seek video
- Summary tab: AI-generated meeting summary with PDF export
- Questions tab: Ask questions about the meeting content
- Ensure ngrok is running and
PUBLIC_BASE_URLis set correctly - Restart the backend after editing
.env - Check that webhook URLs include
?token=...matchingWEBHOOK_TOKEN
- Recording processing can take a few minutes after the meeting ends
- The post-meeting page will poll for up to 2 minutes
- Ensure
deep-translatoris installed (pip install deep-translator) - Check that the backend has internet access
backend/.env
backend/.venv/
backend/__pycache__/
backend/transcripts/
frontend/node_modules/
frontend/.next/



