AI Scheduling Agent
- Install dependencies:
cd server
pip install -r requirements.txt- Configure environment variables in
server/.env:
SUPABASE_URL=your_supabase_url
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
WHOOP_CLIENT_ID=your_whoop_client_id
WHOOP_CLIENT_SECRET=your_whoop_client_secret
WHOOP_API_HOSTNAME=https://api.prod.whoop.com
WHOOP_CALLBACK_URL=http://localhost:8000/auth/whoop/callback
LINEAR_CLIENT_ID=your_linear_client_id
LINEAR_CLIENT_SECRET=your_linear_client_secret
LINEAR_CALLBACK_URL=http://localhost:8000/auth/linear/callback
TEST_USER_ID=your_test_user_uuid
-
Register callback URLs in integration developer dashboards:
WHOOP:
- Go to https://developer-dashboard.whoop.com
- Add
http://localhost:8000/auth/whoop/callbackas a redirect URI
Linear:
- Go to https://linear.app/settings/api
- Create new OAuth2 application
- Add
http://localhost:8000/auth/linear/callbackas callback URL - Set scopes:
read,write,issues:create
cd server
uvicorn app:app --reloadApplication runs at http://localhost:8000
- Visit http://localhost:8000
- Click "Connect WHOOP" to authorize integration
- After authorization, view your recovery and activity data
- Use the data to optimize your schedule
GET /- Frontend applicationGET /api- API informationGET /health- Health check
GET /auth/whoop/start- Start WHOOP OAuth flowGET /auth/whoop/callback- WHOOP OAuth callback handlerGET /whoop/cycles?days=7- Fetch WHOOP cycle data
GET /auth/linear/start- Start Linear OAuth flowGET /auth/linear/callback- Linear OAuth callback handlerGET /linear/teams- Fetch Linear teamsGET /linear/issues?team_id=&state=&assignee=- Fetch Linear issues with filtersGET /linear/projects- Fetch Linear projectsPOST /linear/issues- Create a new Linear issue
- Visit http://localhost:8000/auth/whoop/start
- Authorize the application
- Access WHOOP data via
/whoop/cycles
- Visit http://localhost:8000/auth/linear/start
- Authorize the application
- Access Linear data via
/linear/teams,/linear/issues,/linear/projects - Create issues programmatically via
POST /linear/issues
For detailed integration documentation, see:
- WHOOP:
server/integrations/feature_specs/whoop_integration.md(if exists) - Linear:
server/integrations/feature_specs/linear_integration.md
This application is configured for deployment to AWS App Runner with the custom domain ultra-calendar.com.
The deployment uses a single App Runner service that:
- Serves the React frontend as static files
- Hosts the FastAPI backend API
- Automatically scales based on traffic
- Provides HTTPS via AWS-managed certificates
- AWS Account (Trayne AWS account)
- AWS CLI configured with appropriate credentials
- Docker installed locally (for testing)
- Domain
ultra-calendar.comhosted in Route 53 or accessible DNS
# Build the Docker image
docker build -t ultra-calendar .
# Test the container locally
docker run -p 8000:8000 \
-e SUPABASE_URL=your_supabase_url \
-e SUPABASE_SERVICE_ROLE_KEY=your_key \
-e WHOOP_CLIENT_ID=your_whoop_id \
-e WHOOP_CLIENT_SECRET=your_whoop_secret \
-e WHOOP_API_HOSTNAME=https://api.prod.whoop.com \
-e WHOOP_CALLBACK_URL=https://ultra-calendar.com/auth/whoop/callback \
-e LINEAR_CLIENT_ID=your_linear_id \
-e LINEAR_CLIENT_SECRET=your_linear_secret \
-e LINEAR_CALLBACK_URL=https://ultra-calendar.com/auth/linear/callback \
-e TEST_USER_ID=your_test_user_uuid \
-e ENVIRONMENT=production \
ultra-calendar
# Visit http://localhost:8000# Authenticate Docker to ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com
# Create ECR repository
aws ecr create-repository --repository-name ultra-calendar --region us-east-1
# Tag the image
docker tag ultra-calendar:latest <your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/ultra-calendar:latest
# Push to ECR
docker push <your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/ultra-calendar:latestUsing AWS Console:
- Navigate to AWS App Runner in the AWS Console
- Click "Create service"
- Source:
- Repository type: Container registry
- Provider: Amazon ECR
- Container image URI:
<your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/ultra-calendar:latest - Deployment trigger: Manual or Automatic
- Service settings:
- Service name:
ultra-calendar - Port:
8000 - CPU: 1 vCPU
- Memory: 2 GB
- Service name:
- Environment variables (add all required variables):
ENVIRONMENT=production SUPABASE_URL=<your-supabase-url> SUPABASE_SERVICE_ROLE_KEY=<your-key> WHOOP_CLIENT_ID=<your-whoop-id> WHOOP_CLIENT_SECRET=<your-whoop-secret> WHOOP_API_HOSTNAME=https://api.prod.whoop.com WHOOP_CALLBACK_URL=https://ultra-calendar.com/auth/whoop/callback LINEAR_CLIENT_ID=<your-linear-id> LINEAR_CLIENT_SECRET=<your-linear-secret> LINEAR_CALLBACK_URL=https://ultra-calendar.com/auth/linear/callback TEST_USER_ID=<your-test-user-uuid> - Health check:
- Path:
/health - Interval: 30 seconds
- Timeout: 5 seconds
- Path:
- Click "Create & deploy"
Using AWS CLI:
aws apprunner create-service \
--service-name ultra-calendar \
--source-configuration file://apprunner-source-config.json \
--instance-configuration file://apprunner-instance-config.json \
--region us-east-1- In App Runner console, select your service
- Go to "Custom domains" tab
- Click "Link domain"
- Enter
ultra-calendar.com - Follow instructions to add CNAME records to your DNS:
CNAME: ultra-calendar.com -> <your-apprunner-domain>.awsapprunner.com - Optionally add
www.ultra-calendar.comas well - Wait for domain validation (5-10 minutes)
After domain is configured, update your OAuth applications:
WHOOP:
- Go to https://developer-dashboard.whoop.com
- Update redirect URI to:
https://ultra-calendar.com/auth/whoop/callback
Linear:
- Go to https://linear.app/settings/api
- Update callback URL to:
https://ultra-calendar.com/auth/linear/callback
To deploy updates:
# Build new image
docker build -t ultra-calendar .
# Tag and push to ECR
docker tag ultra-calendar:latest <your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/ultra-calendar:latest
docker push <your-aws-account-id>.dkr.ecr.us-east-1.amazonaws.com/ultra-calendar:latest
# Trigger new deployment in App Runner
aws apprunner start-deployment --service-arn <your-service-arn>- App Runner Dashboard: View metrics, logs, and deployment history
- CloudWatch Logs: All application logs are automatically sent to CloudWatch
- Health Check: Monitor
/healthendpoint status
AWS App Runner pricing (us-east-1):
- Provisioned container: ~$0.007/hour for 1 vCPU + 2 GB memory
- Active container: ~$0.064/hour for 1 vCPU + 2 GB memory
- Data transfer: Standard AWS rates
Estimated monthly cost: $50-100 for low to moderate traffic.
Container fails to start:
- Check CloudWatch logs for errors
- Verify all environment variables are set correctly
- Ensure ECR image is accessible
Domain not working:
- Verify CNAME records are correctly configured
- Wait for DNS propagation (up to 48 hours)
- Check App Runner domain status
OAuth redirects failing:
- Ensure callback URLs are updated in OAuth provider dashboards
- Verify CORS settings include production domain
- Check ENVIRONMENT variable is set to "production"