A complete web application for transcribing, summarizing, and extracting action items from meeting recordings using AWS services (Transcribe, Bedrock, S3) with FastAPI backend and Next.js frontend.
βββββββββββββββββββ ββββββββββββββββ βββββββββββββββββββ
β Next.js UI βββββββΆβ FastAPI βββββββΆβ AWS Services β
β (Frontend) β β (Backend) β β - S3 β
β Port 3000 β β Port 8000 β β - Transcribe β
β ββββββββ ββββββββ - Bedrock β
βββββββββββββββββββ ββββββββββββββββ βββββββββββββββββββ
- Python 3.8+
- Node.js 18+
- AWS Account with:
- S3 bucket created
- Transcribe service enabled
- Bedrock access with Claude models enabled
- IAM credentials configured
# Backend directory
cd backend
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Set environment variables
export AWS_ACCESS_KEY_ID=aws-access-key
export AWS_SECRET_ACCESS_KEY=aws-secret-key
export AWS_BEARER_TOKEN_BEDROCK=bedrock-api-token
export S3_BUCKET_NAME=your-meeting-recordings-bucket
export AWS_REGION=us-east-1
export JWT_SECRET_KEY=your-secret-key-change-this
# (Optional) Override DB URL; by default this uses a local SQLite file
# export DATABASE_URL=postgresql+psycopg2://meetings:meetingspassword@localhost:5432/meetings
# Run the backend (local dev)
uvicorn main:app --reload --host 0.0.0.0 --port 8000# In a new terminal, go to frontend
cd frontend
# Install additional dependencies
npm install
# Create .env.local for environment variables
cat > .env.local << EOF
NEXT_PUBLIC_API_URL=http://localhost:8000
EOF
# Run the frontend
npm run devThe repository includes a docker-compose.yml that starts:
- FastAPI backend (
meetings-backend) - Next.js frontend (
meetings-frontend) - PostgreSQL database (
meetings-postgres)
# From the project root
docker compose up --buildThis will:
- Expose the backend on
http://localhost:8000 - Expose the frontend on
http://localhost:3000 - Start PostgreSQL on
localhost:5432
The backend is configured to use PostgreSQL via the DATABASE_URL environment variable in docker-compose.yml:
DATABASE_URL=postgresql+psycopg2://meetings:meetingspassword@db:5432/meetingsTo override this (e.g. for production), create a .env file in the project root and set DATABASE_URL there; Docker Compose will pick it up automatically.
You can connect to the DB (e.g. with psql or a GUI like TablePlus/DBeaver) using:
Host: localhost
Port: 5432
Database: meetings
User: meetings
Password: meetingspasswordaws s3 mb s3://your-meeting-recordings-bucket --region us-east-1- Go to AWS Console β Bedrock
- Request model access for Claude 3.5 Sonnet
- Wait for approval (usually instant)
Create an IAM user or role with this policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::your-meeting-recordings-bucket/*"
},
{
"Effect": "Allow",
"Action": [
"transcribe:StartTranscriptionJob",
"transcribe:GetTranscriptionJob",
"transcribe:ListTranscriptionJobs"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel"
],
"Resource": "*"
}
]
}meeting-transcription-app/
βββ backend/
β βββ main.py # FastAPI application
β βββ requirements.txt # Python dependencies
β
βββ frontend/
βββ app/
β βββ page.tsx # Root redirect
β βββ layout.tsx # Root layout
β βββ globals.css # Global styles
β βββ login/
β β βββ page.tsx # Login page
β βββ dashboard/
β β βββ page.tsx # Dashboard with session cards
β βββ session/
β βββ [id]/
β βββ page.tsx # Session detail view
βββ lib/
β βββ api.ts # API client
βββ package.json
βββ tailwind.config.js
βββ tsconfig.json
- Username:
admin - Password:
m33t!ng5
- JWT-based authentication
- Secure login with bcrypt password hashing
- Token stored in localStorage
- Upload audio files (MP3, WAV, MP4, M4A, FLAC, OGG)
- Create titled meeting sessions
- View all sessions as cards
- Delete unwanted sessions
- Session history persists
- Transcription: AWS Transcribe with speaker identification
- Summary: AI-generated meeting summary using Claude
- Action Items: Extracted tasks and follow-ups
- Modern, responsive design with Tailwind CSS
- Real-time status updates
- Progress indicators
- Download transcription, summary, and action items
- Session cards with status badges
S3_BUCKET_NAME=your-meeting-recordings-bucket
AWS_REGION=us-east-1
JWT_SECRET_KEY=your-super-secret-key-change-this
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
DATABASE_URL=postgresql+psycopg2://meetings:meetingspassword@localhost:5432/meetingsNEXT_PUBLIC_API_URL=http://localhost:8000POST /api/auth/login- Login and get JWT token
GET /api/sessions- Get all sessionsGET /api/sessions/{id}- Get specific sessionPOST /api/sessions- Create new sessionPOST /api/sessions/{id}/process- Check/process transcriptionDELETE /api/sessions/{id}- Delete session
GET /api/health- Health check
- Login with credentials
- Click "New Meeting" to upload a recording
- Enter title and select audio file
- Wait for processing:
- Upload to S3 β
- Transcribe with speaker labels β
- Generate summary with Claude β
- Extract action items β
- View results in session detail page
- Download transcription, summary, or action items
- Delete unwanted sessions
# Check if backend is running
curl http://localhost:8000/api/health
# Check AWS credentials
aws sts get-caller-identity
# Check S3 bucket access
aws s3 ls s3://your-meeting-recordings-bucket# Clear cache and reinstall
rm -rf node_modules package-lock.json
npm install
# Check environment variables
cat .env.local- Ensure Bedrock model access is approved
- Check IAM permissions
- Verify S3 bucket exists in correct region
- Check CloudWatch logs for Transcribe errors
- Change the default JWT secret key
- Use environment variables for all secrets
- Implement proper database instead of in-memory storage
- Add rate limiting
- Use HTTPS
- Implement proper CORS policies
- Add input validation and sanitization
- Use secure password requirements
- Implement user registration and password reset
# View uvicorn logs
tail -f uvicorn.log- Monitor Transcribe job failures
- Check Bedrock invocation metrics
- Review S3 access logs
- Test locally first before deploying
- Use small audio files during development to save time
- Monitor AWS costs - Transcribe and Bedrock can be expensive
- Keep sessions list refreshed to see status updates
- Check browser console for frontend errors
- Use background tasks (Celery, etc.) for production processing
# Using Docker
docker build -t meeting-backend .
docker run -p 8000:8000 --env-file .env meeting-backend
# Using systemd service
sudo systemctl start meeting-backend# Build for production
npm run build
# Start production server
npm start
# Or deploy to Vercel
vercel deployThis is a Phase 1 implementation. Future enhancements could include:
- User registration and management
- PostgreSQL database integration
- Real-time WebSocket updates
- Collaborative session sharing
- Email notifications
- Calendar integration
- Multiple language support
- Custom AI prompts
MIT License - feel free to use and modify!
For issues:
- Check AWS service status
- Verify credentials and permissions
- Review backend logs
- Check browser console
- Test API endpoints with curl/Postman
Happy Meeting Transcribing! ποΈ