Skip to content
Work

AskCal

Live on both stores

A calorie counter that admits what it cannot see.

MobileExpo SDK 57React Nativeexpo-routerUniWindZustandMMKVRevenueCatFirebase FunctionsZodTurborepo

AskCal — cameraAskCal — askAskCal — amount
Screens
37 mobile
Checked by canon
8 modules · canon 6.7.0

How it ships

As of 2026-11-10

The stages work on AskCal goes through. I approve at the marked ones and can send them back. A dashed stage has not started. Tap a count to open it.

  1. 6problems
    • 3 being solved
    • 3 solved
    Problemwhat hurts
  2. Researchdiscoveries, findings
  3. 1plan
    • 1 approved
    Planthe approach
  4. 9features
    • 5 shipped
    • 4 planned
    Featurewhat gets built
  5. 8bugs
    • 7 fixed
    • 1 open
    Bugwhat gets fixed
  6. Designevery screen, in HTML3 turned down
  7. Codethe build1 turned down
  8. Reviewa merged pull request
  9. Releasea version
  10. Androidlive · 1.4.4
  11. iOSlive · 1.4.4
  12. Liveanyone can use it
  13. Marketingposts drafted
  14. Videoscript, render, publish

ProblemsThinkingBuildingShipping

Versions cut
9
iOS approved
0
Store rejections
3+
Decisions reverted
1
Experiments discarded
3
Features shelved
0

Turned down: my chat since 2 Oct 2026, read and sampled by hand. Approximate, and a minimum. Store rejections are a minimum too.

Where each surface is

  • Android live · 1.4.4
  • iOS live · 1.4.4

Next up

4 planned

The idea

Every camera-first calorie app turns a photo into one confident number. A photo cannot show the oil a dish was cooked in, cannot separate a sandwich's layers, and gives a different answer from a different angle. Those failures cluster on mixed, sauced, oil-cooked, shared-serving food — which is most of what the world actually eats, and almost everything cooked at home.

Asking is friction, and frictionlessness is what the incumbents sell. That is precisely why they will not copy it.

What it does

  • Estimates from a photo and marks every value Seen, Label, Guessed or Unknown.
  • Asks one or two questions. how many pieces, which oil, your share or the whole dish.
  • Resolves the answer against USDA FoodData Central rather than the model's recall.
  • Shows a range where a single number would be false.
  • Keeps totals honest. a total always equals the sum of its rows.

Decisions worth defending

  • The estimator is a config value, not an import. One file per vision provider behind a single interface. Quota, caching and the app never know which one ran, so swapping the model is one line.
  • Accuracy is the product, so it is measured. A harness answers whether asking beats guessing. It imports the same prompts the server sends, so it measures the estimator that ships, and a change is not done until it has run.
  • Grams are the quantity of record. A unit a person would say out loud — two eggs, a glass of juice — is only how the amount is spoken. Macros scale from grams, and a measure that disagrees is dropped, not repaired.
  • “We could not check” is not “you have not paid”. The entitlement check returns three values. Collapsing unknown into false once metered a paying subscriber against the free allowance; unknown now touches no counter.