Inspiration

I kept saving restaurants everywhere except in one place: Apple Notes, starred pins in Maps, Instagram saves, screenshots, WhatsApp messages from friends. Then someone would ask "what was that ramen place you liked?" and I had nothing. Review platforms didn't solve it — I don't want to write public reviews, follow anyone, or be told where everybody else eats. I wanted a private journal, but for restaurants, built for people who treat dining as a hobby.

So I built it. FavRes is the first app shipped by ARC Labs Studio, the indie studio I run solo from Spain.

What it does

FavRes is a private restaurant journal. You log the places you visit (date, rating, photos, notes, price range, any of 41 cuisines), keep a pending list of places you want to try, mark favorites, and see everything on a map. Stats show your visit counts, top cuisines and favorite city. No public reviews, no social feed, no pressure.

The feature I care most about is AI import, because it kills the cold-start problem: paste any text — your Notes list, a chat, even a 26,000-character blog dump — and FavRes extracts the restaurants, geocodes them, and files each one as visited or pending. Your journal is useful on day one instead of starting from an empty list.

Premium (via RevenueCat) unlocks Year in Food (annual analytics with spend tracking and streaks), AI recommendations built on your own taste profile, CSV/JSON export, and iCloud sync. Free stays genuinely useful: metered AI recommendations and a one-time import, so you can try everything before paying.

Privacy is the default: your journal lives on-device, iCloud sync is opt-in, and AI requests send only what's needed and are never used for training.

How I built it

  • 100% Swift and SwiftUI, iOS 18+, iPhone and iPad, English and Spanish from day one.
  • Clean Architecture (MVVM-C) with SwiftData for persistence and CloudKit for opt-in sync. Swift 6 strict concurrency across the whole app.
  • A set of my own Swift packages for the design system, navigation, logging and purchases, shared across future studio apps.
  • AI features run through a Firebase Cloud Functions proxy with a provider fallback chain (Gemini → OpenAI), protected with App Check / App Attest. The app never talks to a model provider directly and never hard-depends on a single one.
  • RevenueCat powers the whole monetization stack: monthly and yearly subscriptions (14-day trial) plus a lifetime option, the paywall, Customer Center, and promo entitlements for beta testers.
  • 1,500+ Swift Testing tests, Xcode Cloud for TestFlight betas.
  • Most of the code was written with an agentic workflow (Claude Code with custom skills and review agents), with hard gates: tests first, zero-warning builds, accessibility audits before a screen is "done".

Challenges I ran into

  • Making AI import robust. Multi-provider fallback, malformed model output, and one memorable bug where the OpenAI leg was silently broken for weeks because of array-root JSON schemas.
  • Swift 6 strict concurrency everywhere, including a custom tab navigation system. Painful, worth it.
  • Drawing the free/premium line. Free had to be a real product, not a demo, while keeping Premium an obvious upgrade. Metering (limited AI recommendations, one-shot import) ended up being the answer.

Accomplishments that I'm proud of

  • Shipped a complete v1 solo: journal, map, stats, AI import, AI recommendations, onboarding, paywall, localization, iPad layouts and accessibility (VoiceOver, Dynamic Type up to AX5).
  • 1,500+ tests green on every build.
  • A real monetization setup from day one instead of "I'll add payments later".

What I learned

  • Paywalls and free-tier limits are product design. I iterated on them as much as on any screen.
  • Agentic coding works — but only with external verification gates. The model's opinion of its own code is not a green build.

What's next for FavRes

  • Keep refining the AI recommender — better use of the taste profile it builds from your journal.
  • City autocomplete and shareable visit cards, the two top asks from beta feedback.
  • A seasonal Year in Food push in December — that feature was made for end-of-year.

Built With

Share this project:

Updates

Submission history