Inspiration
Eitan's brief hit home because it's my life. My partner and I are constantly sending each other Instagram posts, saying "we should make this"... and then we don't. The recipes end up buried in screenshots and unorganized lists. When we finally sit down to plan the week, we don't remember what we saw, and it ends up being a mental load to actually come up with a meal plan. Eitan got it exactly right: the gap isn't finding recipes. It's getting from "I saw this" to dinner on the table.
That gap is what Cloche solves.
What Is Cloche?
Cloche is named after that bell-shaped dome used to reveal a dish. The app loops through three phases: Discover, Plan, Cook.
You start at the home screen with a recipe swiper. It works like Tinder: swipe right to save, left to skip. The whole thing is fast and fun because it doesn't feel like scrolling through a database.
But the real feature kicks in when you're not cooking alone. When your partner also swipes through recipes, the app finds consensus matches—recipes you both saved. Those show up at the top of your meal planner, ready to drag onto the calendar. No negotiation needed. No "what should we make?" conversation. The app already knows what you both want. I haven't seen another meal-planning app do this.
The meal planner is a calendar with a drag & drop interface. Recent "right swipes" and longstanding favorites are accessible through the ideas drawer. Once you add a recipe to plan, the app folds its ingredients into your shopping list. The shopping list is a lowkey killer feature—whether you add items from a recipe or type them in manually, it automatically sorts them to the right section of the grocery store. No more running back across the store to grab that sneaky vegetable you missed at the bottom of your list. When you cook, you get an easily readable, step-by-step view with timers that float on screen. You can scale recipes up or down. And after cooking, you rate the dish and jot notes so you remember what worked.
What I Learned
I also made the mistake of starting this project with a Firebase backend, when it wasn't a great fit for what I needed out of a service. Firebase doesn't let you set billing caps, which is a hard-no for an indie developer like me. So that ended up requiring a deep dive on different managed cloud providers, and ultimately led me to a migration to Supabase—which required a ground up rewrite of my entire backend schema.
The last big lesson learned was less technical, and more legal and strategic. I started with the idea of scraping websites and cookbooks and rewriting the recipes with the help of an LLM. This sits in a legal gray area, and I ultimately decided against it. I would rather partner with recipe creators who want to be part of the platform, and explicitly opt in. This also creates an great opportunity to share revenue with them. The goal is to build out a curated recipe database to power the swiper—no AI slop, only quality, tested recipes from some of the best known recipe creators on the web.
How I Built It
Cloche is a Flutter app that runs on Android, iOS, macOS, web, and desktop platforms from one codebase. The backend is Supabase with Postgres for the database, real-time subscriptions for syncing, and edge functions for server-side logic. Recipe images live on Backblaze B2. State is managed with Riverpod, navigation with GoRouter. Data models use Freezed for immutability and Drift for local caching so the app works offline.
Recipe parsing is handled through a python script, hosted on a VPS. Before making any LLM calls, I use a deterministic script to extract recipes from HTML and then use NLP to parse the ingredients text. Only if this pipeline fails do I make calls to an LLM. This keeps my costs down and lets me offer recipe parsing on the free tier.
I integrated RevenueCat for subscriptions with three tiers: Free, Pro at $4.99 a month, and Pro Plus at $8.99. The whole flow is built out: SDK setup, payment handling, webhook processing, paywall UI, and usage limit tracking.
Challenges
Recipe import sounds simple but it's a nightmare. The web has thousands of recipe sites, each with different HTML structures. Some use JSON-LD metadata, some use microdata, most use neither. Then you hit paywalls that block scraping, or IP blocks if you try to scrape from a single centralized server. I ended up building three different pipelines: URL scraping with a headless browser, text paste parsing, and file upload. An LLM scraper is the "easy way" to handle things, but releasing this publicly opens up risk of bad actors attempting to parse junk websites that consume a massive amount of tokens. So figuring out a way to reduce this risk of this was also an interesting technical challenge.
Another challenge of this project was the project management. I have a big vision for this app, so deciding when to call certain features "good enough" proved to be difficult. Even with coding agents, there was a lot to build, and the feature complexity was more than I anticipated at the outset. Maintaining architectural and UI consistency across different models proved challenging until I developed a system of documenting the items that required consistency.
Built With
- flutter
- supabase
Log in or sign up for Devpost to join the conversation.