If you’re looking for a meeting recording API, consider checking out Recall.ai, an API that records Zoom, Google Meet, Microsoft Teams, in-person meetings, and more.
Sponsored by Recall.ai — The unified API for meeting bots.
A clean, modern web application that transcribes meeting recordings and generates structured Minutes of Meeting using your preferred AI providers. Upload once, get professional meeting minutes automatically.
- AI Transcription — Deepgram, AssemblyAI, Sarvam AI, or ElevenLabs
- Smart Summarization — Any OpenAI-compatible LLM (OpenAI, OpenRouter, Groq, Together, Azure, Ollama, etc.)
- Background Processing — Celery + Redis; upload and come back when it's done
- Auto Cleanup — Files auto-deleted after a configurable number of days
- Two Roles — Admin (full config access) + User (upload & view only)
- Modern UI — Light-themed, fully responsive, smooth animations
- Docker-ready — One command to spin up everything
cp .env.example .env
# Edit .env — set your API keysdocker compose up --buildApp is available at http://localhost:5000
Prerequisites: Python 3.12+, Redis, ffmpeg
# Install dependencies
pip install -r requirements.txt
# Start Redis (one terminal)
redis-server
# Start Celery worker (another terminal)
celery -A celery_worker:celery worker -l info
# Start Celery beat for periodic cleanup (another terminal)
celery -A celery_worker:celery beat -l info
# Start Flask app
python run.py| Field | Value |
|---|---|
| Username | admin |
| Password | admin@123 |
Change these in
.envbefore deploying.
Log in as admin and navigate to Settings to configure:
| Tab | What you can set |
|---|---|
| LLM Provider | Base URL, API key, model name |
| Speech Provider | Active provider, API keys for all 4 providers |
| Storage | Retention days (how long files are kept) |
Navigate to Users to create/manage user accounts.
The app uses the OpenAI client format — works with any compatible endpoint:
| Provider | LLM_BASE_URL |
Example model |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
gpt-4o |
| OpenRouter | https://openrouter.ai/api/v1 |
anthropic/claude-opus-4 |
| Groq | https://api.groq.com/openai/v1 |
llama-3.3-70b-versatile |
| Together AI | https://api.together.xyz/v1 |
meta-llama/Llama-3-70b-chat-hf |
| Ollama (local) | http://localhost:11434/v1 |
llama3.2 |
All four providers produce speaker-labelled transcripts when diarization is available (e.g. [Speaker 0]: …, [speaker_0]: …). This gives the LLM enough context to correctly attribute decisions and action items in the Minutes of Meeting.
| Provider | Model | Key capabilities |
|---|---|---|
| Deepgram | Nova-3 | Fastest; word-level diarization via utterances; paragraph-formatted output |
| AssemblyAI | Best (auto) | High accuracy; speaker diarization |
| Sarvam AI | saarika:v2.5 | Batch Job API — no duration limit; best for Indian languages + English; diarization (beta) |
| ElevenLabs | Scribe v2 | Multichannel support (stereo → per-channel speakers); single-channel diarization |
Sarvam note: The direct
/speech-to-textendpoint only accepts ≤ 30 seconds of audio. The provider now uses the full Batch Job pipeline (/speech-to-text/job/v1) which handles meeting recordings of any length.
├── app/
│ ├── __init__.py # App factory + seeding
│ ├── config.py # All configuration
│ ├── extensions.py # db, login_manager, celery
│ ├── models.py # User, Meeting, SystemConfig
│ ├── auth/ # Login / logout
│ ├── dashboard/ # Dashboard home
│ ├── meetings/ # Upload, list, detail, delete
│ ├── admin/ # Settings + user management
│ ├── api/ # REST endpoints (status polling)
│ ├── tasks/ # Celery tasks (process + cleanup)
│ ├── providers/
│ │ ├── llm/ # OpenAI-compatible LLM client
│ │ └── speech/ # Deepgram, AssemblyAI, Sarvam, ElevenLabs
│ ├── utils/ # ffmpeg audio conversion
│ ├── static/ # CSS + JS
│ └── templates/ # Jinja2 HTML templates
├── celery_worker.py # Celery entry point
├── run.py # Flask entry point
├── Dockerfile
├── docker-compose.yml
└── .env.example


