PPL. Five hours to ship. Used six days a week.
A minimal iOS and Android workout companion. Built to solve one specific frustration in my own gym routine. Became a daily-use product for five people, with zero onboarding and zero drop-off.
The content was excellent. The experience was not.
I follow the Push Pull Legs program by Jeff Cavaliere (ATHLEAN-X), a structured six-day workout split. The program lives as long-form blog posts: exercise lists, sets and reps, variations, embedded form videos, and weekly structure. The content itself is great. Using it during a workout is friction.
Every gym session, on repeat
- Open browser. Navigate to the blog page.
- Scroll through a long article to find today's variant (Push 1, Push 2, Pull 1, etc).
- Locate the specific exercise within that section.
- Watch the form video.
- Lock phone, do the set, unlock phone.
- Scroll back to where you left off. Repeat. For every exercise. Every set.
There was also a persistent technical issue: after one embedded video, the next one wouldn't play without a full page refresh. That meant reloading mid-workout, losing scroll position, and starting the hunt over.
The whole cycle added 45 to 60 seconds of friction per exercise. Not catastrophic. Compounding. Over a seven-exercise session, five to seven minutes of fumbling instead of training.
Why existing apps didn't fit.
I'd used Strong, Hevy, JEFIT, and others over the years. Well-built products that solve general fitness tracking effectively. They didn't solve my specific problem.
- The exact ATHLEAN-X exercise variations often weren't available
- Exercise naming was inconsistent across platforms
- Custom superset flows and ramp-up structures couldn't be easily recreated
- Every app required me to adapt my program to its system, rather than supporting how I already train
I asked four friends following the same program how they dealt with it. Same frustrations. Scrolling, refreshing, lost position. One was manually writing sets and reps in his Notes app after every session. The pattern was clear. Same workflow. Same pain. Same unmet need.
A single, opinionated north star.
No setup. No scrolling. No searching. Open the app and today's exercises are right there with videos, logging, and nothing else. Friction reduction at every layer.
- Zero configuration during workouts. The app knows what day it is and what you should be doing
- One-tap access. No navigation required to start training
- No features that don't serve the workout. If it doesn't help you finish your session faster, it doesn't belong
Six features. Each one earns its slot.
Workout awareness
The app determines today's workout (Push 1/2, Pull 1/2, Legs A/B) from a configurable weekly schedule. Launch the app and you're already on the right screen.
Embedded form videos
Reference videos accessible per exercise within the workout flow. No browser. No scrolling. No playback bugs.
Set logging
Weight, reps, optional RPE and notes for each set. Supports bodyweight exercises (zero weight allowed) and ramp-up sets for heavy compounds.
Rest timer
Automatically starts between sets with exercise-specific durations. Configurable per exercise.
Progress charts
Per-exercise line charts showing weight progression over time. Minimal but useful.
Data portability
CSV export and import. Bring in handwritten notes, take your history elsewhere. Your data stays yours.
What I cut, and why.
The discipline of staying focused on the primary use case mattered more than feature richness. Three things I deliberately did not build.
AI-powered progress chat
I considered a Mistral integration: "How am I progressing on bench press over the last two months?" Useful in theory. Out of scope for a gym companion meant to be used during a workout with minimal distraction. Could live in a future version. Doesn't belong in the MVP.
Advanced analytics
Volume tracking, muscle group breakdowns, weekly summaries. Genuine value, but it solves a different problem than the one I scoped. The problem was friction during workouts, not lack of data after them. Hardest decision. Right call.
Generic exercise database
I never considered making the app support arbitrary programs. Excellent generic apps already exist. PPL's strength is being opinionated, built for one specific program, with zero setup, zero customization overhead, and a perfectly matched experience from day one.
What surprised me
The rest timer was a feature I included almost as an afterthought. In practice, it transformed my workout flow. Before, inconsistent breaks: sometimes one minute, sometimes four, depending on how distracted I got. After, automatic, consistent recovery that kept sessions tight. I didn't anticipate it would become one of the highest-value features in the app.
Five users. The App Store was overkill.
Publishing to the App Store requires a $100/year developer account. Overkill for a five-person user base. Instead I installed it directly via Xcode: plug in their phone, hit Run, hand it back. The entire onboarding flow was under a minute. One friend uses Android. I converted the codebase and shared the APK in an afternoon. Same app, different platform.
No onboarding was required because the app does exactly one thing and does it obviously. There's nothing to figure out.
Both features shipped the same day they were requested.
That's the entire feedback loop. Ship. Observe. Listen. Ship again.
CSV Import + Export
He'd been logging workouts manually in his Notes app for weeks. I added CSV import the same session. He structured his notes into the template I provided, uploaded, and his history was instantly in the app. Export shipped alongside it for portability.
Delete All Data
Added with a confirmation gate: type DELETE to confirm, preventing accidental purges. Tiny feature. Big psychological permission to actually use the app freely.
Launch to logged set, under ten seconds.
Drag your own screenshots or GIFs onto the slots below.
What this taught me about shipping.
Narrow scope is a feature, not a limitation
By building for one specific program and one specific group, I avoided the trap of building for hypothetical users. Every decision was grounded in real behavior I could observe directly.
Ship the smallest thing that solves the real problem
The app doesn't have AI, doesn't have social features, doesn't have detailed analytics. It has exercises, logging, and a timer. That's what was needed. That's what shipped.
Users reveal value you didn't design for
The rest timer, the import feature, the delete function. The most impactful additions either surprised me or came directly from users. Building something real and putting it in people's hands surfaces needs that brainstorming alone cannot.
Speed of delivery matters
A solution that exists today is more valuable than a perfect solution next month. The five-hour build time wasn't about cutting corners. It was about knowing exactly what to build, and not building anything else.
A small project. Transferable muscles.
Like how I think? Let's talk product.
If you're hiring a PM who can prototype, ship, and listen, I'd like to hear from you.