Inspiration
It started with a picture, not a problem.
For a while every food feed was full of teardown shots. A burger with its ingredients suspended in mid air, a bowl of pasta pulled apart into its parts, everything floating in perfect order. They spread because they do something a photo of a finished plate never does. They explain the dish. You look at one and you know what is in it.
That turned out to be the whole idea. A finished dish is a closed box. Take it apart and it becomes something you can cook.
So we built the teardown into an app and pointed it at the things people had already saved: the cooking video sitting in a saved folder, a photo of last night's dinner, a page out of a cookbook. Same operation every time. Something closed goes in, its parts come out.
What it does
Paste a link to a cooking video and Plate writes out the recipe. Ingredients with quantities, steps in order, timings, and nutrition for each serving, written as text you can read at arm's length while your hands are busy.
The same pipeline works from other directions:
- Snap a dish. A photo of what is on the plate becomes a recipe for it.
- Scan a page. Printed cookbooks and handwritten cards.
- Pantry. Tap what is in your kitchen and get matched against what you saved.
Everything lands in a private cookbook. Cook Mode runs the recipe with timers and live scaling, the Yearbook keeps an archive of what you actually cooked, and the whole thing speaks 20 languages. There is no feed and no profile. Your cookbook is visible only to you, and you can delete it whole.
How we built it
Native SwiftUI, iOS 26 and up, built by two people, one on design and one on engineering.
- Import. Three routes, one destination. A video link goes to Supadata, which returns the transcript for the post whether it came from TikTok, Reels, Shorts or YouTube. A recipe page is parsed straight from the URL, reading the structured recipe data most food sites already publish. A photo goes to the model as an image with no intermediate step.
- Extraction. Gemini turns whatever came back into one recipe object: ingredients with quantities, ordered steps, timings and servings.
- Localization. Extraction and translation are two separate passes. Gemini writes the recipe once, then a second job renders it into the reader's language, converting units and ingredient names in the same step. There is no mapping table to maintain, which is what makes 20 languages survivable for two people.
- Storage. Supabase is the source of truth, with a cache on the device so the cookbook opens instantly and stays readable offline.
- Monetisation. RevenueCat, with a soft paywall at the end of onboarding that the user can dismiss, and a generation limit on the free tier. Pro unlocks unlimited generation and is sold weekly, monthly or yearly.
- Iconography. The food icon set is built on Microsoft's Fluent Emoji 3D (MIT), extended with icons we generated ourselves for ingredients the set was missing, such as green beans, turmeric, bulgur and tahini, using existing icons as style anchors so the additions are indistinguishable from the originals.
Challenges we ran into
A cooking video is a hostile source document. There is no ingredient list. Quantities live in the voiceover, in captions burned into the frame, or nowhere at all. Steps get reordered for pacing and half of them are hidden behind a jump cut. The transcript turned out to be the only reliable place to look, which is why the whole video path is built around it rather than around the frames.
A confidently wrong recipe is worse than no recipe. An app that invents "2 tbsp of baking soda" does not just fail, it ruins someone's dinner. The first guard is knowing when there is no recipe to write at all. A link to something that is not food, or a photo of a person, a receipt, a screenshot, gets rejected before generation rather than turned into a plausible looking dish nobody can cook.
20 languages is not 20 translations. It is metric against imperial, ingredient names that do not map cleanly between languages, and "a glass of" meaning different volumes in different kitchens. Asking a single prompt to extract and translate at the same time made both jobs worse, so we split them into two passes.
Cost per import against a subscription price. Every import spends real money on the way in, before anyone has paid anything. The free tier has to be generous enough to show what the app does and tight enough that the paywall arrives before the bill does.
What we learned
The transcript is the recipe. The most useful thing in a cooking video is not the video. It is what the person says while they are making it. Once that was clear, the entire import path got simpler.
One prompt should do one job. Extraction got sharper and translation got less literal the moment they stopped sharing a prompt. Splitting them cost an extra call and was worth it immediately.
Refusing is a feature. Deciding that something is not food is as much a part of the product as writing the recipe. Every wrong recipe an app produces costs more trust than ten right ones earn.
What's next for Plate
- More languages. Beyond the current 20.
- A Plate catalogue. Recipes we write and publish ourselves, delivered and refreshed in bulk, so a new cookbook has something in it on day one instead of waiting for the first import.
- Confidence on quantities. When a video says "a bit of olive oil", the recipe should say so rather than inventing a number. Marking uncertain quantities instead of guessing them is the next thing we want to get right.
Built With
- firebase
- ios27
- nanobanana
- node.js
- revenuecat
- supabase
- supadata
- swift
- swiftui
- typescript
Log in or sign up for Devpost to join the conversation.