MinuteMate : Your AI buddy for perfect meeting minutes
-
User Google Meet ya Zoom mein live baat kar rahe hain.
-
Flask web app mein login karke woh meeting browser tab ke audio ko screen share permission ke saath record karenge.
-
Recording stop hone par:
- Audio server par save hoga.
- Audio β Text: Speech-to-Text API se transcript.
- Transcript β Gemini AI se clean summary + action items.
- DB mein meeting record store hoga: show, delete, download options.
Layer | Stack |
---|---|
π Frontend | HTML, Tailwind CSS/Bootstrap, Vanilla JS, Jinja2 (Flask) |
ποΈ Audio | JS Web API: getDisplayMedia + MediaRecorder |
π Backend | Python Flask 3.x, Flask-Login, Flask-SQLAlchemy |
π Auth | Flask-Login + hashed passwords |
π£οΈ STT | Google Cloud Speech-to-Text OR Whisper (local) |
π§ AI | Gemini AI (google-generativeai Python SDK) |
ποΈ Database | MySQL (users, meetings, files) |
ποΈ Storage | Audio files: /recordings/ folder on server |
π Export | .txt or .pdf with pdfkit (optional) |
π¦ Env | .env for API keys (Gemini, Google STT) |
meeting-notes-app/
β
βββ app.py # Flask entry point
βββ models.py # SQLAlchemy DB models
βββ auth.py # Login/signup logic
βββ templates/ # Jinja2 templates: login, dashboard, detail
βββ static/ # JS (audio capture), CSS
βββ recordings/ # Uploaded meeting audio files
βββ transcripts/ # Saved transcript text
βββ .env # API keys
βββ requirements.txt
βββ README.md
Column Name | Type | Details |
---|---|---|
id | INT, PK, AUTO_INC | |
name | VARCHAR(255) | |
VARCHAR(255), UNIQUE | ||
password_hash | VARCHAR(255) | Hashed password |
created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
Column Name | Type | Details |
---|---|---|
id | INT, PK, AUTO_INC | |
user_id | INT, FK β users.id | |
title | VARCHAR(255) | βTeam Sync - 2025-06-30β |
audio_file | VARCHAR(255) | Path to saved audio file |
transcript | LONGTEXT | Full transcribed text |
summary | TEXT | Gemini summary |
action_items | JSON | Gemini action items as JSON |
created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP |
-
auth.py
/signup
: Name, Email, Password β hashed store./login
: Email + Password check./logout
: Session clear.
-
Flask-Login manages session.
-
Protect routes:
@login_required
.
-
/dashboard
:- Show list of old meetings: | Title | Date | View | Download | Delete |
- βNew Meeting Noteβ button β triggers capture.
Step 1: Click βStart New Meeting Noteβ. Step 2: JS calls:
navigator.mediaDevices.getDisplayMedia({ audio: true, video: true })
User selects tab/window β mic audio shared.
Step 3: MediaRecorder
records audio:
const recorder = new MediaRecorder(stream, { mimeType: 'audio/webm' });
recorder.ondataavailable = (e) => sendChunk(e.data);
Step 4: Stop:
- Stop button β all chunks merge β send to Flask
/upload
.
-
/upload_audio
: POST route- Receives audio blob.
- Saves file to
/recordings/meeting-xyz.webm
.
-
Flask:
- Pass saved audio to Google Speech-to-Text API OR
- Local Whisper model (
whisper
Python lib).
-
Result: Plain text transcript.
-
Gemini API call:
You are a smart meeting assistant. Given these meeting notes: """ ... """ Tasks: 1. Write a short summary (<=100 words). 2. List clear action items (Who, What, When).
-
Save:
- Summary β DB field.
- Action Items β JSON column.
-
/meeting/<id>
: Show page- Title
- Summary
- Action Items (formatted list)
- Link to download
.txt
or.pdf
.
-
/delete/<id>
: Deletes:- DB record.
- Audio/transcript files.
[Browser]
β Share Tab + Mic (getDisplayMedia)
β MediaRecorder β audio blob
β POST /upload_audio
[Flask Server]
β Save file
β Transcribe (STT)
β Prompt Gemini
β Store summary + actions in DB
β Show on dashboard
- Store audio files safely, cleanup old files.
- Hash passwords.
- Use HTTPS when deploying.
Flask
Flask-Login
Flask-SQLAlchemy
python-dotenv
google-generativeai
google-cloud-speech
whisper
mysqlclient
pdfkit (optional)