WORKS / 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.食事の記録を写真1枚で終わらせるための、カロリー・栄養管理アプリ。AIが料理を品目ごとに見分け、一度直した内容はその料理に次回から自動で適用されます。

2026
iOS & AndroidiOS / Android
CLIENTクライアント
CaRoot — own productCaRoot — 自社プロダクト
SECTOR領域
Consumer app / Nutrition消費者向けアプリ / 栄養管理
ROLE担当
Planning, UI/UX, mobile and backend development, data design, release and operation企画、UI/UX、モバイル・バックエンド開発、データ設計、リリース・運用
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.カロリー計算が続かないのは意志が弱いからではなく、毎食入力するのが面倒だからです。CaRootはその工程をなくすために作りました。企画、UI/UX、アプリ、バックエンド、AI機能、データ設計、App Storeのリリースまで一貫して開発している個人プロダクトです。

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.入口は5つあります。写真を撮れば品目ごとに分解され、バーコードをかざし、栄養成分表示を撮り、検索し、あるいは手で入力します。検索の対象は、56ブランドの外食チェーンが公表する栄養データ約8,500メニューと、日本食品標準成分表(八訂)約2,500件です。英語表示ではUSDAの約7,800件に切り替わります。まだバーコードの登録がない商品は最初にスキャンした人が登録でき、商品データベースは使われるほど育ちます。

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.写真解析はサーバー側のEdge Functionで動きます。APIキーはEdge Secretで、system promptとレスポンススキーマも同様にサーバー所有です。クライアント側から差し替えられないので、モデルの扱う範囲が固定されます。プラン別の1日あたり上限もこの関数で判定します。端末側で確認する上限は上限ではないためです。

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.書き込みはまずローカルに型付きのキューとして積み、それから送信し、成功したときだけ取り除きます。オフライン、アプリの強制終了、一時的なエラーで失敗した分は、次の書き込み時・フォアグラウンド復帰時・起動時にFIFOで再送します。キューが残っているあいだはクラウドからの取り込みを止めます。クラウドのほうが古いと確定しているからです。これがないと、失敗した書き込みは黙って消え、次回起動時にローカルが巻き戻されていました。

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.写真解析もバーコードもラベル読み取りも失敗しえます(写真が悪い、未収録の商品、読めないラベル)。そのため検索と手入力は代替手段ではなく対等な経路として用意しています。解析サービスに到達できなくてもアプリは問題なく使え、食品データを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.データはデータベースの行レベルセキュリティでユーザーごとに分離しています。課金プランはストアのWebhook経由で書き込まれ、書き換えから保護されているので、アプリ側からは設定できません。ペイウォールはUIのチェックではなく、データの結果として成立します。招待の報酬も同じ考え方で、コードの引き換えはデータベース関数として実行し、2回目を関数側で拒否します。クライアントが二重に要求しないと約束する形にはしていません。

03 / DELIVERED

WHAT WAS
BUILT.

  1. 01

    AI meal-photo analysis that splits a plate into dishes, with every estimate editable on the spot料理を品目ごとに分解するAI写真解析と、その場で編集できる推定値

  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同梱の食品データ:外食56ブランド約8,500メニュー、日本食品標準成分表 約2,500件、英語表示ではUSDA 約7,800件

  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体組成・活動量・目標から導くカロリー / PFC目標と、手動での微調整

  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ストアのWebhook経由で扱うサブスクリプションと買い切り、広告、日本語・英語対応、アカウント削除

04 / TECHNOLOGY

THE STACK
BEHIND IT.

ExpoReact NativeTypeScriptNativeWindZustandSupabasePostgreSQLEdge FunctionsGeminiRevenueCat
NEXT次の実績02HakuhoALL WORKS実績一覧