Nutrition Facts
If the nutritional information is already printed on the package, why search for the same information in a database?
01 · Nucleus
A personal health companion for tracking food, workouts, body measurements and recovery — built from scratch with AI.
02 · The problem
I eat many of the same meals every day. Existing food trackers made me search and log the same things repeatedly.
I wanted to save my regular foods once and log them in seconds.
03 · Thinking bigger
Food was only one part of what I wanted to understand.
I also wanted to know how I was training, how my body was changing, and whether I was actually ready to train.
What started as a food tracker became Nucleus.
04 · Meet Nucleus
Meet Nucleus
Nucleus brings together the data already being collected through Apple Health and turns it into something more useful than a collection of numbers.
Can I train today?
Your body has bounced back. A hard session will pay off today.
This is the app's real scoring from HomeScores.swift. Each signal is compared with my own 30-day normal, not a population average.
05 · Idea to MVP
I'd never built an iOS app before.
One app for food, training, body and recovery — one that logs my usual meals in a tap.
Structure before style: what each screen answers, which data it needs, how the tabs connect.
File → New Project. My first “app” was Xcode's template: a list of timestamps.
First real data — my own steps, sleep and heart rate, read from Apple Health.
Meals and workouts saved on the phone with SwiftData. No backend, no account.
A camera that opened itself eight times at once. Every bug taught me how SwiftUI actually behaves.
Briefing, food, workouts and trends — running on my own phone.
I used AI to remove the barrier between knowing what I wanted to build and actually building it.
06 · Workflow
Not a list of tools — a loop. Every feature in Nucleus went round it, usually more than once.
Figma when I needed it, or just the idea in my head. I always started from what it should feel like to use — never from the code.
Plain language, plus the one constraint that mattered. The clearer the ask, the closer the first build.
I read every change, even when I didn't fully understand it yet. These are the real lines that render “previous” in the app today.
// ActiveWorkoutView.swift · SetRowViewprivate var previousLabel: String? { prior.map { "\(weightString($0.weightKg))kg × \($0.reps)" }} Text(previousLabel ?? "—") .font(AppFont.mono(12, .medium)) .foregroundStyle(AppStyle.txt3)
On my own phone, in the gym, between sets. Not in the simulator — that's where the real problems show up.
Logging food from a photo kept failing — the same reply every time. This is the real error from June.
Not just “fix it” — “explain it”. That one word is how I actually learned.
Once I understood the cause, the fix was one sentence. Then straight back to the top of the loop.
07 · Feature 01 — Food
Design decisions · Feature 01 — Food
If the nutritional information is already printed on the package, why search for the same information in a database?
I eat the same meals frequently, so I wanted to save them once and reuse them.
08 · Feature 02 — Workout
Feature 02 — Workout
While using the app during a workout, I realised that recording my current set wasn't enough.
I wanted to know what I had done the last time I performed the same exercise.
Try it on the phone: type a heavier weight or one more rep, then tick set 1
09 · Designing for myself
I started writing down feedback while I was actually working out.
Not after the session.
During it.
10 · Performance
Ticking off a set, switching tabs, opening a meal — the screen just stopped. Feel it. Tap both buttons.
The freeze on the left lasts as long as my first real hang report: 2.57 s.
iOS was writing hang reports and I couldn't read them. These are the real ones from that night — up to 9.24 seconds of a frozen screen.
One line for every tap, every screen redraw, every database read. For the first time I could see what the app was doing when I touched it.
The main thread is the one that draws the screen. Mine was also re-reading my entire history on every tap — so the screen had to wait its turn.
The heavy work moved to the background. Results got cached, and only recompute when something actually changes.
Same phone, same data, same history. The difference is what the main thread is allowed to do.
Scroll back to step 01 and tap After — that's how it feels now.
The real lesson
I didn't know what was wrong, so I learned enough to find out.
11 · Not every idea survived
Not every idea survived
Product lesson
Good UX isn't about fitting every useful idea into the product. Sometimes it's knowing what not to ship.
12 · Finally, UI
I designed last, on purpose. By the time I touched the visuals, every screen had already been used, broken and rebuilt.
Built from last night's HRV, resting heart rate and sleep, each compared with your own 30-day normal.
Daily average · last 7 days
The interface prioritises useful data over decoration.
Nothing exists simply to make the app feel “fun.”
Important information should be understood at a glance.
Animation exists to communicate state and relationships.
Greyscale by default · one accent · three status colours · gold only for records. Click a swatch to copy it.
13 · The evolution
QUICK ADD
NUTRITION
Could not estimate nutrition. Enter values manually.
TODAY'S GOALS
RECOVERY & READINESS
The first version worked. It just wasn't very good yet.
14 · Today
Nucleus started as a small experiment to make food logging easier.
It became a personal system for understanding how I eat, train and recover.
And somewhere along the way, it taught me something much more valuable:
I don't need to know everything before I start. I need to know how to figure things out when I get stuck.
15 · Takeaways
AI lowers the barrier. It doesn't replace thinking.
Real usage exposes problems prototypes can't.
When I don't know something, I learn enough to solve it.
MKU SalesPro · MKU Website Revamp
Browse projects60 Minutes to Ship: How a Sleeping TV Sparked a Better Event Experience
Read postsMonday, 12 October
Your body has bounced back. A hard session will pay off today.
HRV is up at 138 ms and you slept 6.9 h. Recovery looks strong — a good day to push for progression.
Monday, 12 October
HRV is up at 138 ms and you slept 6.9 h. Recovery looks strong — a good day to push for progression.