Work
G3 — a family health app, built local-first
SwiftUI and SwiftData on iOS, with no server and no account. An exercise in how much discipline a one-person app can carry.
A private iOS app for one household: cycle tracking for several members, a journal behind its own PIN, and medical appointments with practice contacts. About 6,000 lines of Swift across 48 files.
Why it exists
My daughter started tracking her cycle, and every app I looked at was built for one adult user and sent her data somewhere. I wanted something that held two people’s data, on the device, and nowhere else.
The parts worth talking about
One roster, different features per person. Cycles, Journal and Appointments
each started with their own idea of who “the family” was — three lists that
quietly disagreed. They now share a single Profile model carrying per-feature
flags, so adding a grandparent who only needs appointments is one row, not three.
Booked versus needs-booking. The appointment model separates a confirmed slot from care that is merely due, because they need completely different notice: a booked slot wants a nudge two days out, while an annual physical needs three months’ warning to get into the diary at all. Most of the perceived usefulness of the app comes from that one distinction.
Unverified data stays flagged. Clinic phone numbers carry a isVerified flag
and a note on why a lookup was uncertain. Showing an unchecked number as fact is
how someone ends up calling the wrong clinic about a mammogram.
Verification
266 assertions over the cycle prediction, appointment planning, journal filter and PIN policy logic, running under the plain Swift toolchain with no simulator or SDK. The README splits what was verified by running it from what was not — the Face ID path, CSV export and the photo picker are explicitly untested, and saying so is more useful than implying full coverage.