We already wrote about the product story of 1 Day at a Time. This is the other half: what it felt like to actually ship it — fast, messy, and with AI in more places than it deserved.
Six days, one product
1 Day at a Timeis a mobile-first fitness companion with a simple promise: win today, not perfection. AI builds the day's missions and meals. A coach character keeps you honest without turning every miss into a courtroom.
We didn't build it as a native app. We shipped it as a PWA — React, Vite, Firebase Auth, Firestore, Gemini, web push — on onedaat.com. Roughly a hundred commits in about six days. Product Hunt badge on the landing page. No Xcode. No App Store listing.
That speed is real. So is the bill that comes with it: complexity compounds faster than features when you can generate both overnight.
Tools made building faster. They also made overbuilding faster.
The AI trap
Early on, we wanted every coach line to be model-generated. No templates. No static praise. If the athlete tapped a mission, the coach should react like a real trainer in the room.
It sounded principled. It was expensive, slow, and mostly invisible.
Users will literally never notice a unique acknowledgment for checking off breakfast. They will notice a splash that hangs while the model thinks. They will notice a product that burns tokens on reactions instead of decisions.
The fix was a hard architectural swing: treat AI as a daily brain, not a personality generator on every tap. Planning, adapting, free-text coaching — model. Micro reactions — short static lines. “Good.” “Logged.” “Next.”
We asked for every line to be AI. That was the wrong ambition.
The biggest issue wasn't too much AI. It was AI used for reactions instead of decisions.
Fake personalization
We tested three accounts and got nearly the same workouts and meals. The product looked intelligent. It wasn't.
Local fallback templates were masking broken context. When generation failed or under-specified, the app quietly served a generic day plan. From the outside, it still felt “AI-powered.” From the inside, it was lying about personalization.
So we killed the fallbacks. AI-only, with a retry path.
Then we made the context real: training capacity, wake and sleep windows, train blocks, lose/gain/maintain intent, seasonal and budget food constraints. Missions stopped being vague chores and started looking like something a coach would actually assign.
Personalization is not a prompt adjective. It is a systems problem. If the model doesn't receive the athlete's constraints, it invents a stranger's day.
Character, not dashboard
Fitness products love dashboards. Charts, streaks, calorie scoreboards. We started there too — then tore Journey apart and rebuilt it as the Coach's Office.
The coach is a character: tough love, late-fifties energy, never guilt, never “Good morning,” never announcing that something was AI-generated. The office is where you review the day — not a control panel for optimizing yourself into paralysis.
Two other rules saved the product from cleverness:
- The coach is read-only on your day. Chat cannot complete your meals or missions for you. Only you toggle progress.
- Journey reviews are rate-limited. After enough coaching for one day, the trainer gets irritated and sends you back to work.
Software that talks too much stops feeling like a coach and starts feeling like a notification settings page with a personality.
PWA pain without an App Store
Skipping the stores did not skip store-grade pain.
Google OAuth brand verification rejected the product because the homepage was behind login, the purpose wasn't clear, and the name didn't match. Overnight, compliance work became product work: a public landing page, Privacy, Terms, purpose copy. That landing page is now part of how the product introduces itself — not a paperwork afterthought.
Firebase App Check fought Gemini in production. Hosting once deployed something that wasn't the Vite build. Dev and prod PWAs lived on the same phone looking identical until we painted blueprint icons on the development install.
Android web push was the boss fight: VAPID, service workers, permission UX that lied about the current state, test sends that worked on desktop and failed on the installed PWA. Days of work for a feature users only notice when it's missing.
And the branded splash — beautiful the first cold open, annoying the twentieth warm open. Once the OS already showed your icon, a logo hold is a tax. Warm loads now skip the brand moment and open the workspace.
A branded splash is a tax once the home screen already showed your icon.
What we overbuilt
At some point we asked for an architecture map because we could feel the product getting cleverer than it was useful. The list of things we later cut or simplified is longer than we'd like:
- AI praise on every micro-interaction
- Local day-plan fallbacks that faked personalization
- Time-gated meals that blocked editing “past” breakfast
- A full e2e suite abandoned when auth made CI a maze
- Illustration bloat and loading states that looked impressive and felt cheap
- Card-heavy settings that fought mobile muscle memory
Time-gated meals were especially instructive. Clever. Hostile. If someone wants to log breakfast at midnight, the product should get out of the way. Effort belongs in the workout, not in negotiating with the UI.
Optimistic toggles mattered more than another animation. When Firestore round-trips made checkboxes feel broken, people double-tapped. Latency is a product bug, even when the server is correct.
What we keep
Shipping 1 Day at a Timedidn't give us a framework. It gave us a short list we now trust:
- Use AI for decisions that change the day. Not for applause that fills silence.
- Kill anything that makes the product look smart while lying.
- Characters beat dashboards when the job is showing up, not optimizing.
- PWA shipping still means OAuth, push, install identity, and cold start — budget for them.
- Speed with agents is real. So is the duty to delete what velocity creates.
We shipped to a custom domain and Product Hunt before we needed a store listing. That was the right order for this product. The wrong order would have been another week of reactions, illustrations, and architecture theater.
The app still says win today. Building it taught us the engineering version of the same line: ship the day in front of you — then delete whatever was only there to impress yesterday's ambition.
Want the full product story?
Read the 1 Day at a Time case study, or try the live PWA at onedaat.com. If you're planning a fast MVP of your own, we can help you define the right first version — and cut the rest.
