The Gym Bot That Went to the App Store
$ grep -n "^##" 2026-10-gym-booking-skill-to-app-store.md
I book the same gym classes every week, at the same times, with the same instructors. For years that habit ran on calendar reminders, and when I forgot one the front-row bikes were gone. In April I wrote a Claude Code skill to book them for me. By October the skill had become MyLocker, an independent booking app for Virgin Active Singapore members, live on the App Store and Google Play, with an agent running it day to day.
A personal automation becomes a product the moment someone else asks for it, and nothing I built in the first five months told me when that would be. The vendor's official app did. This is the why, and the short version of the how.
A skill for a creature of habit
The skill started as one tool for an agent I had built on the Claude Agent SDK. The brief was narrow. Book the recurring classes without me having to remember, and handle the cases a calendar reminder never could. If my usual instructor swapped out of a slot, I wanted to know, and ideally to follow them to the new time.
It grew the way personal tools grow, by being wrong while I was watching. Between May and September it booked 104 classes, 89 of them the same cycling class at the same club. It gained an instructor watch with Telegram alerts, a seat watch that moved a booking to a better bike when one freed up, and recurring rules that fired each week. The scheduled jobs logged 11,159 runs over the summer.
The rule I remember is the one I had to correct. The seat watch assumed a 24-hour cancellation window, which is what any reasonable agent would assume. I told it:
The deadline is not 24 hours. The deadline is 9pm SGT the day before the booking. Even if I have a 7:30am booking tomorrow, the cut-off deadline is still 9pm today.
Every rule the bot knew, it knew because I was there to notice the mistake. That is a fine arrangement for a tool with one user.
The official app made the decision for me
On 8 September Virgin Active retired the web booking system the skill talked to and moved members onto a new app. The new app's hallmark bug, at launch, was that if you held several bookings and cancelled a later one, it cancelled your next class instead.
I had five months of working code against a backend that no longer existed, and a vendor app I did not want to use. Cutting the skill over to the new backend took three days, verified by booking, moving and cancelling a seat on my own account. Then, in about an hour, I turned it into a progressive web app: upcoming bookings, the timetable, book, cancel. It already did those four things better than the app I had been given. The domain and the first 24 pull requests landed on 12 September.
Within a week of showing it to regulars from my spin classes, it was clear more people wanted it than wanted the official app. That was the moment the skill stopped being mine. I had an Apple developer account from earlier in the year, opened a Google Play one, and built the Expo app alongside the web one. End to end, the web app and both native apps took less than a day of building. Getting them approved took more than a week.
What I'd tell my future self about App Review
Apple rejected the first submission. The reviewer's concern was whether MyLocker sold digital content: online classes, a gym membership, anything that would need in-app purchase. It does none of that. It books physical classes against a membership you already hold, and it has no way to buy or manage one. A clarification got it through. The App Store badge went on the homepage on 22 September and Google Play followed on 2 October.
The lesson is cheap to apply. Before you submit, have your agent read the review guidelines against your app and list every place a reviewer could read it two ways. Put the answers in the review notes on the first submission. It would have saved me a week.
The one thing that transferred unchanged
Most of the skill stayed behind. The write path moved into the app as it was. Every booking or cancellation records what it expects before it runs. If the response times out, nothing retries; the account waits until a fresh read of the booking list proves what happened, the same rule I'd apply to any agent after a timeout. A cancellation derives every parameter from the single reservation it has just read, which is exactly the rule the official app's bug broke.
HTTP 200 was never the definition of booked. That mattered more once the person reading the answer was no longer me. MyLocker is independent and has no affiliation with Virgin Active; it uses the same API their own app uses, on the member's own credentials, and nothing else.
Who runs it now
Mostly not me. Codex, running GPT-6.1-Sol, is in charge of the repository day to day. Feedback submitted inside the app is triaged into GitHub issues, and another agent picks those up and opens pull requests. The same setup runs the @mylocker.fit Instagram account, producing carousels and reels when a feature ships. I review and merge. By 20 October that was 107 merged pull requests.
I use it every morning. It cleared the bar I set for it in September: find a class, book it, manage the booking. What comes next is the part the skill did first. Recurring bookings for anyone, not only me, and calendar entries written across work and personal calendars so a class blocks the meeting before the clash exists.
Analytics are off by design, so I don't know how many people use it. Regulars from my spin classes do. The Wednesday 7:30 still gets booked, and nobody sets a reminder.
$ subscribe --newsletter
Practical AI engineering, in your inbox
Field notes for technical leaders building agents, evaluation systems, governance, and production infrastructure.
Related
What Belongs in Agent Memory
A durable handoff separates observations, hypotheses and unfinished work, then records what would make each observation stale.
What Happened After the $8 Website Rebuild
The $7.99 rebuild bought a first version; the repository now shows the less photogenic work of preserving an archive and keeping its promises.
What I Need Before I Approve an Agent’s Work
A review bundle should connect the requirement to evidence for the exact candidate and make the remaining decision explicit.