- Client
- Kalo (our own product)
- Role
- Product Design, Brand & iOS / watchOS Development
- Timeline
- October 2026 · TestFlight beta
- Year
- 2026
- Category
- Mobile App
Overview
Kalo is our own health app for iPhone and Apple Watch. It puts food logging (Eat), training (lifting, runs and sports games) and recovery (sleep, steps, heart rate from Apple Health) in one place, and sums up each day as a single 0–100 Day Score: a three-arc ring for Eat, Move and Recover, scored against your own goals so it rewards consistency rather than volume.
It is local-first. Every log lives on the phone and works offline, the food database ships inside the app, and Apple Health and the watch are designed to stay in step without writing anything twice. Kalo is in TestFlight beta: eight builds were uploaded to TestFlight between 19 and 23 October 2026. It is not on the App Store yet. The screens on this page are iOS and watchOS simulator captures with demo and test data.
Why
We wanted one health app for people who eat, lift, run and play: one place to log, one number for the day, and no paywall on the basics. The usual setup is a food app, a gym app, a run app and Apple Health underneath, each with its own idea of how the day went.
Kalo is our own product, so it is also how we prove our mobile and wearables work end to end: brand, product design, an iPhone app, a native watch app and the Apple Health plumbing between them.
The challenge
People who eat, lift, run and play sports end up with three or four apps: one for food, one for the gym, one for runs, and Apple Health underneath. None of them says how the day went as a whole. Kalo had to fold all of that into one app, keep working in a gym with no signal, and stay in step with Apple Health and the watch without writing anything twice.
What made it hard
- Food, gym, runs and sleep usually live in separate apps, and none of them says how the whole day went.
- Gyms and long runs have bad signal, so logging could not depend on a server.
- Apple Health, the phone and the watch all record the same workouts and steps. Summing them naively double-counts, and writing back naively loops.
- A watch app has a tight CPU and complication refresh budget, and it has to keep logging when the phone is out of reach.
- Most fitness open-source code is GPL and the best open food data is ODbL, which does not fit a product we intend to sell.
Approach
One daily number first, then everything that feeds it. All of the maths (Day Score, plan engine, nutrition, GPS, entitlements) lives in a pure TypeScript package with no React in it, so it is unit-tested on its own and shared by every screen. The phone keeps one versioned local store; the watch, Health and the Cloud Function are clients of it.
The look is dark and warm: a near-black background, warm off-white text, apricot for Eat, lime for Move and lavender for Recover, Instrument Serif for headings and numbers and Geist for interface text. The background glow shifts with the time of day.
Process
- Decide the stack: Expo and React Native, local-first storage, and a written licence policy (MIT, Apache, BSD or Unlicense code only; GPL projects as reference; ODbL data kept in its own store). Recorded as ADRs on day one.
- Brand and the ring: Renamed from the working name Motor to Kalo, chose the type pair and built the three-arc Day Score ring that every screen grows out of.
- Eat, Train, Recover: Food logging with a bundled USDA database, live lift sessions, GPS runs, a plan builder, sleep, body and the muscle map, each with a separate review pass.
- Apple Health: Two-way sync with de-duplication by design, then a review that caught a stale-state bug which would have written duplicates to Health.
- Apple Watch: A native SwiftUI app: home, quick log, live workouts and WidgetKit complications, linked to the phone over WatchConnectivity.
- Ship to TestFlight: Local Xcode archive and upload, eight builds from 19 to 23 October 2026, with over-the-air JavaScript updates between them.
What we built
- Day Score home: A 0–100 score drawn as three arcs (Eat, Move, Recover). Swipe and the arcs morph into the Fuel bars and the Body columns. A pace chip compares today with your usual at this hour, and a long press opens a quick log for food, water, sleep, weigh-ins, games and more, back-dated up to 14 days.
- Eat: 11,993 USDA FoodData Central foods ship inside the app with macros and 23 micronutrients, so search works offline. Barcodes look up Open Food Facts on tap, kept in a separate store. Saved meals, recipes, a shopping list by aisle and custom targets with a weekly pace.
- Lift: Live sessions with weights prefilled by double progression, a rest timer with haptics and voice, plate maths, supersets, effort per set and live PR badges. Each of 83 built-in lifts has a looping animated figure and a written how-to.
- Run and plan: GPS runs with auto-pause, spoken splits and locked-phone recording, plus structured planned runs. A plan builder makes one weekly plan across lifting, running and sport, and every choice can answer “Why?” from the answers that caused it.
- Recover and body: Sleep with stages and sleep debt, mood and stress check-ins, recovery work, sick days that hold your streak, body fat, progress photos with a ghost overlay, and a front and back muscle map that shows what is fresh and lets you tap in soreness.
- Apple Health, both ways: Kalo reads sleep, weight, body fat, resting heart rate, HRV, steps and other apps’ workouts, and writes its food, water, weigh-ins, sleep, workouts and runs. Edits and deletes carry over. Verified in the simulator in both directions.
- Apple Watch: A native SwiftUI app: the ring and serif score on the home screen, a quick log page (a glass of water or a recent food in one tap, with Undo), live workouts with heart rate and energy, and WidgetKit complications (the corner style is shown here). Verified in the watch simulator; real-watch testing is next.
- Streaks and rewards: A day streak with milestones and confetti, a full-screen reward after any log, and reward marks on workout and run summaries. Motion follows the system reduced-motion setting.
How it was built
An npm workspace holds three packages: the Expo / React Native app, a pure TypeScript core with all the domain logic, and the Firebase functions. The phone keeps one versioned document in expo-sqlite, so logging never waits on a network. 11,993 USDA foods ship inside the app; Open Food Facts barcode data is fetched on tap and kept in its own store because of its licence. The one AI feature, Snap a meal, sends a photo to Claude vision through a Firebase Cloud Function with daily caps; it is deployed but has not yet been tested on real meal photos, so we make no accuracy claim.
The watch app is native SwiftUI, generated into the Xcode project at prebuild, with WidgetKit complications and HKWorkoutSession for live workouts. The phone is the single source of truth and talks to the watch over WatchConnectivity: live messages when the phone is reachable, queued transfers when it is not. Every feature had a separate review pass, and the gate before build 8 ran 1,032 logic tests. Health sync, the watch app and GPS have been verified in the simulator; real-device checks are the next step of the beta.
Stack
- Expo SDK 58 + React Native 0.88: iPhone app, Expo Router, React 19
- TypeScript core package: Day Score, plan engine, nutrition, GPS
- expo-sqlite: Local-first store, works offline
- SwiftUI + WidgetKit: Native watchOS app and complications
- HealthKit: Two-way sync, live workout sessions
- WatchConnectivity: Phone ↔ watch link
- Reanimated 4 + react-native-svg: Rings, figures and motion
- Firebase: Auth (Apple, Google, email), one Cloud Function
- Vitest: 1,032 logic tests
Outcomes
- 8: TestFlight builds, 19–23 October 2026
- 11,993: USDA foods bundled for offline search
- 1,032: Automated logic tests passing before build 8
- 87% → 0.07%: Watch log page idle CPU, before and after the fix (simulator)
Wins
- One iPhone app for food, lifting, runs, sport and recovery, summed up as a 0–100 Day Score.
- Local-first: logs and an 11,993-food database live on the phone and work offline.
- Apple Health sync in both directions, designed so nothing is double-counted or re-imported.
- A native SwiftUI Apple Watch app with live workouts, one-tap quick log and complications.
- Eight TestFlight builds uploaded between 19 and 23 October 2026, each feature with a review pass.
Hard parts
- Counting steps once: The phone, the watch and other wearables all write steps to Health. Kalo reads Health’s own de-duplicated statistics instead of adding up raw samples, tags every sample it writes with its own id so the importer skips it, and links the watch’s workout by its Health id so it is never saved twice.
- A bug review caught first: A sync that re-ran straight after saving read stale state and would have written duplicates to Health. The fix keeps an overlay of what was just sent. A second fix stops a locked-phone query error from wiping imported data.
- A watch that sits still: The watch log page was re-rendering every frame and used about 87% of a CPU core while idle. After the fix it used 0.02 seconds of CPU per 30 seconds. Measured in the watch simulator; real-watch numbers come next.
- Respecting the complication budget: watchOS rations complication refreshes. Logs reach the watch at once, but step-only changes are sent at most every 10 minutes, so the budget goes on changes people notice.
- Licences for a product we sell: Most fitness open source is GPL. We only copy MIT, Apache, BSD or Unlicense code, use GPL projects as reference, and keep ODbL food data apart so the combined database stays ours.
Services
- Product Strategy & Brand
- Expo / React Native iPhone App
- Native SwiftUI Apple Watch App & Complications
- Apple Health Two-Way Sync
- Local-First Data & Offline Food Database
- Firebase Auth & a Cloud Function