An AI-powered meeting summarization tool that converts audio recordings into structured summaries, action items, and decisions — instantly.
🔗 https://meetscribe-ai-ten.vercel.app
Upload any meeting recording and MeetScribe AI will:
- Transcribe the audio using Whisper Large v3 (via Groq)
- Generate a structured summary using Llama 3.1 (via Groq)
- Extract action items, decisions, key topics, and meeting sentiment
- Store results so you can search and revisit past meetings
- Let you download a full meeting report as a
.txtfile
Frontend
- React 18 + Vite
- Tailwind CSS
- React Router DOM
- Axios
- React Dropzone
- Lucide React
Backend
- Node.js + Express
- MongoDB Atlas + Mongoose
- Multer (audio file handling)
- Groq SDK (Whisper v3 + Llama 3.1-8b-instant)
- dotenv, cors, nodemon
Deployment
- Frontend → Vercel
- Backend → Render
- Database → MongoDB Atlas (free tier)
meeting-summarizer/
├── client/ # React frontend
│ ├── src/
│ │ ├── components/
│ │ │ ├── Navbar.jsx
│ │ │ ├── UploadZone.jsx # Drag & drop with 3 UI states
│ │ │ ├── SummaryCard.jsx # AI analysis display
│ │ │ ├── MeetingCard.jsx # History list item
│ │ │ └── LoadingSpinner.jsx
│ │ ├── pages/
│ │ │ ├── UploadPage.jsx # Home — file upload + progress
│ │ │ ├── ResultsPage.jsx # AI output after processing
│ │ │ ├── HistoryPage.jsx # All past meetings + search
│ │ │ └── MeetingDetailPage.jsx
│ │ ├── services/
│ │ │ └── api.js # All axios calls in one place
│ │ └── App.jsx
│ └── .env
│
└── server/ # Express backend
├── config/
│ └── groqClient.js # Groq SDK instance
├── controllers/
│ └── meetingController.js # Request/response logic
├── middleware/
│ └── upload.js # Multer config + file validation
├── models/
│ └── Meeting.js # Mongoose schema
├── routes/
│ └── meetingRoutes.js # API route definitions
├── services/
│ └── meetingService.js # Whisper + Llama 3 pipeline
├── uploads/ # Temporary audio storage
└── index.js # Entry point
- Node.js 18+
- A free Groq API key
- A free MongoDB Atlas cluster
git clone https://github.com/yourusername/meetscribe-ai.git
cd meetscribe-aicd server
npm installCreate server/.env:
PORT=5000
MONGO_URI=your_mongodb_atlas_connection_string
GROQ_API_KEY=your_groq_api_keyStart the server:
npm run devServer runs on http://localhost:5000. Verify at http://localhost:5000/health.
cd client
npm installCreate client/.env:
VITE_API_URL=http://localhost:5000/apiStart the frontend:
npm run devApp runs on http://localhost:5173.
| Method | Endpoint | Description |
|---|---|---|
GET |
/health |
Server health check |
POST |
/api/meetings/upload |
Upload and process audio file |
GET |
/api/meetings |
Get all completed meetings |
GET |
/api/meetings/:id |
Get one meeting by ID |
POST /api/meetings/upload
Content-Type: multipart/form-data
Fields:
audio (File) — required, max 25MB, audio formats only
title (String) — optional
{
"message": "Meeting processed successfully",
"meeting": {
"_id": "64abc...",
"title": "Q3 Sprint Planning",
"transcript": "Alright everyone, let's get started...",
"analysis": {
"summary": "The team aligned on Q3 release scope and assigned QA ownership.",
"actionItems": ["Ravi to update test plan by Friday"],
"decisions": ["Release pushed to August 15th"],
"sentiment": "positive",
"keyTopics": ["release planning", "QA", "deadlines"],
"duration": "approximately 25 minutes"
},
"status": "completed",
"fileSize": "3.12 MB",
"createdAt": "2025-01-15T10:30:00.000Z"
}
}Audio file (mp3/wav/webm)
↓
Groq Whisper Large v3
↓
Raw transcript text
↓
Groq Llama 3.1-8b-instant
(structured prompt → JSON)
↓
{ summary, actionItems, decisions,
sentiment, keyTopics, duration }
↓
Saved to MongoDB Atlas
Why Groq? Groq's free tier includes both Whisper and Llama 3.1 with fast LPU-based inference — no credit card required. Ideal for a production-grade prototype.
Reliable JSON extraction — LLMs occasionally wrap responses in natural language even when instructed not to. A regex fallback parser extracts the JSON object regardless:
try {
return JSON.parse(raw)
} catch (e) {
const match = raw.match(/\{[\s\S]*\}/)
if (match) return JSON.parse(match[0])
throw new Error('Could not parse AI response')
}- Push
server/to GitHub - Create a new Web Service on Render
- Set build command:
npm install - Set start command:
node index.js - Add environment variables:
PORT,MONGO_URI,GROQ_API_KEY
- Push
client/to GitHub - Import the repo on Vercel
- Add environment variable:
VITE_API_URL=https://your-render-url.onrender.com/api - Deploy
Note: Render's free tier spins down after inactivity. The first request after idle may take ~30 seconds to wake up — expected behaviour for a portfolio project.
| Format | Extension |
|---|---|
| MP3 | .mp3 |
| WAV | .wav |
| WebM | .webm |
| MPEG-4 Audio | .m4a |
| OGG | .ogg |
Maximum file size: 25MB (Groq API limit)
| Variable | Description |
|---|---|
PORT |
Server port (default: 5000) |
MONGO_URI |
MongoDB Atlas connection string |
GROQ_API_KEY |
Groq API key from console.groq.com |
| Variable | Description |
|---|---|
VITE_API_URL |
Backend base URL |
- JWT authentication — scope meetings per user
- Job queue (BullMQ) — async processing so HTTP requests don't hang
- S3/R2 storage — replace ephemeral local uploads folder
- Streaming responses — show transcript as it's generated
- Speaker diarization — identify who said what
- Export to PDF/Notion/Slack
MIT