Inspiration
Picky Eats started from a simple family problem: everyone has different tastes, and after enough restaurant trips it's impossible to remember who liked what. Was it Mia who liked the pad thai, or was that the one Dad hated? We wanted a shared, low-friction way for a family (or any small group) to remember what worked, so future ordering decisions are informed instead of guessed.
What it does
Picky Eats is a full-stack restaurant ordering and rating app for families. Whoever sets up the group adds each family member by name, and every meal can be logged, rated, and annotated per person — so preferences build up over time instead of living in someone's memory. Key features:
- Restaurant discovery — browse and search nearby restaurants
- AI menu import — photograph a physical menu and have AI vision extract items, prices, and categories automatically
- Per-person ratings — rate dishes, add notes, and mark favorites independently for each family member
- Order history & stats — see what a person has ordered and liked at a given restaurant before you order again
- Circles — invite family members to share the same data via an invite link, with creator/member roles
- Subscriptions, powered by RevenueCat — a clean native paywall on iOS/Android with trial support, so the app can sustain itself long-term without us having to hand-roll subscription infrastructure
How we built it
- Frontend: Ionic 8 + Angular 22 (standalone components, signal-based state, zoneless change detection)
- Backend: Cloudflare Workers + Hono, organized by domain (restaurants, menu-items, orders, circles, email)
- Database: Cloudflare D1 (SQLite), migration-based schema
- AI integration: Gemini for AI menu extraction
- Billing: RevenueCat for iOS/Android in-app subscriptions — their SDK and webhooks handled the hard parts of receipt validation and entitlement state, letting us focus on the product instead of reimplementing App Store/Play Store billing plumbing. We paired it with RevenueCat's Web Billing (backed by our own Stripe account) so desktop users aren't locked into mobile-only purchasing. A single subscription entitlement covers web, iOS, and Android, so subscribers get access everywhere regardless of which surface they purchased on.
- Deployment: Cloudflare Pages (frontend) + Cloudflare Workers (backend), deployed via GitHub
Actions on every push to
main
Challenges we ran into
- Keeping subscription state in sync everywhere. A subscriber might purchase on their phone and then open the app on the web, so entitlement state needs to be consistent no matter which surface they check from. Leaning on RevenueCat's webhooks as the source of truth made this far more tractable than it would have been otherwise.
- Switching restaurant-discovery providers mid-project. We migrated our default discovery provider partway through, which meant generalizing the discovery layer and normalizing provider-specific data quirks without breaking existing restaurant data.
- Trusting AI menu extraction without trusting it blindly. Extracted menu items need to be diffed against existing data and reviewed by a human before saving, so a bad AI read doesn't silently corrupt a restaurant's menu.
Accomplishments that we're proud of
- Shipped a real, production app at pickyeats.app with actual paying subscribers, not just a demo
- Integrated RevenueCat end-to-end — paywall, purchase flow, trial handling, and entitlement syncing — and it just works, letting us spend our time on the family/ordering experience instead of billing edge cases
- Got AI menu import working end-to-end, from photo capture to reviewed, deduplicated, saved menu items
- Designed a circle/sharing model that lets a family share data without needing everyone to log in as the same account
- Maintained a genuinely edge-first architecture — Cloudflare Workers + D1 — keeping response times fast globally
What we learned
- Letting RevenueCat own subscription/entitlement state instead of building it ourselves was one of the best early decisions we made — it turned what could've been months of billing edge cases into a much smaller integration surface
- AI vision extraction is good enough to save real time on data entry, but only when paired with a review/diff step — treating AI output as a draft, not a final answer, is what makes it trustworthy
- Zoneless Angular forces better state discipline (signals everywhere) — annoying at first, but it eliminates a whole class of "why didn't this update" bugs once you're used to it
- Edge deployment (Workers + D1) is a great fit for a small, latency-sensitive app
What's next for Picky Eats
- Upgrade to Ionic 9 — adopt the newly released version
- Multi-photo menu import — submit several photos for one menu-import session
- Multiple circles per user (future version) — e.g. a family circle and a friends circle, instead of one circle per user
Log in or sign up for Devpost to join the conversation.