Get in touch
Product Design · iOS + Web

A two-app nutrition system — a member app and a coach app — that turns daily logging into one calm, glanceable ritual. The member owns their data in their own CloudKit; the coach only ever sees the one snapshot the member chooses to share.

iOSSwiftUICloudKitWebDesign systemPrivacy-first
Product design · iOS · Web · Design systems · Privacy-first
Role
Designer and builder. I owned the product framing, the privacy-first data architecture (member-owned CloudKit + one opt-in coach snapshot, published as a single Codable value over a coalesced CloudKit write; a SvelteKit + Supabase + Stripe web layer for coach seat billing), the design-token system (a warm semantic palette plus a five-state verdict scale, light and dark from day one), the component library (Liquid Glass cards, the protein ring, the metric grid, the quick-add), and every screen across onboarding, logging, trends, the coach app and billing.
Project type
Two-app nutrition system · iOS + web
Featured outcome
Two apps , Member + coach, one system

pacer is a nutrition and training system for people who want to hit a protein floor, stay in a calorie target, respect an eating window, and train — without the app becoming a second job. It pairs a member app with a coach app, and the privacy model is the point: the member's log lives in their own CloudKit private database, and a coach only ever sees the one snapshot the member opts to share. Coach seat billing runs in a SvelteKit + Supabase + Stripe web layer, alongside a live web app so anyone can pace their day in a browser today. It is deliberately built for the GLP-1 moment — when appetite drops, protein has to be defended, so the app raises the protein floor to at least 2.0 g/kg the instant a member marks themselves on a GLP-1.

Pacer: hero showcase
Problem

The challenge

Most tracking apps confuse logging with insight. They ask for a lot, give back a wall of numbers, and make the daily ritual feel like data entry. The real problem was attention: the user needs to know, in one look, whether today is on track, and to fix it without thinking. And a nutrition day is not one thing — it is macros, an eating window, training, supplements and a GLP-1 schedule — usually scattered across four or five separate tools that never agree on a verdict, a colour or a dark mode.

Pacer: problem visual
Research

Discovery & research

pacer started from a familiar failure mode — trackers that bury the one number you came for and turn logging into data entry. Discovery was about what makes a daily ritual stick, what a glanceable 'am I on track?' answer actually needs, how to fold nutrition, fasting, training, supplements and coaching into one system without the bloat, and — for the GLP-1 era — how to keep the member's data theirs while still letting a coach help.

Competitive teardown (nutrition trackers)Jobs-to-be-done framingFood-data sourcing (USDA + Open Food Facts)Two-sided coach↔member data modellingGLP-1 nutrition study (protein-floor logic)iOS 26 / Liquid Glass platform study
What I found · 06
01 Logging dies the moment it feels like data entry

Most trackers ask for too much per meal, so the habit never forms. The bar I set was a daily ritual you can complete in roughly two taps, which meant designing logging as fast search-and-confirm, one-tap quick-adds and a barcode scan — not a form, and deliberately not a photo-macro guess that would trade a believable number for a magic one.

EvidenceBuilt as a search-or-quick-add flow on the Today dashboard, with a barcode path into Open Food Facts; the only photo a meal carries is an optional downscaled thumbnail attached on save, never a source of macros.

02 People want a verdict, not a number

'96 g protein' makes the user do the maths. The same figure as a coloured ring, a '44 g to go', or a green-to-red calorie-balance card answers the question they actually have — am I on track right now? So every number is rendered as a judgement, and the judgement is a five-state scale (under-eating, healthy deficit, maintenance, slightly over, over) rather than a naive good/bad, because under-eating is a failure too.

EvidenceThe Today screen leads with the protein ring and a state-coloured calorie-balance card; five verdict states, each a token with paired light/dark values and a darkened text variant, all held above WCAG AA by an automated contrast suite in both themes.

03 The day is split across four or five apps

Nutrition, fasting, training, supplements and a GLP-1 schedule usually live in separate tools that never share a verdict or a theme. Discovery scoped one system that carries all of it, so the design problem became density-without-clutter rather than feature breadth — one Liquid Glass vocabulary applied to every domain.

EvidenceFasting window, training plan, supplements and a GLP-1 dosing schedule all live in the one member app, assembled from the same component library and the same tokens.

04 Food numbers have to be both fast and trustworthy

A tracker is only as good as its food data — the 'verdict' colour is meaningless if the grams behind it are guessed. So search rests on a credible, comprehensive source, and the barcode path resolves to a separate open database, with each item tagged by provenance so the app always knows where a number came from.

EvidenceSearch backed by USDA FoodData Central; barcode lookups resolve against Open Food Facts; every food item carries a source tag (bundled / USDA / Open Food Facts).

05 The GLP-1 era changes the nutrition brief

On a GLP-1, appetite falls and the risk shifts to losing muscle inside the deficit — so protein has to be actively defended, not just tracked. I designed the targets engine to lift the protein floor to at least 2.0 g/kg the moment a member marks themselves on a GLP-1, regardless of their goal, so the number the ring is chasing is already correct for their situation.

EvidenceA GLP-1 schedule in the member app, and a targets engine that clamps the protein floor to a minimum of 2.0 g/kg of bodyweight while a GLP-1 is active.

06 Coaching is usually bolted on — and usually over-shares

Most apps treat the coach side as a separate, inconsistent product, and quietly give the coach a live window into everything the member does. pacer models coach and member as one design language but keeps the data member-owned: the log lives in the member's own CloudKit, and the coach receives only the one snapshot the member opts to share. On that shared record each side is a strict single-writer — the coach writes back only to reserved coach-owned keys (billing, bookings, invoices today; assigned plan and note staged next), never the member's own fields, so nothing the member logs can ever be overwritten.

EvidenceA dedicated pacer coach app; member-owned CloudKit data published as one opt-in Codable snapshot; a field-scoped no-clobber merge on the shared record; and coach seat billing plus a studio roster in the SvelteKit + Supabase + Stripe web layer — all under one design language.

Process

How I approached it

I built pacer the way you build a system, not a screen. First a token layer: a warm, semantic colour set with paired light and dark values, and on top of it a five-state verdict scale that drives the calorie-balance card. Then a component vocabulary — the Liquid Glass card, the protein ring, the metric tile, the quick-add — so every screen is assembled from the same parts and flips to a fully designed dark mode for free. The food numbers sit on real data (USDA FoodData Central for search, Open Food Facts behind the barcode) so a verdict colour can actually mean something. And the whole thing is wrapped in a privacy-first data model where the member owns their log and shares exactly one snapshot.

01

Defined semantic colour tokens — a warm palette, paired light + dark, plus a five-state verdict scale for the calorie-balance card

02

Built a Liquid Glass surface and a small component library on top of it — protein ring, metric tile, quick-add

03

Designed the Today dashboard around one hero: the protein ring, with a state-coloured verdict card beneath it

04

Reduced logging to fast search-and-confirm, one-tap quick-adds and a barcode scan — never a form

05

Sourced trustworthy food data (USDA FoodData Central + Open Food Facts) so the verdict colour rests on real numbers

06

Modelled a privacy-first data layer: member-owned CloudKit, one opt-in snapshot to the coach, seat billing in a SvelteKit + Supabase + Stripe web layer

Pacer: process visual
Pacer: key decision visual
Challenges

Trade-offs

The hard part was density without clutter. A real nutrition day has a lot in it — macros, an eating window, training, supplements, a GLP-1 schedule, coaching — and the screen had to carry all of it and still feel calm enough to read in a queue. Underneath, the privacy model had to let a coach be genuinely useful without ever giving them a live window into the member's raw log.

Pacer: solution detail
Solution

Final direction

The result is a single, glanceable system across surfaces. The Today screen leads with the protein ring and a state-coloured calorie-balance card; logging is fast search-and-confirm, one-tap quick-adds and a barcode scan — no forms, no photo-guessing. Trends, schedule, billing, the coach app and the web app all speak the same Liquid Glass language, and because everything is token-bound, every surface flips to a fully designed dark mode in one switch. Underneath sits the real design contribution: the member's data stays in their own CloudKit private database (SwiftData locally, roughly eighteen @Model types under CloudKit-safe conventions), and only a single opt-in snapshot — one Codable value, pushed on change over a coalesced CloudKit write — ever reaches the coach. On that shared record, member and coach are strict single-writers: each writes only its own reserved keys, never the other's fields, so a coach's write-back can never clobber the member's log (a field-scoped no-clobber merge; the shipped write-back path today is the coach-owned billing, booking and invoice keys, with the assigned-plan-and-note loop staged as the next phase). Coach seat billing and the studio roster run in the SvelteKit + Supabase + Stripe web layer, with entitlement tiers for solo freelancers and multi-coach studios.

Pacer: final solution visual
Impact

Outcomes

pacer is a real system, not a flat mock-up. The web app is live at app.pacerfitness.com — anyone can pace their day in a browser today — while the two native apps (member and coach) are in TestFlight, built and running, with onboarding, a USDA-backed food database with barcode lookup, fasting, training, supplements, a GLP-1 schedule, and the CloudKit + opt-in-snapshot privacy model. The design contribution is the architecture underneath: member-owned data by default, one deliberate share to the coach, a strict single-writer merge on the shared record, seat billing in the web layer, and a token-first system where coherence and a genuinely first-class dark mode are structural — computed and contrast-tested — across iOS and web.

Two apps
Member + coach, one system
Member-owned
CloudKit · one opt-in snapshot
Live web app
app.pacerfitness.com
iOS 26
Liquid Glass system
Pacer: metrics visual
Across devices

One system, every screen

The Today dashboard — protein ring and state-coloured verdict card, the whole day in one glance.
iPhone 17 ProThe Today dashboard — protein ring and state-coloured verdict card, the whole day in one glance.
The same token system on a larger canvas — Liquid Glass cards laid out two-column.
iPad Pro 13″The same token system on a larger canvas — Liquid Glass cards laid out two-column.
Today, wide — trends, schedule and logging sharing one coherent surface.
iPad Pro 13″Today, wide — trends, schedule and logging sharing one coherent surface.

Every number should also be a verdict.

Jonathan Pace Product design · iOS · Web · Design systems · Privacy-first
Pacer: final showcase
Takeaway

A tracker is not really about tracking. It is about answering one question — 'am I on track right now?' — fast enough that the user keeps coming back. Every decision in pacer, from the protein ring to the five-state verdict scale to the single opt-in snapshot, exists to make that answer instant and that trust unbreakable.

Next project

The Estate

lexicon defines the design language once — an OKLCH-derived token architecture with a React library, a Tailwind preset, a Figma plugin and a CLI conformance validator. The four public sites are its cross-platform proof: parlancelabs.net, thepace.io, pacerfitness.com and thepace.me, each running the same token discipline, each wearing its own accent and voice.

Open case study