tabenote —A chef's method for composing a plate, made visible.
How we built it
The reference data is more than 400 ingredients, each carrying a flavor character, a thermal nature, and a meridian classification — categories from traditional Chinese dietary theory, compiled from published Japanese-language reference works. The classification is Chinese in origin; I'm a Japanese cook who was taught to use it. I've kept that line clear everywhere in the app.
All judgment runs locally with no LLM involved — the chart, the gap analysis, and the seasonal comparison are deterministic. An LLM writes meal suggestion prose from an already-computed result, and is explicitly constrained from making any health claim. Built with Expo / React Native, with RevenueCat handling the subscription.
Challenges we ran into
The data didn't exist. There is no machine-readable yakuzen dataset. more than 400 entries were transcribed by hand from a print reference — thermal nature, five flavors, meridian affinity, category, one at a time. It is the least glamorous part of the project and easily the most important.
Deciding what not to build. Every instinct says score the meal. Give it a number, show a streak, congratulate the user. But a score implies there's a right answer, and the source material says plainly there isn't — balance is one option, not the goal. Taking the score out was harder than putting it in would have been, and it changed the suggestion engine: it can propose what's missing, but it can't imply you were wrong.
Staying out of medicine. The moment an app connects an ingredient to a symptom, it's a health product, and the framework I'm working from is full of that language. The line I settled on is that the app never writes effects. It shows classification — this is warming, this is bitter, this reaches these meridians — and the notes are yours to write. That constraint runs everywhere: the ingredient index, the suggestions, the AI prompt.
Making something Japanese work in English. My last app failed at this. This time the UI ships in both languages from the same string table, tested for stray Japanese characters. I still haven't finished it — ingredient names are Japanese-only right now, and that's the biggest hole in the app.
Doing all of it alone. Data entry, the astronomy, the drawing, the billing integration, the legal pages, the store submission. The unglamorous half of shipping — provisioning profiles, review screenshots, a lockfile that pointed at a registry only my dev machine could resolve — took about as long as the part anyone would call building.
Accomplishments that we're proud of
The pentagon reads instantly. You pick four ingredients and the shape tells you something true about the meal before you've read a word.
The solar terms are computed from the sun's position, not hardcoded. It's more work than a date table for something almost nobody will notice, but it means the app is correct rather than approximately correct, and it will still be correct in 2040.
more than 400 ingredients, transcribed by hand, including the ones nobody will ever cook.
And the thing that isn't there: no score, no streak, no 100/100. The app describes and suggests, and then it stops.
What we learned
The hardest design problem was refusing to score. Every wellness app converges on a number, because a number is easy to render and easy to feel something about. But a perfect plate — even across every axis — is a plate with no character. If I put a number on the plates I actually serve, most would land around 50 or 60. That's not failure. That's character.
Removing the number meant the shape had to carry all the meaning by itself. That took longer than building a score ever would have.
What's next for tabenote
English ingredient names. The interface is bilingual but the ingredients aren't, which limits the app to people who read Japanese food words. This is the next thing I build.
Android. The codebase is already there; it's a store account and a build profile away.
The notebook, over time. Saved combinations are currently a list. They're also a record of how someone actually eats across a year of seasons, and that's a more interesting thing to show back to them.
More of the year in the app. Twenty-four solar terms means twenty-four moments worth writing about, and right now the seasonal text is thinner than the data behind it.
Built With
- claudecode
- cursor
- expo.io
- fable
- replit


Log in or sign up for Devpost to join the conversation.