Skip to content
Neal GysemansMacroTrack

MacroTrack

An AI meal tracker built around one idea — you should be able to say what you ate and be done.

Role
Sole developer — schema, Edge Functions, app, iOS submission
Year
2026
Status
Not yet released
Stack
React 19 · Vite · Tailwind 4 · Supabase · Capacitor · Gemini
MacroTrack's Today screen — 705 calories remaining against a 2,400 kcal goal, protein, carbs and fat tracked against their own targets, and the day's logged meals beneath.

The constraint

Macro tracking fails for one reason: it is a chore. Every established app makes you search a database, pick between forty entries for “chicken breast”, and guess a portion. People don’t quit because they stop caring; they quit because logging lunch takes two minutes.

So the whole product is one bet — that removing the search box removes the attrition. You say what you ate, in your own words, and the app does the rest. Every decision below serves that.

Parsing happens server-side, and the key never touches the client

Meal parsing runs in a Supabase Edge Function against Gemini. The client sends text; it never sees the provider credentials.

That sounds obvious until you notice how easy it is to get wrong: anything prefixed VITE_ is compiled into the bundle and readable by anyone who opens devtools. The Supabase URL and anon key are in the bundle, deliberately — row-level security is what restricts access, not secrecy. The provider key is not, and there is a note in the README saying why, because that is exactly the shortcut a tired developer takes at midnight.

What it cost: a network hop on every log, and Edge Functions to deploy, version and debug rather than a direct call.

Measure the thing you want to claim

Median parse latency is 1,155 ms; p95 is about 1,690 ms. Cost scales with the number of items returned rather than with usage, varying 3.2× between a simple and a complex meal — which makes “meals per day” a questionable quota unit and “items” the honest one.

Those are server-side numbers, and the benchmark doc says so in as many words. There is no measured end-to-end figure yet, so there is no end-to-end claim.

What it cost: the marketing copy is duller than it could be. “Log a meal in five seconds” is available, unmeasured, and would be a lie by rounding.

The pivot

It started as a barcode scanner. The repository is still named for it.

Barcodes solve the wrong half of the problem: they work for packaged food with a label in reach, which is not what most people eat and not where the friction is. Speech and free text cover the actual case — a plate someone assembled — and the barcode path became a maintained feature serving a shrinking fraction of logs.

What it cost: a working feature deleted, and a repo name that now misleads anyone who reads it before the product.

Where it stands

Built as a web app and wrapped for iOS with Capacitor, from a single codebase. Free with a ceiling of five AI logs a day; a subscription is deferred until the business entity exists to invoice through.

What I’d do differently

Run the benchmark before building the quota. I designed a per-meal limit and then measured that cost varies 3.2× by meal complexity — which means the unit I picked charges a salad the same as a roast dinner. Twenty minutes of measurement first would have changed the design instead of embarrassing it afterwards.

Screens

Captured from the running app against seeded demo data — the people and figures in them are fictional.

The logging sheet — a meal-type selector, a free-text field reading "two scrambled eggs on sourdough toast with butter, and a flat white", a microphone for speaking it instead, and a note that the text goes to Google Vertex AI.The consent gate shown before any AI logging — what gets sent to Google, that voice is transcribed in the cloud, that name and account ID are not included, and that consent can be withdrawn while manual logging keeps working.The manual path — search for a food, or quick-log a name with grams, calories and macros typed by hand.