[02]entry 2 of 29
Fatty
this entry is written twice, in full
- 1.in brief
strength tracker for iPhone, Apple Watch and the web, with an AI judge
- 2.in general
A Kengan Ashura-themed strength tracker with a live analytics engine and no sympathy.
- 3.in particular
One strength tracker on the web, a native iPhone app and an Apple Watch: every set lands in one atomic grain, the analytics are computed in Postgres, and an AI judge ranks you on a ladder of Kengan’s deadliest fighters.
- 1.in brief
a strength tracker for the phone, the watch and the web, with an AI that grades you
- 2.in general
A strength tracker themed on a fighting manga, with charts that decline to flatter you.
- 3.in particular
One gym log that runs on the web, as an iPhone app and on an Apple Watch: every set goes into a single record, the database works out your progress itself, and an AI ranks you against the manga’s deadliest fighters.
context
Formerly Hell Blazer. A real, multi-user workout app, not a demo: every screen reads live Postgres behind row-level security, and sign-in is Google, or Sign in with Apple in the iPhone app. It runs three ways, as an installable PWA, as a native iPhone app shipped through TestFlight, and on an Apple Watch, and all of them log offline and send reminders. The frame is Kengan Ashura: log every set like it counts, then earn your place on a ten-rung ladder of the manga’s deadliest fighters.
the spine
One atomic grain, nothing derived stored. Every log, from a program, a freeform session, the watch or a bonus movement bolted on mid-workout, writes to the same set-level row. Estimated 1RM (Epley), tonnage and weekly sets per muscle are computed by security-invoker views and RPCs, so the client only ever fetches pre-aggregated numbers and RLS still applies to every one of them. Reads live in a typed data layer, writes are Zod-validated Server Actions, and anything that touches more than one row at once is a single Postgres function that lands all or nothing.
what i built
- 1.
A logger built for the thirty seconds between sets: each new set copies the last one forward, last session’s numbers sit above as the target, a rest timer starts itself when a set lands, and sets logged with no signal wait in an IndexedDB queue and upload when it returns, never creating a duplicate
- 2.
A native iPhone app: the same site in a Capacitor shell, built and shipped to TestFlight by GitHub Actions and fastlane with no local Xcode. The workout lives on the Lock Screen and in the Dynamic Island with +30s and Skip for the rest, alongside Home Screen widgets, Siri, a Control Center button and Apple Health
- 3.
An Apple Watch app in SwiftUI7: log sets with the Digital Crown, rest on a countdown that taps your wrist, and record the workout to Apple Health with heart rate, over its own token-scoped API so the phone can stay in the bag
- 4.
Live PR detection ("Removal"): the moment a working set beats your heaviest load or best estimated 1RM, a banner drops, the screen edge rings in your accent and the phone buzzes. Programs run as multi-week blocks you can pause, roll back, preview, or swap a movement in mid-workout
- 5.
Analytics computed in the database: weekly sets per muscle with secondary muscles credited at 0.5×, a year-long consistency heatmap, per-lift 1RM and volume, an all-time 1RM board, and a King of the Hill leaderboard by lifetime volume
- 6.
An AI judge (DeepSeek9) reads your full history and ranks you from Rei Mikazuchi to Kuroki Gensai, calibrated to sex, bodyweight, height and age. The first four rungs count logged loads only, and the verdict is stored server-side as pending, so the client can never name its own rank
outcome
Live at hellblazer.vercel.app against real user data. A second account sees none of the first’s, enforced by RLS on every table and by references that name (id, user_id) together, so knowing another lifter’s ids attaches nothing to them; the rank columns are not writable by the user at all, and pgTAP10 rebuilds the schema from its migrations in CI to prove it. Functions run in Tokyo beside the database and verify the session JWT locally rather than calling the auth server on every navigation. Kilograms are canonical and converted only at display, and the whole UI re-skins from one accent channel across six palettes named after the Kengan companies.
A real app people train on, on the web, a phone and a wrist: multi-user, offline-capable, and honest enough to tell you which Kengan monster you actually rank against.
context
It used to be called Hell Blazer. It is a real gym app with real users, not a demonstration: everyone’s data is sealed off from everyone else’s, and you sign in with Google, or with Apple on the iPhone, so there is no password to lose. It comes three ways, as a website that installs onto a phone, as a proper iPhone app, and as an Apple Watch app, and all three keep recording with no signal and remind you when a session is due. The frame is the manga Kengan Ashura: log every set like it counts, then earn a place on a ten-rung ladder of its most dangerous fighters.
the spine
One kind of record, and nothing worked out in advance. Whether you are following a plan, doing whatever you feel like, logging from your wrist, or bolting an extra movement on halfway through, it all writes the same single row: this exercise, this weight, this many reps. Everything else, your estimated best single lift, the total weight you moved, how many sets each muscle got this week, is calculated on demand by the database itself, so the app only ever asks for finished numbers and the privacy rules still apply to every one of them. Anything that changes several rows at once happens in a single step that either all lands or none of it does.
what i built
- 1.
A logger built for the thirty seconds between sets: the next set arrives already filled in with the last one, what you managed last time sits above it as a target, a rest timer starts on its own, and sets recorded with no signal wait on the phone and upload when it comes back, without ever recording the same set twice.
- 2.
A proper iPhone app, built and sent to testers automatically by a build machine, so no Mac is needed to ship it. While you train, the workout sits on the Lock Screen and in the strip at the top of the screen, with buttons to add thirty seconds of rest or skip it, and there are home-screen widgets, voice commands, a shortcut in the control panel, and workouts saved to Apple’s health app.
- 3.
An Apple Watch app: record sets by turning the crown, rest on a countdown that taps your wrist when it is up, and save the workout to the health app with your heart rate. It talks to the server itself, with its own key, so the phone can stay in your bag.
- 4.
Personal bests are caught as they happen. The moment a set beats your heaviest ever or your best estimated single, a banner drops, the edge of the screen lights up and the phone buzzes. Plans run for weeks and can be paused, rewound, previewed, or have an exercise swapped mid-session.
- 5.
The charts are worked out by the database: weekly sets per muscle, with supporting muscles counted at half so accessory work is credited honestly rather than generously, a year of which days you turned up, strength and total weight per exercise, an all-time best board, and a leaderboard of everyone by total weight lifted.
- 6.
An AI reads your entire history and places you on the ladder from the weakest fighter to the strongest, allowing for your sex, weight, height and age. The first four rungs count only what you actually logged, and the verdict is held on the server until you accept it, so the app itself can never award you a rank.
outcome
It is live and running on real people’s data. A second account sees nothing at all of the first, enforced by the database rather than by the app remembering to be careful, and every link between two of your records names you as well, so knowing someone else’s record numbers gets you nowhere; your rank cannot be written by you at all, and an automatic test rebuilds the whole database from scratch on every change to prove all of that still holds. The servers sit next to the database in Tokyo and check who you are without a round trip. Weight is stored in kilograms and converted only on screen, and the whole look changes colour from a single setting, with six palettes named after the manga’s companies.
A real app people train on, in a browser, on a phone and on a wrist: shared, works without signal, and blunt enough to tell you which monster you would actually lose to.