AI-powered meeting analysis platform. Upload audio or paste transcripts to get instant summaries, action items, decisions, and intelligent RAG-powered chat with your meetings.
| Layer | Technology |
|---|---|
| Frontend | Next.js 15, TypeScript, Tailwind CSS, shadcn/ui, Framer Motion, React Query |
| Backend | FastAPI (Python) |
| Database | Neon PostgreSQL |
| Vector Store | Pinecone |
| AI | OpenAI GPT-4o-mini, Whisper, text-embedding-3-small |
| Frontend Deploy | Vercel |
| Backend Deploy | Render |
- Meeting Input — Upload audio (mp3, wav, m4a) or paste transcript text
- AI Analysis — Automatic summary, action items, decisions, highlights, next steps
- RAG Chat — Chat with meeting transcripts using semantic search (Pinecone + OpenAI)
- Task Tracking — Convert action items to tasks with status workflow (pending → in progress → completed)
- Decision Tracking — Track decision implementation status
- Dashboard — Meeting history, search, stats overview
p2/
├── frontend/ # Next.js app (deploy to Vercel)
│ ├── src/
│ │ ├── app/ # Pages + API proxy routes
│ │ ├── components/ # UI components (layout, dashboard, meeting, shared)
│ │ ├── hooks/ # React Query hooks
│ │ ├── lib/ # API client, utilities
│ │ └── providers/ # React Query + Tooltip providers
│ └── package.json
├── backend/ # FastAPI app (deploy to Render)
│ ├── app/
│ │ ├── api/ # Route handlers
│ │ ├── services/ # AI, transcription, embedding, Pinecone, RAG
│ │ ├── repositories/ # Database operations
│ │ └── schemas/ # Pydantic models
│ ├── schema.sql # Database migration
│ ├── requirements.txt
│ └── render.yaml # Render deployment config
├── .env.example # Environment variables template
└── README.md
- Node.js 18+
- Python 3.11+
- OpenAI API key
- Pinecone account (free tier works)
- Neon PostgreSQL database (free tier works)
cp .env.example .env
# Edit .env with your actual values- Create a Neon project at neon.tech
- Copy the pooled connection string to
DATABASE_URLin.env - Run the schema:
psql "YOUR_DATABASE_URL" -f backend/schema.sql- Create a free account at pinecone.io
- Create a serverless index:
- Name:
meeting-intel - Dimensions:
1536 - Metric:
cosine - Cloud:
aws, Region:us-east-1
- Name:
- Copy your API key to
PINECONE_API_KEYin.env
//cd backend && ./run-dev.sh
cd backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Copy env vars (backend reads from its own .env)
cp ../.env .env
cd frontend
# Create .env.local for the frontend
echo "BACKEND_URL=http://localhost:8000" > .env.local
npm run dev- Push your code to GitHub
- Go to dashboard.render.com
- Click New → Blueprint Instance
- Connect your GitHub repo
- Render will auto-detect
backend/render.yaml - Set the Root Directory to
backend - Add environment variables:
DATABASE_URL— your Neon pooled connection stringOPENAI_API_KEY— your OpenAI keyPINECONE_API_KEY— your Pinecone keyPINECONE_INDEX_NAME—meeting-intelFRONTEND_URL— your Vercel frontend URL (add after Vercel deploy)
- Deploy — wait for health check to pass at
/api/health
- Go to vercel.com
- Click New Project → Import your GitHub repo
- Set Root Directory to
frontend - Framework will be auto-detected as Next.js
- Add environment variable:
BACKEND_URL— your Render backend URL (e.g.,https://meeting-intel-api.onrender.com)
- Deploy
- Go back to Render and set
FRONTEND_URLto your Vercel URL - Test: visit your Vercel URL → create a meeting → verify it works
□ Create Neon PostgreSQL project → copy pooled DATABASE_URL
□ Run schema.sql against Neon database
□ Create Pinecone serverless index (1536 dims, cosine, us-east-1)
□ Get OpenAI API key from platform.openai.com
□ Deploy backend to Render (connect GitHub, set env vars, root dir: backend)
□ Wait for health check to pass at /api/health
□ Deploy frontend to Vercel (connect GitHub, set BACKEND_URL, root dir: frontend)
□ Update Render FRONTEND_URL with Vercel URL
□ Test full flow: create meeting → check summary → try chat → update tasks
| Variable | Where | Description |
|---|---|---|
DATABASE_URL |
Backend | Neon PostgreSQL pooled connection string |
OPENAI_API_KEY |
Backend | OpenAI API key |
PINECONE_API_KEY |
Backend | Pinecone API key |
PINECONE_INDEX_NAME |
Backend | Pinecone index name (default: meeting-intel) |
FRONTEND_URL |
Backend | Frontend URL for CORS (e.g., https://your-app.vercel.app) |
BACKEND_URL |
Frontend | Backend URL (e.g., https://your-api.onrender.com) |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/health |
Health check |
POST |
/api/meetings |
Create meeting from text |
POST |
/api/meetings/upload |
Create meeting from audio |
GET |
/api/meetings |
List meetings (search via ?search=) |
GET |
/api/meetings/:id |
Get meeting detail |
DELETE |
/api/meetings/:id |
Delete meeting |
GET |
/api/meetings/:id/transcript |
Get transcript |
POST |
/api/meetings/:id/chat |
Send chat message (RAG) |
GET |
/api/meetings/:id/chat |
Get chat history |
GET |
/api/meetings/:id/tasks |
Get tasks |
PATCH |
/api/tasks/:id |
Update task |
GET |
/api/meetings/:id/decisions |
Get decisions |
PATCH |
/api/decisions/:id |
Update decision |
- API Proxy Pattern: Frontend calls its own
/api/*routes which proxy to FastAPI. This eliminates CORS issues and hides the backend URL. - Synchronous Processing: Meeting analysis runs in a single request (no job queues needed).
- File Size Limit: 25MB max for audio uploads (OpenAI Whisper limit).
- RAG Pipeline: Transcript → chunk (500 words, 50 overlap) → embed (text-embedding-3-small) → Pinecone → semantic retrieval → grounded GPT response.
MIT