testflight beta. the period is penciled in.
Coached, not scolded. A protein floor instead of a calorie ceiling, logging that takes a sentence, and a coach that has actually read your day — built as separate native iPhone and Android apps for people on GLP-1 medication.
a floor, not a ceiling.
On a GLP-1 the goal flips. The medication already handles eating less. The hard part is eating enough: enough protein to hold on to muscle while the weight comes off. Every nutrition app I tried was built for the opposite problem — a calorie ceiling, a red number when you go over, a streak that breaks the first week your appetite disappears. Every other app draws a ceiling. This one draws a floor.
That number — the minimum grams of protein to clear each day — is your protein floor. It's the only number Footing celebrates. A missed day is never called a failure, a partial diary stays "unknown" rather than becoming a confirmed miss, and the coach never shows you a gap without a path to close it.
a footing: the base poured beneath a floor.
The name is the same idea. A footing is the base poured beneath a floor so nothing above it sinks. Most apps in this category are named after the medication. This one is named after the work.
People using GLP-1 medication (semaglutide, tirzepatide and the like) who need help eating enough protein and calories without judgment-heavy tracking — and who want a coach that understands the weekly injection cycle, the days the appetite comes back, and the days it doesn't.
three pieces: today, logging, pulse.
Footing has three pieces: a Today screen built around the floor, four ways to log a meal in seconds, and Pulse, the coach. Everything else — the shot cycle, Progress, goals, widgets, Siri — hangs off those three.






Pulse is a cornerman, not a drill sergeant, a cheerleader or a doctor. The persona has a non-shaming rule — never make anyone feel guilty for being on the medication, never imply the medication does the work alone — and a short list of banned words (cheat, guilt, failure, willpower). The medical boundary is fixed: Pulse never advises a dose or a schedule change. It reminds you of yours. Diagnoses, side effects, interactions and "is this normal?" all redirect up front rather than being answered halfway first.
the medical boundary never moves.
claude writes the words. swift decides the wins.



727 jvm tests, most of them ios tests rewritten in kotlin.
Footing started in Base44 in March 2026, paused, and was rebuilt in May as my first fully native Swift app. The biggest architectural fork was going local-first: SwiftData as the on-device cache with Supabase as the source of truth, so logging works on a plane and syncs later. The bundle identifier still carries the old NutriPulse name so existing installs and the widget's App Group survived the rename.
Android followed on August 1 as a separate Kotlin and Jetpack Compose client sharing the same backend, not a cross-platform wrapper. The turning point was a report from an Android tester that logging a dose was unreachable — the action lived only on the "due" card. That became a parity audit against iOS with a ranked gap list, and then a full port of the Daylight redesign, screen by screen. The Android app now carries 727 JVM tests, most of them the iOS logic tests rewritten in Kotlin.
Porting turned out to be the best code review iOS ever got. Rewriting each screen surfaced data-correctness bugs that had lived on iPhone for months — body goals overwriting stored values, search's "+" logging a different portion than the row described — and both platforms got the fixes the same week.
all of the motion switches off under reduce motion.
At the end of September every screen was redrawn in a direction I called Daylight: a bright tiled layout on a cool neutral ground, white tiles with soft radii, a deep indigo hero tile, lime for wins and the Log button, sky blue for water. Bricolage Grotesque for display and numbers, Figtree for body. Tiles spring in, the protein tile fills like liquid, numbers count up — and all of it switches off under Reduce Motion.
The redesign also settled the brand's cast. Footing is the product. Pulse is the coach, drawn as a faceless ring with a fixed signature node whose geometry carries its state (ready, listening, thinking, coaching). Cove is the companion — a small sculptural character who observes and accompanies but never delivers advice. Cove became the dot of the i in the wordmark and the face of the app icon in 1.3.3, and greets you on the first onboarding screen in 1.3.5.



build number = commit count.
Build numbers equal the commit count, so the TestFlight history reads like a changelog: 1.3.0 (build 183) in mid-September, 1.3.1 (286) on October 1 with Daylight, then 1.3.2 through 1.3.5 (296 to 300) between October 19 and 21. Three of those versions landed in one evening, driven by two tester screenshots: a usual-meal Save button that looked inactive because the name field started empty, and a "shot marked as skipped" card that couldn't be dismissed.
The same week a tester hit a crash opening Profile. The cause was stack exhaustion from one enormous SwiftUI view — the root view's value was 30,648 bytes — and the fix restructured it down to 88. The 1.3.5 release runs 498 unit tests plus three UI walkthroughs, with backend contract suites running the real Postgres migrations against two authenticated users and an anonymous one.
effortless in. honest but actionable. earned celebration.
Honesty is what makes celebration mean something. The product spine was written before the first screen: effortless in, honest but actionable, earned celebration. The hardest of those was the middle one — the discipline of never showing a number without a next step — and it's the one testers mention.
Consent is product work, not paperwork. A pre-submission audit against App Store guideline 5.1.2 found that Talk to Log sent text to a model with no explicit consent of its own. Fixing it meant a second consent flow, a server-side gate that fails closed, and a coordinated backend rollout, because older builds couldn't parse until the new app granted permission. It also made the privacy disclosure better copy than it had been.
A second platform is a mirror. The Android port found more iOS bugs than any test suite had, because rewriting a screen forces you to say what it actually does.
And a few smaller ones that cost real time: the build number had silently been 1 on every build until a script derived it from git; a concurrent notification-scheduler race could leave the Monday reminder unscheduled; and Apple's hosted Xcode couldn't type-check the giant SwiftUI bodies that the local one accepted, which is how two views got split.
oct 20 audit. the list is short now.
Footing is in a closed TestFlight beta, and a read-only readiness audit on October 20 said "not ready to submit." The list is now short:
Started in Base44. Rebuilt native — once in Swift, then again in Kotlin. The second rebuild fixed the first.