01Consumer app / Nutrition / 2026

CAROOT

A calorie and nutrition app where logging a meal is one photograph. AI splits the plate into individual dishes, and a correction you make once is applied to that dish from then on.

2026
iOS & Android
CLIENT
CaRoot — own product
SECTOR
Consumer app / Nutrition
ROLE
Planning, UI/UX, mobile and backend development, data design, release and operation
YEAR
2026
LIVE
www.caroot.app

01 / PROJECT

WHAT THE
PROJECT IS.

Calorie counting does not fail because people lack willpower; it fails because typing in every meal is tedious. CaRoot exists to remove that step. It is my own product, developed end to end — planning, UI/UX, the app, the backend, the AI features, the data design and the App Store release.

There are five ways in. Photograph the meal and it is broken into dishes; scan a barcode; photograph a nutrition label; search; or type it. Search covers roughly 8,500 menu items from 56 restaurant chains' published nutrition data and about 2,500 entries from Japan's official food composition tables — in English it switches to around 7,800 USDA entries. Products with no barcode record yet can be added by whoever scans them first, so the product database grows with use.

Around the log sit the things that make it a habit: targets computed from body composition and goal, a diary, calendar and analytics view, weight and water, a photo roll, streaks, weekly reports and meal reminders. There is a social side too — posts, follows, leaderboards and invite codes — and the app funds itself through a subscription and a one-off ad-free purchase.

02 / HOW IT WORKS

THE DECISIONS
UNDER IT.

FROM THE IMPLEMENTATION

01
The model never sees a client key

Photo analysis runs in a server-side edge function. The API key is an edge secret, and so are the system prompt and the response schema — the client cannot swap either, which is what keeps the model's scope fixed. The function also enforces the per-tier daily limit, because a limit checked on the device is not a limit.

02
A correction is made once

When an estimate is wrong, the corrected figures are stored against the normalised dish name and reapplied every time that dish appears. It also learns the alias: if the model calls something 醤油つけ麺 and you rename it, the correction is keyed to what the model said and mapped to what you called it, so the next photo of it comes back with your name and your numbers. Corrections with nothing in them are not learned, and saving a total without a breakdown clears the old breakdown rather than leaving it to contradict the total.

03
Writes are queued before they are sent

Every write goes into a typed queue in local storage first, then to the server; it is removed only on success. Failures — offline, app killed, a transient error — are retried FIFO on the next write, on foreground, and at launch. While the queue is not empty, syncing down from the cloud is suspended, because the cloud is known to be behind. Before this, a failed write vanished silently and the next launch rolled local data back.

04
Every way in is optional

Photo analysis, barcodes and label reading can all fail — a bad photo, an unlisted product, a label that will not read — so search and manual entry are first-class paths rather than fallbacks. The app stays fully usable when the analysis service is unreachable, which is also why the food tables ship inside the app instead of behind an API.

05
The subscription tier is not client state

Rows are separated per user by row-level security in the database. The subscription tier lands there from the store's webhook and is write-protected, so it cannot be set from the app — the paywall is a consequence of the data, not a check in the UI. Invite rewards work the same way: redeeming a code runs as a database function that refuses a second redemption, rather than as a client that promises not to ask twice.

03 / DELIVERED

WHAT WAS
BUILT.

  1. 01

    AI meal-photo analysis that splits a plate into dishes, with every estimate editable on the spot

  2. 02

    Barcode scanning, nutrition-label reading, and user-contributed records for products not yet listed

  3. 03

    Bundled food data: ~8,500 menu items from 56 restaurant chains, ~2,500 from Japan's composition tables, ~7,800 USDA entries in English

  4. 04

    Per-dish correction learning, including the alias between what the model called it and what you call it

  5. 05

    Calorie and PFC targets derived from body composition, activity and goal, adjustable by hand

  6. 06

    Diary, calendar, analytics, weight and water logs, photo roll, streaks, weekly reports and meal reminders

  7. 07

    A social layer — posts, follows, leaderboards, invite codes — with rewards granted server-side

  8. 08

    Subscription and one-off purchase handled through the store webhook, ads, Japanese / English, and account deletion

04 / TECHNOLOGY

THE STACK
BEHIND IT.

  • Expo
  • React Native
  • TypeScript
  • NativeWind
  • Zustand
  • Supabase
  • PostgreSQL
  • Edge Functions
  • Gemini
  • RevenueCat
NEXT02HakuhoALL WORKS