
KetoGen
Built to keep keto interesting, not just compliant. Meals from a curated library or generated on-device, with macros the language model never touches.
- Track
- built
- Category
- tool
Tools
- Swift
- SwiftUI
- SwiftData
- FoundationModels
Why
Keto rarely fails because the diet is hard. It fails because a few weeks in, you run out of ideas, meals repeat, and "healthy" starts losing to "easy." I built KetoGen because I wanted to stay on keto myself, and staying on it meant not getting bored of it.
I built this alone. No team, no cofounder, design and engineering both mine.
Personalization, from behavior, not ratings
The taste engine is built on a specific bet: people rate rarely but cook often, so implicit signals beat explicit ones. Tapping "give me another" is the strongest signal in the system, an unambiguous rejection that costs the user nothing and happens naturally. Cooking something again unprompted is the strongest positive signal. A day you planned but never logged barely moves the needle at all, because that's usually a change of plan, not a dislike, and punishing it would hollow out the profile over one busy week.
The profile itself, cuisine, ingredient, and technique affinity, is deliberately readable and editable on a "Your Taste" screen rather than an opaque embedding, and it decays over roughly two months so a dislike from a year ago stops dictating dinner.
Guarding against going stale
Left alone, a system like this collapses: the highest-scoring foods keep winning, the user keeps seeing them, and within weeks the app is proposing the same five dishes forever. KetoGen reserves a share of every day for food you have no history with at all, not just lower-scoring food, genuinely unfamiliar. That share grows or shrinks with how adventurous your profile says you are.
The week planner adds its own constraints on top: no protein appears more than twice in a week, no exact recipe repeats within 14 days, and at least three cuisines show up across the week. These are stated product decisions, not clinical thresholds, kept deliberately separate from the underlying math so they can be retuned without touching it.
Library and generation, both real
Every meal slot can be filled from a curated recipe library or generated fresh on-device with Apple's model. Generation is grounded against the same food catalog the library draws from, so the model is structurally unable to name an ingredient that isn't real. If on-device generation isn't available, the app falls back to the library instead of failing.
Macros the model never touches
The language model writes a recipe. It does not do the math. A separate nutrition engine computes macros from real food composition data, an energy engine derives calorie and macro targets from metabolic equations, and a carb engine handles net carbs and sugar alcohols correctly rather than the common "carbs minus fiber" shortcut. Every number shown to a user traces back to a citation, read live from the code that computed it.
A validation layer between the model and the screen
Every generated recipe is checked before it reaches the user: allergens twice, once against catalog data and once against free text, kept deliberately independent so a bug in one gets caught by the other. Cook temperatures are cited from FDA Food Code tables, computed at runtime rather than hardcoded into a view. That said, I'll be straight about it: the classification isn't perfect everywhere yet, whole roasts and stuffed dishes can land on the wrong table entry today, and that's tracked, not hidden.
A confession
Reading this list back, this is a lot more than a recipe app needed to be for a first version. I got interested in the problem underneath the problem and kept pulling the thread. I don't regret it, though I'll admit "MVP" was never really on the table for me.
Privacy, checked, not just stated
There are no network calls anywhere in the app. No URLSession, no third-party SDK, no dependency that could phone home even if it wanted to. I checked this directly rather than just writing it in a privacy label. Nothing about a person's body, food, or health leaves their device, because there's no path for it to.
Design
Color means something, not decoration. Fat is always yellow, protein always red, carbs always blue, everywhere, no exceptions for what looks nice in a given layout. Illustrations are flat color fields with ink contours, a quiet Bauhaus influence, and never boxed into cards, so a hero figure feels like part of the page instead of sitting on top of it.
Stack
Swift, SwiftUI, SwiftData, Apple FoundationModels for on-device generation. Solo build. Pre-launch, first TestFlight round with a small group underway.
Screens
Onboarding



Nothing about your body, food or health leaves the device: the app makes no network calls at all. 




Targets come from metabolic equations, and every number traces back to a citation. 
Two independent checks, catalog data and the recipe's own wording, so a bug in one gets caught by the other. 
People rate rarely but cook often, so it learns from what you cook, keep and swap. 

Every meal slot can be filled from the curated library or generated fresh on-device. 
Fat is always yellow, protein always red and carbs always blue, everywhere. 
Generated on-device, and checked for allergens before it reaches the screen. 
Cook temperatures are cited from FDA Food Code tables, computed at runtime. 
No protein more than twice a week, no exact recipe within 14 days, and at least three cuisines a week. 
Generation is grounded in the same food catalog the library draws from, so the model cannot name an ingredient that isn't real. 
Illustrations are flat color fields with ink contours, and never boxed into cards. 

More apps

Bespoke
A pixel art bar for the end of the day. You watch the drink being made, and then you get the real recipe to make it at home.
tool · soon · wip · read it
Serenity
A calm app of bedtime stories for adults, baked in or written on demand, each with a scene composed from its content. No navigation bar, just story cards.
experiment · soon · wip · read it
Nagare
A zen fishing game for Mac, on the App Store. No score, no progress, nothing to unlock. It gives back the time it asked for and stops.
game · 2026 · read it