
A coach made of rules
The new daily coach is a few if-statements over your own data. Why that beats a generated paragraph, and why the app shows only the notes its existing cards don't already cover.
Page 2 of 7

The new daily coach is a few if-statements over your own data. Why that beats a generated paragraph, and why the app shows only the notes its existing cards don't already cover.
Daily mood and a note, a year-in-pixels grid that needs no inline styles, and why mood is the series that makes insights worth having.

Habit routines and the focus timer shipped without touching the streak engine. Why a routine stores nothing but a list of ids, and why the timer stores a start time instead of counting.

Switching habit apps shouldn't cost a streak. How PaceStreak reads Loop's export and generic CSVs, why only year-first dates are accepted, and why an import never overwrites a day.

The app's Permissions-Policy says camera=(). Barcode scanning shipped anyway, by reading a photo instead of a video stream, and the lookup sends the barcode and nothing else.

How PaceStreak estimates real daily energy expenditure from four weeks of logging, why it refuses to answer with thin or inconsistent data, and the caps on every suggested target.

PaceStreak's insights compare your own days with a Welch t-test, not an AI. Why the bar for showing a pattern is deliberately high, and why the app tells you it's correlation.

The API runs on a GCP e2-micro because that's what Always Free covers - one instance, 30 GB of standard disk, an ephemeral IP. It turns out to be sitting exactly at that ceiling, which explains more of the outage two posts back than any single bug did.

The API went down behind a Cloudflare Tunnel error and stayed down through a reboot, an interrupted OS upgrade, a stale connection pool, and a box too small for its own workload. None of the four were the same bug.

Every 'Get early access' and waitlist surface on the site now points at a real sign-up, because there's a real app behind it to sign up for.

Three real bugs found by using the OTP flow the way a person actually would: a stuck login, a false 'already registered' error, and a confirmation screen that didn't lead anywhere. Plus a status page that finally watches the whole stack.

Login worked, /me failed, and the browser blamed CORS. The real cause was three layers down: Swarm silently ignoring a short-form tmpfs key, which meant Starlette's outermost error middleware - the one layer that runs before CORS headers exist - was the one answering.

app and api had no DNS records for most of their existence, so there was nothing to monitor - which meant status.pacestreak.com kept quietly not telling the whole story even after both went live. Fixed, plus a lesson in why a 200 from the app proves nothing about the API behind it.
PaceStreak is a habit and streak tracker for training and everything else worth doing regularly.