Projects
A few personal apps I build in my spare time to keep learning. They’re separate from my day-to-day work — just small, friendly tools for friends and family to try out.
Each one includes what it’s for, how you can use it, and what I practiced building it.
Rankings Hub
Purpose: Keep track of personal favorites — parks, hikes, performances — and compare with friends.
How to use: Pick a category, add an item, rate it. Toggle between your ratings and everyone’s.
Built to practice: Firestore modeling, batching, personal vs group views.
PPEET Ratings
Purpose: Quick group check-in on risk and morale before an outdoor activity.
How to use: Create an event, invite friends to rate P-P-E-E-T 0–10. When enough votes are in, it auto-reveals and highlights where to talk.
Built to practice: status machines, auto-reveal, longitudinal charts.
Ivanhoe Family Tree
Purpose: Explore family connections in a gentle, visual way.
How to use: Open the tree, click a person to see their story. Sign-in keeps it private to family.
Built to practice: static assets, gated routes.
Travel Awards
Purpose: Make family trips memorable with light, daily awards.
How to use: Create a trip, add award types, each day nominate friends and vote for MVP / Jerry. Watch the cumulative leaderboard.
Built to practice: multi-stage status (NOMINATION→VOTING→RESULTS), points.
Road Trip Guessing
Purpose: Make long drives more fun with friendly guessing.
How to use: Enter your daily distance and petrol guess vs actuals. Check who was closest and the trip totals.
Built to practice: date parsing, cumulative totals, chart aggregation.
Predictions
Purpose: Friendly predictions before deadlines.
How to use: Create a category, invite friends to lock guesses, then set actuals and see who was closest.
Built to practice: upsert patterns, admin outcomes, scoring.
Preferential Voting
Purpose: Fairly pick a winner from ranked choices.
How to use: Add options, drag to rank, submit your ballot. The app tallies with Borda Count.
Built to practice: ranked-choice logic, deterministic ballot IDs.
Group Alignment
Purpose: Turn messy group opinions into clear options.
How to use: Pose a question, have everyone share their view, then close to generate friendly, cited recommendations with Gemini.
Built to practice: LLM prompting with Search grounding, opinion-to-prompt.