Skip to content
Back to endeavors

Espresto

Perk smarter, not harder

  • SvelteKit
  • Svelte
  • Supabase
  • Tailwind CSS
  • Cloudflare Pages

The idea

My wife was a barista for several years in college. When we’d go to a new coffee shop, I’d tell her what I was in the mood for — something hot, seasonal, half-sweet, oat milk — and she’d know exactly what to order. She did this for friends in college too. We wanted to capture that instinct and turn it into a tool anyone could use.

MVP suggestion engine

Problem: There’s no app that asks you what you’re feeling and just tells you what to order. Coffee menus are overwhelming, especially at a new shop.

Solution: Built a SvelteKit app with a 5-question flow (temperature, caffeine, milk, sweetness, adventurousness) that feeds a scoring algorithm across 108 drink templates. Returns a personalized suggestion with ingredients, ordering instructions, and allergen info.

Outcome: Working prototype with profile persistence via localStorage, a purple gradient theme, and PWA support. Deployed initially to GitHub Pages.

Auth, orders, and favorites

Problem: The app forgot everything between sessions and couldn’t track what you’ve tried before.

Solution: Added Supabase for auth, user profiles, order history, and favorites with Row Level Security. Returning users get a mood-based flow (My Usual, Something Different, Seasonal Special, Surprise Me) instead of the full questionnaire. Added drink sharing via SMS and email with short URLs and OG previews.

Outcome: The app starts learning your preferences — tracks what you order, what you favorite, and adjusts suggestions accordingly. Learning kicks in after 3 interactions.

Merchant marketplace

Problem: The suggestion engine knows drinks but not shops. We wanted local coffee shops to be part of the experience — featuring their actual menus so suggestions match what’s really available.

Solution: Built a merchant system where shops can register, manage team members, curate their drink menu from templates (or create custom variations), and appear in user suggestions. Added a public shop profile page, merchant search by name or city, and a registration landing page.

Outcome: The merchant side is built and functional — shop registration, drink management, team invitations, ingredient validation. Waiting on adoption. It’s a classic marketplace cold-start problem: deciding whether to push the merchant side or the patron side first.

Learning and personalization

Problem: Early suggestions were generic — the algorithm didn’t know you yet.

Solution: Added a learning service that analyzes order history and favorites to build a preference profile. Orders count as 1 interaction, favorites as 0.5. After 3 effective interactions, the engine applies learning bonuses to “My Usual” and “Seasonal Special” moods. Added ingredient-based hard filtering so dairy-free users never see milk-required drinks.

Outcome: The app gets meaningfully better the more you use it. A progress bar shows new users how close they are to personalized recommendations.

Deployment journey

Problem: Finding the right hosting setup took a few tries.

Solution: Started on GitHub Pages (static SPA, routing issues). Moved to Cloudways (SFTP via GitHub Actions, Nginx SPA routing headaches). Switched to Vercel (zero-config SvelteKit deploys). Finally landed on Cloudflare Pages with the custom domain espresto.coffee.

Outcome: Each migration taught me something about deployment trade-offs. Cloudflare Pages is the right fit — fast, free at current scale, and plays well with the rest of the Cloudflare stack.