Generate meeting agendas and summaries with AI-powered assistance. This application leverages OpenAI to create structured agendas from meeting topics and manages transcripts via AWS S3.
- AI-Powered Agenda Generation - Create structured meeting agendas from topics using OpenAI
- Transcript Management - Upload and store meeting transcripts in AWS S3
- Meeting History - Track all generated meetings with timestamps
- Responsive Design - Built with Next.js and Tailwind CSS
- Secure Deployment - Support for Docker local testing and Vercel production deployment
- Get API Key
- Create account and generate secret key
- Keep key secure (never commit to git)
You'll need to set up the following AWS resources:
Required:
- S3 bucket for transcript storage
- DynamoDB table for meeting data
- IAM user with appropriate permissions
- CORS configuration on S3 bucket
Optional:
- CloudWatch for monitoring (recommended)
- AWS CloudTrail for audit logging
- Node.js 20+
- npm or yarn
- Docker (for containerized local deployment)
- AWS CLI (optional, for AWS setup via command line)
| Layer | Technology |
|---|---|
| Frontend | Next.js 14, React, Tailwind CSS |
| Backend | Next.js API Routes |
| Database | AWS DynamoDB |
| Storage | AWS S3 |
| AI | OpenAI API |
| Validation | Zod |
| Container | Docker |
This section guides you through setting up all AWS resources needed for both local Docker deployment and Vercel production deployment.
Resources to create:
- β S3 Bucket (for transcripts)
- β DynamoDB Table (for meeting data)
- β IAM User (for credentials)
- β S3 CORS Configuration (for uploads)
- Go to AWS S3 Console
- Click Create bucket
- Bucket name:
your_s3_bucket_name(must be globally unique, can add suffix like-yourname) - Region: Select your region (e.g.,
us-east-1) - Block Public Access: Keep all β checked (important for security)
- Click Create bucket
- Copy the bucket name - you'll need it later
aws s3 mb s3://your_s3_bucket_name --region us-east-1aws s3 lsYou should see your bucket in the list.
- Go to S3 Console β Your bucket
- Click Properties tab
- Scroll to Default encryption
- Click Edit
- Select SSE-S3
- Click Save changes
aws s3api put-bucket-encryption \
--bucket your_s3_bucket_name \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}]
}' \
--region us-east-1Protects against accidental deletions.
- Go to your S3 bucket
- Click Properties tab
- Scroll to Versioning
- Click Edit
- Select Enable versioning
- Click Save changes
aws s3api put-bucket-versioning \
--bucket your_s3_bucket_name \
--versioning-configuration Status=Enabled \
--region us-east-1- Go to AWS DynamoDB Console
- Click Create table
- Table name:
your_dynamodb_table_name(exact name required) - Partition key:
id(String) - Sort key: None (leave empty)
- Billing mode: Pay-per-request (good for variable traffic)
- Click Create table
- Wait for table status to show Active (usually 1-2 minutes)
aws dynamodb create-table \
--table-name your_dynamodb_table_name \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST \
--region us-east-1aws dynamodb describe-table --table-name your_dynamodb_table_name --region us-east-1Check for "TableStatus": "ACTIVE"
- Go to AWS IAM Console
- Click Users (left sidebar)
- Click Create user
- User name:
ai-meeting-assistant - Click Next
- Choose Attach policies directly
- Search for and select these policies:
- β
AmazonS3FullAccess - β
AmazonDynamoDBFullAccess
- β
- Click Next β Create user
# Create user
aws iam create-user --user-name ai-meeting-assistant
# Attach S3 policy
aws iam attach-user-policy \
--user-name ai-meeting-assistant \
--policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
# Attach DynamoDB policy
aws iam attach-user-policy \
--user-name ai-meeting-assistant \
--policy-arn arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess- Go to IAM Users
- Click the
ai-meeting-assistantuser - Click Security credentials tab
- Scroll to Access keys section
- Click Create access key
- Select Application running outside AWS
- Click Next
- Click Create access key
- IMPORTANT: Copy both values immediately:
- Access Key ID (starts with
AKIA) - Secret Access Key
- Access Key ID (starts with
Store these securely:
Access Key ID: AKIA...
Secret Access Key: wJa...
aws iam create-access-key --user-name ai-meeting-assistantFor tighter security, create a custom policy instead of using full S3/DynamoDB access.
- Go to IAM Policies
- Click Create policy
- Click JSON tab
- Paste this policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3TranscriptAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::your_s3_bucket_name/*"
},
{
"Sid": "DynamoDBMeetingAccess",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:us-east-1:*:table/your_dynamodb_table_name"
}
]
}- Click Next
- Policy name:
ai-meeting-assistant-policy - Click Create policy
- Go back to the IAM user
- Click Add permissions β Attach policies directly
- Search for and select
ai-meeting-assistant-policy - Click Attach policies
CORS (Cross-Origin Resource Sharing) allows your frontend to upload files directly to S3.
Use this configuration for both environments:
- Go to S3 Console β Your bucket
- Click Permissions tab
- Scroll to Cross-origin resource sharing (CORS)
- Click Edit
- Paste this configuration:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["PUT", "POST", "GET"],
"AllowedOrigins": [
"https://your-vercel-url.vercel.app",
"http://localhost:3000",
"http://127.0.0.1:3000",
"http://0.0.0.0:3000"
],
"ExposeHeaders": []
}
]- Click Save changes
your-vercel-url.vercel.app with your actual Vercel domain after deployment!
If you only want to test locally:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["PUT", "POST", "GET"],
"AllowedOrigins": [
"http://localhost:3000",
"http://127.0.0.1:3000",
"http://0.0.0.0:3000"
],
"ExposeHeaders": []
}
]When ready for production, restrict to Vercel URL only:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["PUT", "POST", "GET"],
"AllowedOrigins": [
"https://your-vercel-url.vercel.app"
],
"ExposeHeaders": []
}
]Before proceeding, verify everything is set up:
- S3 bucket created:
your_s3_bucket_name - S3 bucket encryption enabled
- S3 bucket versioning enabled (optional, but recommended)
- DynamoDB table created:
your_dynamodb_table_name - DynamoDB table is "Active"
- IAM user created:
ai-meeting-assistant - Access keys generated and saved securely
- S3 CORS configured with localhost origins
- All credentials copied to safe location
Status: AWS prerequisites complete β
git clone https://github.com/yourusername/100DaysOpenSource.git
cd 100DaysOpenSource/AIMeetingAgenda/ai-meeting-assistantnpm installCreate a .env.local file for local development:
# OpenAI - Get from https://platform.openai.com/api-keys
OPENAI_API_KEY=sk-your-actual-api-key-here
# AWS Credentials - From IAM user creation
AWS_ACCESS_KEY_ID=AKIA-your-actual-access-key
AWS_SECRET_ACCESS_KEY=your-actual-secret-key
# AWS Configuration
AWS_REGION=us-east-1
# AWS Resources - From setup above
S3_BUCKET_NAME=your_s3_bucket_name
DYNAMODB_TABLE_NAME=your_dynamodb_table_nameExample .env.local:
OPENAI_API_KEY=sk-proj-abc123...
AWS_ACCESS_KEY_ID=your_actual_access_key_id
AWS_SECRET_ACCESS_KEY=your_actual_secret_access_key
AWS_SESSION_TOKEN=your_actual_session_token
AWS_REGION=us-east-1
S3_BUCKET_NAME=your_s3_bucket_name
DYNAMODB_TABLE_NAME=your_dynamodb_table_name.env.local to git. It's already in .gitignore.
npm run devOpens at http://localhost:3000
npm run dev # Start development server
npm run build # Build for production
npm start # Start production server
npm run lint # Run ESLint- Docker installed on your machine
- AWS resources created and configured (S3, DynamoDB, IAM)
- S3 CORS configured with
http://localhost:3000 - Access keys and API key ready
docker build -t ai-meeting-assistant .Create .env.production in the project root:
# OpenAI
OPENAI_API_KEY=sk-your-actual-api-key-here
# AWS Credentials
AWS_ACCESS_KEY_ID=AKIA-your-actual-access-key
AWS_SECRET_ACCESS_KEY=your-actual-secret-key
AWS_REGION=us-east-1
# AWS Resources
S3_BUCKET_NAME=your_s3_bucket_name
DYNAMODB_TABLE_NAME=your_dynamodb_table_name- Never commit
.env.productionto git - Never push Docker image with secrets
- Use environment variables at runtime only
docker run --env-file .env.production -p 3000:3000 ai-meeting-assistantdocker run -e OPENAI_API_KEY="sk-your-key" \
-e AWS_ACCESS_KEY_ID="AKIA..." \
-e AWS_SECRET_ACCESS_KEY="wJa..." \
-e AWS_REGION="us-east-1" \
-e S3_BUCKET_NAME="your_s3_bucket_name" \
-e DYNAMODB_TABLE_NAME="your_dynamodb_table_name" \
-p 3000:3000 ai-meeting-assistant- Open browser:
http://localhost:3000 - Test agenda generation
- Test transcript upload
- Verify data in AWS:
# Check S3 uploads
aws s3 ls s3://your_s3_bucket_name/
# Check DynamoDB items
aws dynamodb scan --table-name your_dynamodb_table_name# Build image
docker build -t ai-meeting-assistant .
# Run container
docker run --env-file .env.production -p 3000:3000 ai-meeting-assistant
# List running containers
docker ps
# View container logs
docker logs <container-id>
# Stop container
docker stop <container-id>
# Remove container
docker rm <container-id>
# Remove image
docker rmi ai-meeting-assistant
# Run in detached mode (background)
docker run -d --env-file .env.production -p 3000:3000 ai-meeting-assistant
# View logs with follow
docker logs -f <container-id>- GitHub account with repository pushed
- AWS resources fully configured (S3, DynamoDB, IAM)
- OpenAI API key ready
- Access keys from IAM user
- Vercel account (free tier available)
- Go to vercel.com
- Click Sign Up
- Choose Continue with GitHub
- Authorize Vercel to access your repositories
- Click Add New β Project
- Click Import Git Repository
- Paste your repository URL
- Click Import
CRITICAL: Never commit secrets to git. Add them in Vercel dashboard only.
- Vercel dashboard β Settings β Environment Variables
- Add each variable individually:
| Variable | Value | Type |
|---|---|---|
OPENAI_API_KEY |
sk-... |
Secret |
AWS_ACCESS_KEY_ID |
AKIA... |
Secret |
AWS_SECRET_ACCESS_KEY |
Your secret key | Secret |
AWS_REGION |
us-east-1 |
Plain |
S3_BUCKET_NAME |
your_s3_bucket_name |
Plain |
DYNAMODB_TABLE_NAME |
your_dynamodb_table_name |
Plain |
For each variable:
- Select Environment: Production
- Click Add
- Click Deploy
- Wait for build to complete (usually 2-3 minutes)
- When complete, you'll see your Vercel URL:
https://ai-meeting-assistant-xxx.vercel.app - SAVE THIS URL - you need it for CORS setup
Now update S3 CORS to include your Vercel URL:
- Go to S3 Console β Your bucket
- Click Permissions β CORS
- Update configuration:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["PUT", "POST", "GET"],
"AllowedOrigins": [
"https://ai-meeting-assistant-xxx.vercel.app" # or your website
],
"ExposeHeaders": []
}
]- Click Save changes
Test your live app:
# Visit in browser
https://your-vercel-url.vercel.app- Vercel dashboard β Monitoring
- Enable Error Tracking
- Enable Analytics
# Visit your Vercel URL
https://your-vercel-url.vercel.app
# Test API
curl -X POST https://your-vercel-url.vercel.app/api/agenda \
-H "Content-Type: application/json" \
-d '{"topics":"Production test"}'| Variable | Required | Description | Example | Where to Get |
|---|---|---|---|---|
OPENAI_API_KEY |
Yes | OpenAI API key | sk-proj-... |
OpenAI Dashboard |
AWS_ACCESS_KEY_ID |
Yes | AWS IAM access key | AKIA... |
IAM User Access Keys |
AWS_SECRET_ACCESS_KEY |
Yes | AWS IAM secret key | wJa... |
IAM User Access Keys |
AWS_REGION |
Yes | AWS region | us-east-1 |
Your AWS region |
S3_BUCKET_NAME |
Yes | S3 bucket name | your_s3_bucket_name |
S3 Console |
DYNAMODB_TABLE_NAME |
Yes | DynamoDB table | your_dynamodb_table_name |
DynamoDB Console |
- β Store secrets in environment variables only
- β
Use
.env.productionlocally (never commit) - β Use Vercel's secure environment variable manager
- β Rotate API keys every 90 days
- β Use IAM roles with minimal permissions
- β Enable S3 encryption (AES-256)
- β Enable DynamoDB point-in-time recovery
- β Use HTTPS only in CORS origins
- β Monitor AWS costs with billing alerts
- β Enable CloudTrail for audit logs
- β Commit
.env.productionto git - β Hardcode secrets in code
- β Share API keys in messages
- β Use root AWS account credentials
- β Make S3 bucket publicly accessible
- β Push Docker images with embedded secrets
- β Use same credentials for dev and production
- β Allow
*in CORS origins (except for development) - β Store secrets in Docker image layers
# Create new access key
aws iam create-access-key --user-name ai-meeting-assistant
# List all access keys
aws iam list-access-keys --user-name ai-meeting-assistant
# Delete old access key
aws iam delete-access-key \
--user-name ai-meeting-assistant \
--access-key-id AKIAIOSFODNN7EXAMPLEnpm run dev # Start development server (port 3000)
npm run build # Build for production
npm start # Start production server
npm run lint # Run ESLint
npm run format # Run Prettier- Next.js Documentation
- OpenAI API Reference
- AWS SDK for JavaScript
- AWS S3 Documentation
- AWS DynamoDB Documentation
- AWS IAM Documentation
Contributions are welcome! Please open an issue or submit a pull request.
If you find this project helpful or use this work directly, please give proper credit and show your support by starring this repository. Your recognition helps motivate continued development and improvement of this project.
This project is under MIT License.