┌─────────────────────────────────────────────────────────────────┐
│ FRONTEND (AWS) │
│ GitHub → AWS Amplify → React + TypeScript (Vite) │
│ grouple.pro via Route 53 + CloudFront CDN │
└─────────────────────────┬───────────────────────────────────────┘
│ API requests + JWT
▼
┌─────────────────────────────────────────────────────────────────┐
│ BACKEND API (AWS) │
│ Route 53 (api.grouple.pro) │
│ → ALB (SSL Termination + ACM Certificate) │
│ → ECS Cluster (grouple-api-cluster) │
│ └── Auto Scaling Group (EC2 instances) │
│ └── ECS Tasks (API Containers via Docker/ECR) │
│ AWS Secrets Manager → injects credentials │
│ CloudWatch Logs + X-Ray → observability │
└─────────────────────────┬───────────────────────────────────────┘
│ trigger task
▼
┌─────────────────────────────────────────────────────────────────┐
│ AI WORKERS (Single EC2 Instance, PM2) │
│ ├── AI Proposal Worker (Node.js) │
│ │ └── Amazon Bedrock Claude 4.6 → generates proposals │
│ └── PDF Extract Worker (Node.js) │
│ └── Amazon Bedrock Claude 4.6 → extracts menu/PDF data │
│ Both workers save results → Supabase PostgreSQL │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ SUPABASE (Core Backend Logic) │
│ ├── PostgreSQL (primary database, 20+ tables) │
│ ├── Auth (GoTrue / JWT) │
│ ├── Email (via Edge Functions) │
│ ├── 14 Database Triggers (automated business logic) │
│ ├── 40+ RPC Functions (complex queries + operations) │
│ ├── 6 Edge Functions (serverless compute) │
│ └── Storage (venue-images, Logos, venue-brochures) │
└─────────────────────────────────────────────────────────────────┘