Every meeting recorder out there — Fireflies, Otter, Grain — joins your call as a visible bot. Everyone sees it. People speak differently. In sensitive meetings, it's simply not appropriate.
Minutz is different. It runs entirely inside your browser. No bot joins. No notification is sent. You hit record, have your meeting naturally, and structured intelligence is waiting for you when you're done.
After every recorded meeting, Minutz automatically produces:
- 📝 Full transcript — word for word, everything said
- ⚡ Executive summary — one paragraph, the key points
- ✅ Action items — contextually inferred, not keyword-matched
- 🎯 Decisions — what was committed to or agreed upon
- 🔔 Follow-ups — open questions and promised deliverables
- 📊 Sentiment + urgency — tone and priority signals
You speak → Chrome extension captures audio invisibly
→ 10-second chunks upload to FastAPI in background
→ You stop recording
→ ffmpeg merges all chunks into one clean audio file
→ OpenAI Whisper transcribes the full recording
→ GPT-4o extracts structured intelligence
→ Dashboard shows everything, ready in ~60 seconds
The extension injects directly into the Google Meet page, intercepting WebRTC audio streams before Meet can mute them. This is why it works when tab capture doesn't.
The extension is not published on the Chrome Web Store yet. You need to install it manually in Developer Mode — it takes 60 seconds.
Step 1 — Download or clone this repository
git clone https://github.com/dhruvil-codes/minutz.gitStep 2 — Open Chrome and go to:
chrome://extensions
Step 3 — Enable Developer mode using the toggle in the top-right corner
Step 4 — Click "Load unpacked"
Step 5 — Select the /extension folder from this repository
Step 6 — The Minutz ⚡ icon will appear in your Chrome toolbar. Pin it for easy access.
⚠️ Every time you update the extension files, go back tochrome://extensionsand click the refresh icon (↺) on the Minutz card to reload it.
| Layer | Technology |
|---|---|
| Chrome Extension | MV3, content scripts, Web Audio API, WebRTC interception |
| Backend | Python FastAPI, OpenAI Whisper, GPT-4o, ffmpeg |
| Dashboard | Next.js 16, React 19, Tailwind CSS v4, shadcn/ui |
| Database | Supabase (PostgreSQL) |
| Deployment | Render (backend), Vercel (dashboard) |
minutz/
├── extension/ # Chrome MV3 extension
│ ├── manifest.json
│ ├── background.js # Service worker, chunk upload
│ ├── meet-inject.js # WebRTC audio interception (world: MAIN)
│ ├── meet-capture.js # Isolated world bridge
│ ├── popup.html/js # Extension popup UI
│ └── offscreen.js # Offscreen audio document
│
├── backend/ # FastAPI backend
│ ├── main.py # All endpoints
│ ├── requirements.txt
│ └── .env.example
│
└── dashboard/ # Next.js dashboard
├── app/
├── components/
└── .env.example
- Python 3.10+
- Node.js 18+
- Chrome browser
- Supabase project
- OpenAI API key
cd backend
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate
pip install -r requirements.txtCopy the example env and fill in your keys:
cp .env.example .envOPENAI_API_KEY=sk-...
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_KEY=your-service-role-key
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
SLACK_BOT_TOKEN=xoxb-...
SLACK_CHANNEL_ID=C0XXXXXXXXXStart the server:
uvicorn main:app --reload --port 8001cd dashboard
npm installCreate dashboard/.env.local:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-keynpm run dev
# Runs at http://localhost:3000Follow the manual install steps above.
Make sure the backend URL in background.js points to your running backend — either http://localhost:8001 for local dev or your Render deployment URL for production.
| Method | Endpoint | Description |
|---|---|---|
GET |
/health |
Health check |
POST |
/upload-chunk |
Upload audio chunk from extension |
POST |
/finalize/{session_id} |
Merge chunks, transcribe, summarize |
POST |
/summarize |
Summarize a transcript directly |
GET |
/meetings |
List all meetings |
GET |
/meeting/{id} |
Full meeting detail |
GET |
/meeting/{id}/status |
Processing status |
POST |
/send-to-slack |
Post summary to Slack |
Minutz tunes the GPT-4o prompt based on meeting type:
| Mode | Best for |
|---|---|
general |
All-purpose meetings, standups, team calls |
sales |
Sales calls, demos, discovery sessions |
pm |
Sprint planning, retros, product reviews |
financial |
Earnings calls, budget reviews, investor meetings |
The backend expects three Supabase tables: meetings, transcripts, and summaries.
Run the migrations in supabase/migrations/ to set up the schema and apply hardened RLS policies.
Also enable leaked password protection in your Supabase dashboard under Auth → Password Security — this cannot be set via SQL migrations.
| Variable | Description |
|---|---|
OPENAI_API_KEY |
OpenAI API key for Whisper + GPT-4o |
SUPABASE_URL |
Supabase project URL |
SUPABASE_KEY |
Supabase service role key |
SLACK_WEBHOOK_URL |
Incoming webhook URL |
SLACK_BOT_TOKEN |
Slack bot token |
SLACK_CHANNEL_ID |
Target Slack channel ID |
| Variable | Description |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anon key |
- Desktop app for Zoom, Teams, Webex (system audio capture — no browser needed)
- Speaker diarization (who said what)
- Real-time live transcript
- Notion integration
- HubSpot + Jira sync
- Action item tracking with due dates and completion status
- Search across all meetings
- Chrome Web Store publish
- OpenAI Whisper — speech to text
- OpenAI GPT-4o — meeting intelligence extraction
- FastAPI — backend API
- Supabase — database and auth
- Next.js — dashboard
- ffmpeg — audio processing
Built for the Outskill × OpenAI Hackathon · May 2026
Made by Dhruvil Mistry
