👋 We're Hugo and Vincent — two developers from France, bons vivants, and passionate home cooks. We've been building things together since college in Toulouse, and food has always been central to how we spend time together.

We checked our saved videos. Hundreds of recipes across social media. Recipes we genuinely wanted to cook. How many did we actually make? Maybe ten.

It's not a motivation problem — it's a logistics problem. The video might not give you a clean ingredient list. There might not be a grocery list. You'd have to rewatch the whole thing at the supermarket, pausing every three seconds, squinting at quantities. So the recipe stays saved, and dinner stays boring.

As Eitan puts it: "People are inundated with recipes. Getting from something you see and want to make to actually having it in your kitchen can be a challenge." That's exactly the problem we set out to solve. We are his target audience — and Marmalade is the tool we wish we'd had all along.

What it does

Marmalade turns any recipe — from social media, a food blog, or even a photo of a cookbook page — into a structured recipe card and a ready-made grocery list. In as few taps as possible.

Paste a link, and AI does the rest: extracts every ingredient with proper quantities, writes out clear steps, detects prep and cook time, and organizes everything into a grocery list by category. Recipes in other languages are automatically translated. And if someone has already imported the same recipe, it loads instantly from cache.

From there, add recipes to your meal plan to organize your week — so you know what you're cooking and when. Head to the store with your grocery list, and actually cook it. That's the whole point — saved recipes that make it to the table.

How we built it

We built Marmalade in two weeks as a team of two, using AI-assisted development throughout. We're not shy about it — Claude Code and AI tooling let us move at a speed that would have been impossible otherwise.

Mobile app: Vincent built the entire app in Kotlin Multiplatform with Compose Multiplatform, and created the design system and UX. KMP delivers a truly native experience on Android and shared business logic across both platforms — with the flexibility to introduce native SwiftUI screens on iOS in the future without rewriting anything.

Backend: Hugo built the backend as a Bun/TypeScript service on Railway, orchestrated by Inngest. When a user pastes a link, a multi-stage pipeline kicks off: detect the platform, scrape the content, classify whether it's actually a recipe, extract it with AI, standardize ingredients, translate if needed, and deliver the result — all with real-time status updates via Supabase Realtime.

AI extraction: We use the OpenAI Agents SDK with structured tool use. The AI doesn't just transcribe — for every ingredient, it calls a search tool against our canonical ingredient database (seeded from Open Food Facts) to resolve vague quantities into proper entries with units and grocery categories. This is what makes the grocery list actually useful, not just a list of words.

Monetization: RevenueCat handles the entire subscription lifecycle — from the in-app paywall to webhook-synced entitlements that gate imports on the backend before any processing starts.

Challenges we ran into

Recipe extraction is harder than it sounds. A TikTok video isn't a recipe — it's a person talking fast over music, sometimes with captions, sometimes without. "A bit of this, a splash of that" doesn't translate into a grocery list. We built a two-stage pipeline: a lightweight classifier that filters out non-recipes (restaurant reviews, product hauls, cooking tips without a specific dish), followed by a full extraction agent with real-time ingredient lookup. Getting the accuracy to the point where the grocery list is genuinely trustworthy took most of our iteration time.

Multi-platform scraping is a moving target. TikTok, Instagram, and YouTube each have their own quirks — different caption formats, different subtitle availability, different rate limits. We ended up building platform-specific fallback chains (subtitles first, Whisper transcription as backup) to handle the variety reliably.

Choosing KMP over the easy path. We chose Kotlin Multiplatform over React Native or Flutter because we didn't want to be locked into a single framework. KMP gives us direct access to platform-native APIs, the ability to craft a tailored experience on each platform, and the option to swap in native SwiftUI on iOS whenever we're ready — all while sharing business logic. But the ecosystem is younger, and some integrations that are one-liners elsewhere required more manual wiring — particularly around platform-specific file handling and storage. It's a bigger upfront investment, but it gives us full control over how the app evolves. No regrets.

Accomplishments that we're proud of

  • The grocery list actually works. Not "here are some words from the video" — a real, categorized, quantity-accurate grocery list you can take to the store. This is the core promise, and it delivers.
  • It works in any language. A Japanese recipe on TikTok becomes a fully usable English recipe with proper ingredients and steps. The translation preserves structure, ingredient counts, and step-ingredient linkage — it's not just a text translation, it's a real recipe.
  • Two people, two weeks, two platforms. KMP + AI-assisted development let us ship a real, working product on both Android and iOS with a full backend pipeline. Not a prototype — a product you can use today.
  • We built the app we actually wanted. This isn't a hackathon project we'll abandon. We've been using Marmalade ourselves to cook recipes we'd been saving for months. That's the best validation we could ask for.

What we learned

Think like a founder, not an engineer. Early on, we kept reaching for technically interesting solutions — better extraction models, smarter caching, more elegant architectures. The turning point was asking: "does this help someone cook dinner tonight?" If the answer was no, we cut it. The best features in Marmalade are the simplest ones.

The freemium unit matters more than the price. We spent more time deciding what to gate (recipe imports) than how much to charge. Each import delivers immediate, tangible value — a recipe and a grocery list. That's what makes the free-to-paid transition feel natural instead of punishing.

AI-assisted development changes what two people can ship. We built a cross-platform mobile app, a multi-stage AI backend, and a full subscription system in two weeks — not full-time either. Not because we're superhuman, but because we leaned hard into AI tooling for code generation, debugging, and iteration. The skill isn't writing every line yourself anymore. It's knowing what to build and how to steer.

What's next for Marmalade

  • Combined grocery lists — select multiple recipes for the week, get one merged shopping list
  • AI recipe editing — adjust servings, swap ingredients for dietary needs, simplify steps
  • Cooking mode — step-by-step guidance with built-in timers
  • Recipe sharing — deep links and share cards so users can send recipes to friends
  • Native SwiftUI screens — leverage our KMP architecture to craft a fully native iOS experience while keeping shared business logic

Built With

  • bun
  • compose
  • hono
  • inngest
  • kmp
  • kotlin
  • openai
  • railway
  • revenuecat
  • supabase
  • typescript
Share this project:

Updates