I know exactly how my fitness attempts end, because I’ve run the experiment many times.

It goes like this: high motivation, then two or three months of excellent training. Then work gets loud. I sleep badly for a week. One session doesn’t happen, then two. The plan still says Tuesday: intervals, and now it’s also silently saying you’re behind. So I plan to restart properly on Monday. Some Monday, months later, I do.

Every app I’ve used was designed for the person in the first two months. None of them had a plan for the person in week nine.

So I wrote down everything I actually wanted, as a long spec, and built Still Here: a personal training, recovery and cognition app for exactly one user, me. Its home screen opens with the sentence I needed to hear on every one of those Mondays:

Still here. What’s today’s move?

Still Here: the coach (demo data)
the coach
Still Here: today (demo data)
today
Still Here: the plan (demo data)
the plan
Still Here: trends and continuity (demo data)
trends and continuity

Screens from the app’s built-in demo data.

Three ideas

The whole app answers to three sentences from the spec. Everything else is detail.

  1. The app is not trying to make me complete a plan. It’s trying to learn how much training, and how much of a calorie deficit, my body and brain can productively adapt to.
  2. The failure condition is not a missed workout. It’s a temporary disruption turning into long-term disengagement.
  3. It doesn’t assume how much sleep I need. It measures what sleep does to my brain, body, recovery and performance, and learns from that.

That first sentence changes what an app is. A plan app is a to-do list with dumbbells on it. This one is closer to a loop: plan → do → measure → learn → adapt.

Stress is stress

A training plan usually lives in its own little world, as if the only thing that tires you out is the gym. But your body doesn’t keep separate accounts. Training is stress. So is a calorie deficit, a short night, a brutal week at work, worry, illness.

Still Here treats them as interacting loads. Every morning there’s a check-in that takes about 45 seconds: sleep, energy, mental clarity, stress, soreness, joint pain, and how demanding life is today, from unusually easy to brutal. From that, and from my own history, it works out readiness (green, yellow or red) and decides whether today’s session stays as planned, gets trimmed, gets softer, becomes easy recovery work, or becomes rest.

The rules are explicit and boring, which is the point. For example: a brutal workday, plus sleep well below my normal, plus a hard session yesterday, means no hard session today, whatever the calendar says. And every change is explained, in numbers, one tap away:

Today’s workout was reduced because sleep was 5h 12m, resting heart rate is up 8 bpm, soreness is 7/10 and life load is high. Try a 30–45 minute easy walk instead.

I’m always in charge. There are buttons for Easier, Harder and Rest, and every override is logged, so one day I can find out whether my overrides were good decisions.

Continuity, not streaks

This is the part I care about most.

Streaks are a trap for someone like me. They feel great for sixty days, and then one bad week breaks them, and a broken streak feels like permission to stop. So Still Here doesn’t count streaks at all. It measures continuity:

  • how many of the last twelve weeks had any meaningful activity,
  • how long the longest gap was,
  • and my favourite: how long it takes me to come back after a disruption.

That last number is the one I want to see shrink.

To protect it, the app has modes. Normal is the planned session. Compressed keeps the core of a strength session in 25 minutes when life is heavy. Survival is for the weeks that are pure chaos: a ten-minute walk, one set of each big movement. Survival days count as success, and the app says so, because keeping the thread is the whole game.

The app also watches for the early signs of the collapse: a first skipped session, then a second within a week, check-ins getting patchy, work stress and bad sleep rising together. When it sees them, it shrinks the plan before I drop out, not after:

You seem to have had a busy week. I’ve simplified the next three days. No catch-up required.

And when I do disappear for two weeks, there’s no “restart Monday” and no guilt. There’s a re-entry block at a sensible fraction of what I was doing before, available right now, on a Wednesday afternoon if that’s when I come back:

Welcome back. 17 days since the last session. No need to catch up. Today: 25 minutes of easy full-body strength. We rebuild from here.

The words matter, so the app has rules for them. Nothing is ever failed, missed or broken. A skipped day is data, not a moral event. It’s a recovery day, a compressed session, life load high. No “You’ve got this!”, no confetti for doing a Tuesday. It talks like a dry, warm friend who happens to read sports-science papers.

The brain is a first-class citizen

My work is thinking: programming, reading, building things like this site. I can’t spend eighteen months getting fitter while being mentally wrecked by dieting and overtraining. So cognition isn’t a nice-to-have in Still Here; it outranks fat loss.

The app tracks mental clarity and focus against my own baseline, not a population average. If clarity drops for days while weight is falling fast and sleep is poor, it flags possible under-recovery and shows the evidence, instead of cheering the number on the scale.

It also assumes I’m an unreliable narrator. “I feel fine” is not proof of recovery. People are famously bad at judging their own sleep debt. But one bad reading from a gadget shouldn’t overrule a great day either. The useful conclusions come from signals agreeing with each other: how I feel, how I perform, and what the numbers say.

Sleep: learned, not assumed

Most apps grade sleep against a fixed rule: eight hours good, six hours bad. I honestly don’t know how much sleep I need, and neither does the app, yet. So instead of grading, it watches what happens after different nights: next-day clarity, afternoon sleepiness, how hard training felt, resting heart rate. Over time it can say something useful, like “after 5.5–6 hours, mornings are fine but afternoons are 30% sleepier and workouts feel harder”, which beats “you only slept six hours”.

It also looks at regularity, not just duration, and at the classic pattern of several short nights followed by a twelve-hour crash. The phrasing is always associations, not causes.

Safety, and what it won’t do

This app influences how hard I push, so it has to be careful where it matters. Before readiness or adaptation gets a say, a safety gate runs first, and its answer caps everything else. Red-flag symptoms like chest pain, fainting or severe breathlessness stop all training content and show a plain, calm message: stop, and get checked. High blood-pressure readings rule out hard sessions or all training, depending on how high. Vigorous work waits until a clinician has signed off.

It is not a doctor. It doesn’t diagnose, it doesn’t interpret test results beyond simple ranges, and it never suggests changing medication. That belongs to my clinician. Safety copy follows its own rule: no jokes near chest pain.

A small clay coach

The app opens on a little clay character called Mochi (mine is called Leo). It speaks first, one thing at a time, then gets out of the way. The charts and tabs are behind it in what the app calls the engine room.

The coach is where AI comes in, and it’s deliberately fenced off. A deterministic director decides what moment it is (safety first, then welcome-back, check-in, today’s plan, a weigh-in, the evening wind-down) and what the buttons under the message do. A language model only writes the words, in the app’s voice, with my own key. It can’t invent a flow, skip safety, or make a button do something other than what it says. The model writes; the app acts. Without a key, built-in templates take over and nothing breaks.

There’s also a way to get a second opinion. The Plan tab can export a brief, weeks of data in one document, to hand to ChatGPT, Claude or anything else. You can paste the reply back, and the app checks every suggested change against its own rules, marking each one fits the rules, careful or refused, with reasons. Accepted changes are logged with who suggested them, and each can be undone.

Mine, on my phone

Health data is the most personal data there is, so Still Here is local-first. There’s no server, no account and no sync. The phone is the machine.

The database is encrypted with a key kept in the Android Keystore. Every day it writes an encrypted backup (AES-256-GCM, with the key derived from a passphrase that’s stored nowhere) to a folder that survives uninstalling, which any sync tool can pick up. Everything can be exported to JSON or CSV at any time, because the spec had one line I insisted on: I should never be locked into this application.

Built to be tested

When software can talk you into or out of a hard session, “seems to work” isn’t enough. The decision engines live in a pure Dart package with no UI, no database and no clock, so every decision can be reproduced from its inputs. They’re tested against written scenarios straight from the spec, for example:

  • Five hours of sleep, but cognition, blood pressure, resting heart rate and training all stable: don’t mark readiness poor just because it’s under seven hours.
  • Feeling great after repeated five-hour nights, while reaction lapses and resting heart rate climb: flag the gap between how I feel and what the data says.
  • Two sessions skipped in a high-workload week: switch to compressed mode before any more drop out.
  • Back after 18 days: a conservative re-entry session. No catch-up, no restart-from-zero language.
  • Wearable data missing for three days: everything keeps working from manual inputs.

Where it stands

Still Here is on my phone and I use it every day. Check-ins, training with planned, adapted and actual sessions, adherence protection, readiness and baselines, the coach, encrypted backups and the assistant loop are all working. Still to come: pulling sleep and heart-rate data in from a tracker, short objective reaction-time tests, nutrition, and weekly and monthly reviews that find my own patterns.

It’s built for one person, and right now it’s full of that person’s data. If you’d like to use it as a template for your own, head to the project page and press I’d like it. If enough people ask, I’ll clean out my data and open-source the code.

In the meantime, if you’ve got a Monday you’ve been waiting for: skip it. Today works.