PantryPlanner
I built a serverless web app that takes user preferences like meal
goals, budget, and available ingredients, then generates a
personalized meal plan with recipes and an organized grocery list.
The application uses AI generation behind the scenes and ships
through an automated CI/CD pipeline with secure deployment
controls.
Stack
AWS Lambda · S3 · CloudFront · API Gateway · GitHub Actions
CI/CD · Claude AI
Inputs
Meal preferences, budget targets, and on-hand ingredients
Output
Personalized meal plan + recipe suggestions + organized grocery
list
Key engineering decisions
-
Fully serverless — zero infrastructure to manage, scales to zero
cost when idle
-
Structured prompt engineering to produce consistent, parseable
AI output
-
GitHub Actions pipeline with environment-gated secrets for
secure deployments
-
End-to-end product ownership: UX design, AI integration, and
deployment
Sports Odds Data Pipeline
I built an end-to-end, serverless AWS pipeline that ingests
sportsbook odds, normalizes and validates records, stores both raw
+ curated datasets, and serves low-latency API responses for a
live UI. The site auto-deploys via GitHub Actions to
S3/CloudFront, and the data API is backed by API Gateway + Lambda
+ DynamoDB.
Stack
AWS (S3, CloudFront, API Gateway, Lambda, DynamoDB, EventBridge,
Glue) · Python · Terraform · GitHub Actions
Pipeline
Odds API → EventBridge schedule → Lambda ingest → S3 raw zone →
Glue normalize → DynamoDB → API Gateway → live UI
Deploy
Git push → GitHub Actions → S3 sync → CloudFront cache
invalidation (fully automated)
Key engineering decisions
-
DynamoDB key design (
sport_date +
game_id) optimized for single-query reads by date
and sport
-
Separated raw and curated S3 zones for reprocessability without
data loss
-
IAM least-privilege roles scoped per Lambda function — no shared
credentials
-
CORS and CloudFront caching tuned to balance freshness with API
cost
Architecture Diagram: High-Level
→
EB
EventBridge
schedule trigger
→
L
Lambda
ingest / validate
→
CF
CloudFront + S3
projects.html table
→
→
L
Lambda
calculate today's games + odds
→
DDB
DynamoDB
sport_date + game_id
Live Demo: Today's Games & Moneyline Odds
This table is generated dynamically from my API (API Gateway +
Lambda) querying DynamoDB for today's slate.
All times are in your local timezone. If no games appear, try a
different sport — data depends on the active season.
Loading live demo data...
Last updated: --