Back to portfolio Case study · PPL
Case study 04 · 2025 · Personal build

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.

Role
PM, designer, builder
Stack
SwiftUI, Kotlin
Users
5 daily
Status
● Live · iOS + Android
01 · The problem

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

  1. Open browser. Navigate to the blog page.
  2. Scroll through a long article to find today's variant (Push 1, Push 2, Pull 1, etc).
  3. Locate the specific exercise within that section.
  4. Watch the form video.
  5. Lock phone, do the set, unlock phone.
  6. 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.

02 · Research & observations

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.

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.

03 · Product vision

A single, opinionated north star.

When I open the app at the gym, everything I need for that workout should already be in front of me. — Design north star, written before line 1 of code

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.

04 · What shipped

Six features. Each one earns its slot.

F01

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.

F02

Embedded form videos

Reference videos accessible per exercise within the workout flow. No browser. No scrolling. No playback bugs.

F03

Set logging

Weight, reps, optional RPE and notes for each set. Supports bodyweight exercises (zero weight allowed) and ramp-up sets for heavy compounds.

F04

Rest timer

Automatically starts between sets with exercise-specific durations. Configurable per exercise.

F05

Progress charts

Per-exercise line charts showing weight progression over time. Minimal but useful.

F06

Data portability

CSV export and import. Bring in handwritten notes, take your history elsewhere. Your data stays yours.

05 · Product decisions

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.

● Cut · A1

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.

● Cut · A2

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.

● Cut · A3

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.

06 · Distribution & adoption

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.

4/4
friends ≥ 4 days/week
2/4
use all 6 training days
0
onboarding needed
0
support requests

No onboarding was required because the app does exactly one thing and does it obviously. There's nothing to figure out.

07 · Iteration from real feedback

Both features shipped the same day they were requested.

That's the entire feedback loop. Ship. Observe. Listen. Ship again.

Request · friend logging in Notes
"Can I bring my old data into this?"

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.

Request · friend wanting a fresh start
"How do I wipe everything and start clean?"

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.

08 · Product in action

Launch to logged set, under ten seconds.

Drag your own screenshots or GIFs onto the slots below.

Today's workoutOpen the app, tap an exercise to expand, watch the form video, log a set. Launch to logged set in under ten seconds.
Progress trackingDrill into any exercise to see your all-time best, total weight gained, and full progression chart.
ConfigurationWeekly schedule, weight unit, 1RM, rest timers, data management. Set it once, never think about it during a workout.
09 · Lessons learned

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.

10 · PM skills demonstrated

A small project. Transferable muscles.

Problem identification
Recognized a recurring friction point across a user group, not just a personal annoyance.
User research
Observed real behavior (Notes app logging, blog scrolling), drew from experience with existing products.
Scope discipline
Cut AI chat, advanced analytics, generic support. Kept focus on the core use case.
Prioritization
Built the highest-value features first. Deferred nice-to-haves without killing them.
Rapid execution
Idea to working product in five hours. Iterated same-week based on feedback.
User empathy
Solved for the actual workflow, not for an imagined ideal user.
Feedback loops
Shipped, observed, listened, iterated. Real users on a weekly cycle.
Platform thinking
Extended to Android when a user needed it, rather than forcing platform loyalty.
Distribution pragmatism
Chose the simplest viable distribution model for the actual user base.
Product judgment
Knew when the product was "done enough." Resisted feature creep.

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.

Next case study

Case Atlas · the solo AI build

Built with SwiftUI. Designed around one principle: reduce every point of friction between the user and completing their workout.