A beautiful, interactive pourover coffee timer built with TypeScript, Node.js, and Tailwind CSS. Cloud-native, containerized, and ready to scale from 1 to 1 million users on Kubernetes.
- Visual Timer: Animated SVG graphic showing the pourover stages
- Stage Tracking: 4-stage pourover process with customizable timings
- Audio Notifications: Beep sound alerts when it's time for the next pour
- Instructions: Clear on-screen instructions for each pour (amount in grams)
- Custom Recipes: Create and save your own pour schedules with custom timings and weights
- Recipe Library: Save multiple recipes and quickly switch between them
- Detailed Brew Logging: Track beans, origin, roast level, MASL, and tasting notes
- Analytics Dashboard: View statistics, trends, and insights from your brewing history
- Advanced Filtering: Filter brews by origin, roast level, and rating
- Brew Management: Delete saved brews with confirmation
- Performance Insights: Get recommendations based on your brewing data
- Containerized: Docker multi-stage builds for production optimization
- Kubernetes Ready: Full K8s manifests with auto-scaling (2-1000 pods)
- Auto-Scaling: Horizontal Pod Autoscaler based on CPU/Memory metrics
- Multi-Cloud: Deploy to GCP (GKE), AWS (EKS), or Azure (AKS)
- CI/CD Pipeline: GitHub Actions for automated build and deployment
- Health Checks: Liveness and readiness probes
- Persistent Storage: Shared data volume across pods
- Production Ready: Security hardened, non-root containers
- Bloom (45s): Pour 50 grams of water
- First Pour (45s): Pour 100 grams of water
- Second Pour (45s): Pour 100 grams of water
- Final Pour (45s): Pour 100 grams of water
Total brew time: 3 minutes Total water: 350 grams
# Install dependencies
npm install
# Build TypeScript
npm run build
# Start the server
npm startOpen your browser to: http://localhost:3000
# Using Docker Compose
docker-compose up
# Or build and run manually
docker build -t pourover-timer .
docker run -p 3000:3000 pourover-timerChoose your cloud provider:
Google Cloud Platform (GKE) - Recommended:
./deploy-gcp.shAmazon Web Services (EKS):
./deploy-aws.shUsing Makefile:
make help # Show all available commands
make docker-build # Build Docker image
make deploy-gcp # Deploy to Google Cloud
make k8s-status # Check deployment status📖 Full deployment guide: See DEPLOYMENT.md
🏗️ Architecture details: See ARCHITECTURE.md
- Click Start to begin the timer with the default recipe
- Follow the on-screen instructions for each pour
- Listen for the beep sound when it's time for the next pour
- Watch the animated visual indicator show your progress
- When complete, enter your coffee beans, origin, roast level, and notes
- Click the 📊 Analytics tab to view statistics and insights
- Click ⚙️ Customize Recipe to open the recipe editor
- Adjust the time (seconds) and water amount (grams) for each stage
- Give your recipe a name
- Click 💾 Save Recipe to save it for later use
- Click ✓ Apply to use your custom recipe
- Select saved recipes from the dropdown to load them
- View total brews, average ratings, and favorite origins
- Filter brews by origin, roast level, or rating
- See detailed brew logs with recipes used
- Get personalized brewing recommendations
coffee/
├── src/
│ └── server.ts # Express server with API endpoints
├── public/
│ ├── index.html # Main UI with tabs (Timer/Analytics)
│ └── timer.js # Timer logic, analytics, animations
├── data/
│ ├── brews.json # Brew history (auto-created)
│ └── recipes.json # Saved recipes (auto-created)
├── k8s/ # Kubernetes manifests
│ ├── namespace.yaml # K8s namespace
│ ├── deployment.yaml # Pod deployment with auto-scaling
│ ├── service.yaml # LoadBalancer service
│ ├── hpa.yaml # Horizontal Pod Autoscaler (2-1000 pods)
│ ├── persistent-volume.yaml # Shared data storage
│ └── configmap.yaml # Environment configuration
├── terraform/ # Infrastructure as Code
│ ├── gcp-gke.tf # Google Cloud GKE cluster
│ ├── aws-eks.tf # AWS EKS cluster
│ └── variables.tf # Terraform variables
├── .github/workflows/ # CI/CD pipeline
│ └── deploy.yml # GitHub Actions deployment
├── Dockerfile # Multi-stage container build
├── docker-compose.yml # Local container orchestration
├── Makefile # Deployment automation
├── package.json
└── tsconfig.json
- Backend: Node.js 18, Express, TypeScript
- Frontend: HTML5, Tailwind CSS, Vanilla JavaScript
- Storage: JSON file-based with persistent volumes
- Audio: Web Audio API
- Container: Docker multi-stage builds
- Orchestration: Kubernetes
- Cloud: GCP (GKE), AWS (EKS), Azure (AKS)
- CI/CD: GitHub Actions
- IaC: Terraform
GET /api/brews- Get all saved brewsPOST /api/brews- Save a new brew- Body:
{ beans: string, rating: number }
- Body:
DELETE /api/brews/:id- Delete a brew by ID
GET /api/recipes- Get all saved recipesPOST /api/recipes- Save a new recipe- Body:
{ name: string, stages: Array<{name: string, duration: number, waterAmount: number}> }
- Body:
Enjoy your perfect pourover! ☕