Project Story
Inspiration
We've all been there — scrolling through food content, hitting "save" on recipe after recipe, and then... never actually cooking any of them. Eitan Bernath nailed this problem perfectly: the gap between "that looks delicious" and "dinner is on the table" is way too wide.
But when we dug deeper, we realized the real friction isn't just about organizing recipes. It's about adapting them. Real life doesn't match recipe assumptions: you don't have the exact ingredients, your kid hates mushrooms, you're too tired to deep-fry anything, or you're trying to go dairy-free this month. Every recipe requires mental translation before you can actually use it — and most people give up at that step.
That insight became our north star: what if recipes weren't rigid instructions, but living documents you could tweak to fit your life?
What it does
Tweakable lets you paste any recipe URL from the web and instantly extracts a clean, structured recipe with ingredients, steps, and images using AI.
The magic is in the Tweak: tap any ingredient or cooking step, type what you want changed — "swap chicken for tofu," "use the oven instead of deep-frying," "make it nut-free" — and the AI intelligently adjusts not just that item, but all related ingredients, quantities, and steps to keep the recipe coherent.
A categorized shopping list is automatically generated and updates in real time as you tweak. You can save recipes, organize them into categories, and build shopping lists from multiple recipes.
Free users get full recipe extraction and shopping list generation. Premium subscribers unlock the AI substitution engine.
How we built it
We built Tweakable as a native iOS app with SwiftUI and Swift 6, using a Redux architecture for predictable state management. The entire codebase follows strict TDD (Test-Driven Development) methodology.
The AI pipeline uses the OpenAI API with Structured Outputs — JSON Schema mode guarantees that every LLM response conforms to our data model, eliminating parsing failures. Recipe extraction and substitution both go through this pipeline, with the model ID managed via Firebase Remote Config so we can upgrade models without shipping app updates.
For monetization, we integrated the RevenueCat SDK with a protocol-based service layer, enabling both production use and deterministic UI testing with mock services.
Data persistence uses SwiftData, and we built a comprehensive testing infrastructure: unit tests for all reducers (pure functions), snapshot tests via Prefire for every SwiftUI view, and end-to-end UI tests with configurable launch arguments.
The entire project was built over approximately 3 weeks — 324 commits, 132 pull requests — with Claude Code as a core development partner throughout.
Challenges we ran into
Recipe site compatibility: Not all recipe sites play nice. Some (like Food Network) block automated HTML fetching entirely with bot detection. We had to identify and test specific sites that work reliably, and leaned on the LLM's flexibility to handle varied HTML structures rather than building brittle site-specific parsers.
Substitution coherence: A naive "find and replace" approach to ingredient substitution breaks recipes. Swapping "deep-fry" for "bake" means you also need to adjust oil quantities, temperatures, and timing. Getting the LLM prompts right to produce coherent, cascading adjustments took significant iteration.
Structured Output reliability: While OpenAI's Structured Outputs are powerful, designing schemas that are both strict enough for reliable parsing and flexible enough for the variety of real-world recipes (multi-section ingredients, grouped steps, optional fields) required careful balancing.
Accomplishments that we're proud of
The Tweak paradigm itself. Most recipe apps stop at organizing and displaying recipes. The ability to tap any ingredient or step and naturally describe what you want changed — then see a real-time diff preview before accepting — feels genuinely novel.
Quality at speed. 324 commits with TDD, snapshot tests, CI/CD, and code review — in 3 weeks. We didn't cut corners on engineering quality despite the tight timeline.
It works with any recipe site. We're not locked to a proprietary database. Tweakable meets users where they already find recipes, which is the whole point of Eitan's brief.
What we learned
LLM-powered features need guardrails, not just prompts. Structured Outputs were the key insight — instead of hoping the LLM returns valid JSON, we guarantee it with schema constraints. This shifted our error handling from "parse failures" to "extraction quality," which is a much better problem to have.
Freemium conversion works best when the upgrade moment is natural. Placing the paywall at the exact moment a user taps an ingredient to substitute creates a "show, don't tell" upsell that feels helpful rather than pushy.
Redux architecture pays off in hackathons too. Pure reducer functions meant we could write and test business logic independently of UI, which made parallel development and rapid iteration much smoother.
What's next for Tweakable - Tweak any recipe as you love.
- Serving size adjustment — scale recipes up or down (the most-requested recipe app feature)
- Meal planning — plan a week of dinners with a single merged shopping list
- Shopping list sharing — send your list to family members or sync with grocery apps
- Smart pantry — track what you have at home, and Tweakable suggests what you can make or what's missing
- Community tweaks — share your best substitutions so others can benefit
Log in or sign up for Devpost to join the conversation.