Inspiration

It started when I saw Eitan Bernath's pitch to the RevenueCat Shipyard Creator Contest. He pitched the idea of an app that turns cooking videos into actual recipes – and the moment I saw it, something clicked. My girlfriend Amelie had been asking me for exactly this: an app that takes the cooking videos she saves on TikTok and Instagram and turns them into real, structured recipes she can actually cook from.

So I decided to build it. Not just as a side project, but as something personal – built with Amelie’s feedback from day one. She tested every version, told me what worked and what didn’t, and shaped the app into what it is today. I named it after her. And the mascot – a friendly strawberry chef 🍓 – is a playful nod to the person who inspired the whole thing.

But the problem goes beyond one person. We all do it – save cooking videos, bookmark web recipes, or flip through physical cookbooks promising ourselves we’ll make that dish someday. When the time comes, recipes are scattered everywhere: buried in social media saves, lost in browser tabs, or stuck on a bookshelf. Recipe Keeper - Amelie was born out of that exact frustration: the gap between discovering a recipe and actually cooking it.

What it does

Amelie bridges that gap. Users share a cooking video from TikTok, Instagram Reels, or YouTube Shorts via the system share sheet, paste a web recipe URL, or scan a page from a physical cookbook – and Amelie extracts a clean, structured recipe in seconds, complete with title, ingredients (with measurements), and step-by-step instructions.

From there, users organize recipes into custom cookbooks, plan meals for the week, and build grocery lists from their saved recipes – so they actually cook what they save. No more pausing, rewinding, or scrolling through bookmarks.

How I built it

I built Amelie entirely solo, leveraging AI heavily – especially Claude Code – to move fast, iterate quickly, and ship a polished product in weeks instead of months. AI wasn't just a tool I used on the side; it was core to my development workflow, from scaffolding features to debugging complex scraping logic to writing tests.

  • Frontend: React Native (0.81) with Expo SDK 54, Expo Router v6, TypeScript, and Zustand for state management. The share extension uses expo-share-intent to let users import recipes directly from other apps. The import flow is progressive: client-side metadata extraction shows a partial recipe instantly, then the AI-refined version replaces it seamlessly.
  • Backend: Python/FastAPI on a Hetzner VPS with SQLite (via SQLAlchemy) as the database. The backend handles Firebase Auth token verification, AI-powered recipe extraction via Google Gemini, video metadata extraction via yt-dlp, and rate limiting via slowapi. Database models include Users, Recipes, Cookbooks, MealPlans, and GroceryItems – all with cascade deletion and proper user data isolation.
  • Auth: Firebase Auth with Apple Sign-In, Google Sign-In, Email/Password, and Anonymous Guest Mode. Guest accounts are fully upgradeable without data loss.
  • Monetization: RevenueCat manages weekly and annual subscriptions. Free users get 5 AI-powered imports, then hit a paywall. Premium status is synced between the app and backend. The onboarding includes a multi-stage paywall flow (trial → reminder → recovery offer) to maximize conversion.
  • Security: SSRF protection, request size limiting, security headers, CORS restrictions, and all API docs disabled in production.

Challenges I ran into

  • Web scraping across platforms: The biggest challenge was reliably extracting recipe data from wildly different sources – TikTok video metadata, web recipe pages, and scanned cookbook photos each have completely different structures. Everything worked perfectly in development, but in production my backend IP got blocked by several platforms. Finding the right scraping strategies and fallbacks for each source type took serious iteration.
  • Speed and user experience: Users expect a recipe in seconds, not minutes. Optimizing the full pipeline – from receiving a shared link to returning a structured recipe – so it feels instant was critical. If extraction takes too long, people abandon the app. Every millisecond in the pipeline mattered.
  • Balancing simplicity with features: The core promise is "share → recipe in seconds." Adding meal planning and grocery lists had to feel natural, not bloated. Every feature decision had to pass the test: does this make cooking easier, or does it add complexity?

What I learned

  • Web scraping is a rabbit hole: I learned a ton about scraping strategies, proxy rotation, rate limiting, and how different platforms fight automated access. The gap between "works in dev" and "works in production at scale" is massive.
  • RevenueCat + MCP Server = easy setup: RevenueCat makes subscription management surprisingly painless. With the MCP server I could create products, entitlements, and offerings, verify the entire setup is correct, and make sure everything is wired up properly – all without manually clicking through dashboards.
  • AI-generated mascots work: I created Amelie (our friendly strawberry chef 🍓) entirely with Google Gemini. Learning how to prompt for consistent character design across different sizes, poses, and contexts was a skill in itself – and the result gives the app personality that pure utility can’t achieve.

What's next for Recipe Keeper - Amelie

  • Portion scaling and unit conversion (metric/imperial)
  • More languages beyond English and German
  • Android release (currently iOS-first)

Built With

Share this project:

Updates