This repo uses Bun as the package manager and lockfile source of truth.
bun install
bun run dev
bun run build
bun run lintDo not commit package-lock.json, pnpm-lock.yaml, or yarn.lock.
The application uses a two-stage AI pipeline for meeting minutes generation:
Audio Recording / Upload
│
▼
Faster-Whisper
(Local Speech-to-Text)
│
▼
Clean Transcript
│
▼
POST /api/summarize
│
▼
Groq LLM
│
▼
Structured JSON Output
│
▼
Frontend Rendering
(MoM, Executive Summary, Highlights, Decisions, Action Items, SOP)
-
Faster-Whisper Service (Speech-to-Text)
- Responsible ONLY for speech-to-text transcription
- Language detection
- Returns transcript text
- Configured via
WHISPER_SERVICE_URLenvironment variable
-
Groq LLM (AI Summarization)
- Receives ONLY transcript text (never raw audio)
- Generates structured meeting analysis:
- Executive Summary
- Meeting Summary
- Key Highlights
- Decisions
- Action Items
- Risks
- SOP (Standard Operating Procedure)
- Configured via
GROQ_API_KEYenvironment variable
POST /api/transcribe- Forwards audio to Faster-Whisper servicePOST /api/summarize- Sends transcript to Groq for structured analysis
Create a .env.local file based on .env.example:
# Supabase Configuration
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
# Faster-Whisper Transcription Service
# URL of the existing Faster-Whisper HTTP service
WHISPER_SERVICE_URL=http://localhost:8000
# Groq API Configuration
# Used for AI summarization and MoM generation
GROQ_API_KEY=your-groq-api-key
# Optional: Supabase Audio Storage Bucket
SUPABASE_AUDIO_BUCKET=meeting-audio-
Faster-Whisper Service (Local Speech-to-Text)
- Dependency: This service MUST be running before starting the application
- Must be running and accessible at
WHISPER_SERVICE_URL(e.g.,http://localhost:8000) - Responsible ONLY for speech-to-text transcription and language detection
- Expected to accept POST requests with JSON body:
{ "audio_url": "string", "meeting_id": "string", "audio_file_id": "string" } - Expected to return JSON:
{ "text": "transcript text", "language": "detected language", "duration": 120 } - Important: This service should already be implemented and working. Do NOT modify it.
-
Groq API Key (AI Summarization)
- Sign up at console.groq.com
- Create an API key
- Add to
.env.localasGROQ_API_KEY - Note: Groq receives ONLY transcript text, never raw audio
-
Start Faster-Whisper service first
# Example: Start your existing Faster-Whisper service on port 8000 # Ensure WHISPER_SERVICE_URL in .env.local matches the service URL
-
Start the Next.js application
npm run dev
-
Verify services are running
- Faster-Whisper:
curl http://localhost:8000/health(or your configured endpoint) - Next.js: Open
http://localhost:3000
- Faster-Whisper:
- User records/upload audio → Frontend
- Audio saved to Supabase Storage → API Route
- Transcription request →
/api/transcribe→ Faster-Whisper service- Returns: transcript text, language, duration
- Error 503 if service unavailable
- Summarization request →
/api/summarize→ Groq LLM- Input: transcript text only
- Returns: structured JSON with executive summary, highlights, decisions, action items, risks, SOP
- Error 502 if service fails
GROQ_API_KEYis server-side only and never exposed to the clientWHISPER_SERVICE_URLis server-side only- No API keys or secrets are imported into client components
- Raw transcripts, prompts, and generated content are not logged
- Audio files are never sent to Groq
This project is source-available but not open source.
You may view the code for reference only. You may not copy, reuse, modify, distribute, deploy, or use this project or any part of it for another club, organization, product, or platform without written permission.
See the LICENSE file for details.