Inspiration Saving a recipe is easy. Turning that inspiration into dinner takes more work. Recipes end up scattered across screenshots, social bookmarks, websites, and handwritten notes. Meanwhile, some of the most memorable food experiences come without a recipe at all: a restaurant meal, a dish discovered while traveling, or something you wish you could recreate at home.

I built SavaPlate to connect those moments of inspiration to the practical experience of cooking. I wanted to help people preserve recipes, understand them, adapt them, and bring them into their own kitchens.

What SavaPlate does SavaPlate turns screenshots, supported social and web links, and photographs of handwritten recipes into something users can save, review, edit, and cook. It provides serving adjustments, dietary substitutions, meal planning, grocery lists, and cooking instructions with hands-free voice narration and control.

Dish Detective: starting with the dish itself One of SavaPlate’s key differentiators is Dish Detective, which starts with a photograph of food rather than an existing recipe.

A photograph provides clues, but it cannot tell the whole story. Flavors, textures, and subtle cues aren't conveyed by a picture. Two dishes might look similar but taste completely different.

I built Dish Detective around that mystery. Users can provide multiple photographs, review the initial observations, and describe what they remember. They can correct an ingredient, explain a flavor, or answer a follow up question while the app searches for relevant published recipes. That conversation becomes part of the investigation. An explicit correction should change the search substantially. An uncertain suggestion should have less effect. A geo-located published recipe for the restaurant is taken as truth.

When the published recipe cannot be found, Dish Detective can provide a strong approximation. The goal is to help someone find a credible starting point for recreating a meal while being honest about what the available evidence supports.

How I built it I developed both a native SwiftUI app and a React Native app using Expo and TypeScript, supported by shared Supabase services and Edge Functions. The backend coordinates AI processing, recipe retrieval, subscription access, and usage limits. RevenueCat manages subscriptions, with entitlements enforced on the server.

I treated AI as a set of specific capabilities. Reading a photographed recipe, simplifying instructions, proposing substitutions, and discussing a restaurant dish each require different evaluation criteria.

Choosing AI models through testing I built an evaluation harness to compare models from OpenAI, Google, and Anthropic on actual product tasks.

For recipe extraction, I measured ingredient preservation, quantities, units, instructions, and valid structured output. I also tracked response times, token usage, and estimated provider cost. Testing included clean recipe pages and a separate set of difficult captures.

Those results informed an extraction path using GPT-5.6 Luna, with Gemini 3.7 Flash as a fallback before user review. I also evaluated Gemini 3.8 Flash and Claude models. A newer or more expensive model did not consistently produce a better result on the cases that mattered.

One useful finding was that an additional Claude Sonnet extraction stage added no successful recoveries in the evaluated set. I removed that stage from the routine path, avoiding extra waiting and expense without a demonstrated benefit.

When it was released a couple of weeks ago, I also integrated TypeSafe’s Jev to assess whether imported text contains a complete recipe before sending it to a larger generative model. I evaluated this focused decision layer as a way to reduce unnecessary processing and reduce cost, with a fallback that lets imports continue if Jev is unavailable.

For Dish Detective’s conversation, I compared Luna with Gemini 3.8 Flash using eight synthetic scenarios repeated three times. These covered corrections, uncertainty, contextual answers, and requests to stop asking questions and show recipes.

In that run, Luna completed all 24 requests and passed the targeted checks, averaging about 1.9 seconds per completed reply. Gemini completed 14 of 24 requests in the tested environment, and its completed replies also passed. Luna’s estimated conversation cost was lower, supporting its selection for that particular role.

These were bounded tests, not proof that one model is universally better. They helped me choose models according to the task, the user’s waiting time, and the economics of operating the app. Having said that, new models were released during the development and AI usage remains a target for continuous improvement in the product cycle.

Challenges I faced One challenge was preserving meaning while converting messy source material into structured recipes. A response can look convincing while omitting a quantity or changing an ingredient. Another was managing uncertainty. In an early Dish Detective test, a tentative suggestion such as “maybe lamb” could incorrectly exclude beef. That led me to strengthen the distinction between confirmed corrections and hypotheses, then expand the regression tests.

Keeping two frontends aligned (SwiftUI and Native React) also required deliberate work. Shared services helped maintain consistent rules, but each client still needed its own implementation, verification and cross-checks.

Finally, I had to balance quality with user experience and sustainable production costs at scale. Extra model calls can increase both expense and waiting time without adding sufficient quality to the results. I learned to require evidence that an additional call improved the result in a meaningful and cost-effective manner.

What I learned I learned that confidence is not the same as correctness. A model can sound certain and still misread a recipe, so review, validation, and correction are essential parts of the experience. I also learned that code/output evaluation can improve the product beyond model selection. Tests exposed problems in prompts, validation rules, and conversation behavior that would have remained hidden behind a polished response. The most useful question became: Which approach helps the person complete this task accurately, quickly, and at a sustainable cost?

Finally, I learned that time is always a challenge. Even with submitting the app to Apple over a week before the deadline, I learned I cannot assume that others will operate to my schedule. As of writing this, Apple still has not approved the app for release in the App Store.

What’s next As I await App Store and Google Play Store releases, I am continuing to refine difficult imports, improve Dish Detective, and incorporate feedback from testing. I'm also looking to enhance usage of Apple Intelligence for iPhone users and an onboard fine-tuned small model for both Apple and Android.

In the end I want to deliver to the public the best product the market and economics allows. This helps me achieve my primary objective: help people turn the food that inspires them into food they can make.

SavaPlate: from “I should make that” to “I made that!” Post to Plate

Built With

Share this project:

Updates

Submission history