Tap a day to see or change what you ate.
Dish numbers from Singapore Food Insights Database (SG FoodID), Health Promotion Board — terms · details in Settings
Everything here is from FairPrice, City Square Mall (#B1-09/10). It needs only your microwave, egg steamer and fridge, and comes in packs one person finishes before they spoil.
Numbers are per serving, from the pack where checked, otherwise typical values. Check the label: brands change. "Fills you up" compares protein and fibre with the calories.
Enough for about 4 meals at home plus breakfasts and snacks, picked so every pack gets used up.
Take a photo of your plate or the receipt, or pick one you already took.
Optional: tell the AI what the photo can't show. Leave it blank to just add the photo. A receipt you shared? Say which items were yours.
Forgot the photo? Write it with amounts. The AI works it out in the background, so you can type the next one straight away.
Ate more or less? Pick a portion — no weighing needed.
Tap what's in it. Numbers per scoop from Stuff'd's nutrition page (the wraps are estimates).
2,000 mg (about 1 teaspoon of salt) is the WHO and Singapore HPB limit. Use your doctor's number if they gave you a lower one.
The protein ring aims for 130 g a day. The fat ring aims for 25% of this goal, and carbs get the rest (207 g at 1,800).
The same secret as your Wallet and Exercise apps. With it, every meal is backed up to your Supabase database and shows on every device where you enter it. Without it, meals stay on this phone only.
When the AI recognises a dish or drink from HPB's list, Calo uses HPB's measured numbers for it, scaled to the portion the AI sees. Tap a meal to see which HPB dish it used.
Get a free key at aistudio.google.com/apikey. The key is saved in this phone's local storage only — it is never part of the hosted file and never sent anywhere except directly to Google.
Used automatically if Gemini fails or is rate-limited. Free key, no card, at openrouter.ai/keys.
Free vision model names on OpenRouter rotate — check openrouter.ai/models (filter Input: Image) if the default stops working.
Only used if both Gemini and OpenRouter fail. Needs the small Worker in /worker deployed once — see worker/README.md.
Reading your plate…