Skip to content

MeetingMiner as a stand-alone app (no OIDC). Below is a full, exam-ready blueprint that hits all required features (1–13) from your checklist, while wiring in Vapi or ElevenLabs for voice and Gemini “Nano Banana” (Gemini 2.5 Flash Image) for visuals.

Notifications You must be signed in to change notification settings

indranilbanerjee/MeetingMinner

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MeetingMiner

AI-powered meeting management system that transforms audio recordings into searchable transcripts, summaries, and action items.

Features

  • 🎙️ Audio Upload - Upload meeting recordings with secure signed URLs
  • 📝 Transcription - Convert audio to text (Vapi/ElevenLabs integration)
  • 🤖 AI Summarization - Generate summaries, decisions, and risks
  • Action Extraction - Automatically extract and track action items
  • 🔍 Semantic Search - RAG-powered search using OpenAI embeddings + pgvector
  • 📄 PDF Export - Generate and view meeting minutes
  • 🔒 Secure - Row-level security (RLS) with role-based access control
  • 👥 Multi-user - Google Sign-In with project-based permissions

Tech Stack

  • Frontend: Next.js 15 (App Router), React 19, TailwindCSS
  • Backend: Next.js Server Actions
  • Database: Supabase (Postgres + RLS + pgvector)
  • Storage: Supabase Storage (private buckets)
  • Auth: Supabase Auth (Google OAuth)
  • AI: OpenAI (embeddings + chat)
  • PDF: pdf-lib + PDF.js
  • Testing: Playwright

Prerequisites

  • Node.js 18+ and npm
  • Supabase account and project
  • OpenAI API key
  • Google OAuth credentials (configured in Supabase)

Setup

1. Clone and Install

git clone <repository-url>
cd MeetingMiner
npm install

2. Environment Variables

Copy .env.local.example to .env.local and fill in your credentials:

# Supabase
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx
SUPABASE_SERVICE_ROLE_KEY=xxx

# OpenAI
OPENAI_API_KEY=sk-xxx
OPENAI_EMBEDDING_MODEL=text-embedding-3-large
OPENAI_CHAT_MODEL=gpt-4o-mini

# Vector settings (MUST match embedding model)
VECTOR_DIM=3072  # 3072 for text-embedding-3-large, 1536 for text-embedding-3-small

# Optional: Voice providers
VOICE_PROVIDER=vapi
VAPI_API_KEY=xxx
ELEVEN_API_KEY=xxx

3. Database Setup

Run migrations in Supabase SQL Editor (in order):

# 1. Initial schema
db/migrations/001_initial_schema.sql

# 2. Enable RLS
db/migrations/002_enable_rls.sql

# 3. Vector index
db/migrations/003_vector_index.sql

See db/README.md for detailed instructions.

4. Configure Google OAuth

  1. Go to Supabase Dashboard → Authentication → Providers
  2. Enable Google provider
  3. Add your Google OAuth credentials
  4. Set authorized redirect URLs:
    • http://localhost:3000/auth/callback (development)
    • https://yourdomain.com/auth/callback (production)

5. Create Storage Bucket

In Supabase Dashboard → Storage:

  1. Create bucket named meetings
  2. Set to Private (not public)
  3. No additional policies needed (RLS handles access)

Development

# Start dev server
npm run dev

# Run tests
npm test

# Run tests with UI
npm run test:ui

# Build for production
npm run build

# Start production server
npm start

Project Structure

MeetingMiner/
├── app/                      # Next.js App Router
│   ├── api/                  # API routes
│   │   ├── meetings/         # Meeting CRUD
│   │   └── storage/          # Signed URL generation
│   ├── auth/                 # Auth callback
│   ├── login/                # Login page
│   ├── (protected)/          # Auth-guarded routes
│   │   ├── projects/         # Projects & meetings
│   │   └── admin/            # Admin section
│   ├── layout.tsx            # Root layout
│   └── page.tsx              # Home page
├── lib/                      # Shared libraries
│   ├── supabase/             # Supabase clients
│   ├── openai/               # OpenAI helpers
│   ├── storage/              # Storage helpers
│   └── vector/               # Vector search
├── db/                       # Database migrations
│   └── migrations/           # SQL files
├── tests/                    # Tests
│   └── e2e/                  # Playwright E2E tests
├── middleware.ts             # Auth middleware
└── .env.local                # Environment variables

Security

Row-Level Security (RLS)

All tables have RLS enabled with policies:

  • SELECT: Members can view their project data
  • INSERT/UPDATE/DELETE: Owners and editors only
  • Actions: Assignees can update their own status

Storage Security

  • All buckets are private
  • Uploads use createSignedUploadUrl (2-hour validity)
  • Downloads use createSignedUrl (1-hour validity)
  • Never expose raw storage paths

Authentication

  • Google Sign-In via Supabase Auth
  • Session refresh on every request (middleware)
  • Protected routes redirect to login

API Endpoints

Meetings

  • POST /api/meetings - Create meeting
  • POST /api/meetings/:id/finalize-upload - Save audio file reference
  • POST /api/meetings/:id/transcribe - Trigger transcription
  • POST /api/meetings/:id/summarize - Generate summary
  • POST /api/meetings/:id/actions/extract - Extract actions
  • POST /api/meetings/:id/rag/query - RAG search
  • GET /api/meetings/:id/export.pdf - Export PDF

Storage

  • POST /api/storage/signed-upload - Get signed upload URL

Testing

E2E Tests (Playwright)

# Run all tests
npm test

# Run specific test file
npx playwright test tests/e2e/auth.spec.ts

# Run with UI
npm run test:ui

# Generate test report
npx playwright show-report

Test Coverage

  • ✅ Auth guard (non-member blocked)
  • ✅ Storage privacy (signed URLs only)
  • ✅ Upload → Transcribe pipeline
  • ✅ Summary generation (valid JSON)
  • ✅ Action extraction
  • ✅ PDF export
  • ✅ RAG search with citations

Performance Budgets

  • ⏱️ Time-to-first summary: P95 ≤ 90s
  • 🔍 RAG retrieval: P95 ≤ 300ms (HNSW index)
  • 🎯 Action extraction precision: ≥ 85%

Troubleshooting

Vector Dimension Mismatch

If you see errors about embedding dimensions:

  1. Check OPENAI_EMBEDDING_MODEL in .env.local
  2. Ensure VECTOR_DIM matches:
    • text-embedding-3-small = 1536
    • text-embedding-3-large = 3072
  3. Update vector_chunks table if needed:
    ALTER TABLE vector_chunks ALTER COLUMN embedding TYPE vector(3072);

RLS Blocking Queries

If queries fail with permission errors:

  1. Verify user is authenticated
  2. Check project membership in project_members table
  3. Review RLS policies in db/migrations/002_enable_rls.sql

Storage Upload Fails

  1. Verify bucket meetings exists and is private
  2. Check signed URL hasn't expired (2-hour limit)
  3. Ensure file size is within limits

Contributing

  1. Create feature branch
  2. Make changes
  3. Add tests
  4. Run npm test
  5. Submit PR

License

MIT

Support

For issues and questions, please open a GitHub issue.

About

MeetingMiner as a stand-alone app (no OIDC). Below is a full, exam-ready blueprint that hits all required features (1–13) from your checklist, while wiring in Vapi or ElevenLabs for voice and Gemini “Nano Banana” (Gemini 2.5 Flash Image) for visuals.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published