Progression Playbooks: Teaching Apps How to Think Like Coaches
One of the hardest things to get right in fitness software is progression - how do you make an app that can look at your workout performance and intelligently suggest what to do next? We've been working on what we call "Progression Playbooks," and we think we've found an approach that actually works in practice.
The Challenge of Automated Progression
Here's the thing about workout progression: it's simultaneously simple and incredibly complex. Simple because the basic principles haven't changed - if you can complete all your sets with good form, maybe it's time to add weight. Complex because real coaching involves dozens of variables: how did the sets feel, what's your recent training history, are you in a deload week, how's your sleep been?
Most apps either ignore this complexity entirely (just add 5 pounds every session!) or try to build some black-box AI that makes decisions you can't understand or control. We wanted something different: a system that could capture the nuanced decision-making of good coaches but remain transparent and customizable.
Enter Progression Playbooks
A Progression Playbook is essentially a set of if-then rules that examine your workout performance and suggest what to do next. Think of it as codifying the internal logic a good coach uses when they watch you train.
Here's a simple example:
IF all sets were completed successfully
AND last set RPE was less than 8
THEN increase weight by 5 lbs
MESSAGE: "Felt easy! Let's bump the weight."
Or something more complex:
IF you've failed to complete sets in 3 consecutive workouts
THEN decrease weight by 10%
AND reset reps to base level
MESSAGE: "Plateau detected. Deloading to keep the gains coming!"
How It Works in Practice
1. Rule-Based Logic
Each playbook contains multiple rules, ordered by priority. After each workout, the system evaluates your performance against these rules, finds the first match, and applies the corresponding actions. This gives you predictable, explainable progression decisions.
2. Rich Condition Types
We've built support for various condition types that capture how coaches actually evaluate performance:
- Completion-based: Did you finish all your sets?
- Streak-based: How many successful workouts in a row?
- Intensity-based: How hard did the last set feel (RPE)?
- Performance-based: How many reps did you get on your AMRAP set?
3. Flexible Actions
When a rule triggers, it can take various actions:
- Adjust weight (absolute amounts or percentages)
- Modify rep targets
- Reset parameters to baseline values
- Simply maintain current settings
4. Enhanced Workout Recommendations
Here's where we got ambitious: when the system suggests progression, it doesn't just tell you "use 225 lbs for 5 reps." It generates a complete workout recommendation with warmup sets, working sets, rest periods, and timing - everything you need for an effective session.
query GenerateProgression($exerciseId: ID!, $weight: Float!, $reps: Int!) {
generateEnhancedProgression(
exerciseId: $exerciseId
suggestedWeight: $weight
suggestedReps: $reps
progressionMessage: "Great work! Adding weight."
) {
exerciseName
warmupSets {
setNumber
weight
reps
rpe
purpose
}
workingSets {
setNumber
weight
reps
rpe
isAmrap
}
totalEstimatedTimeSeconds
}
}
For Self-Hosted Users and Developers
One thing we're particularly proud of: this entire system is open source and designed for transparency. You can see exactly why the system made a particular recommendation, modify the rules if they don't work for your style of training, or create entirely custom playbooks.
Creating Custom Playbooks
If you're running your own instance, you can create playbooks tailored to specific training styles:
const customPlaybook = await progressionService.createPlaybook({
name: "Conservative Linear Progression",
description: "Slow but steady strength gains",
rules: [
{
order: 0,
userMessage: "Perfect execution! Small weight increase.",
conditions: [{ type: 'ALL_SETS_COMPLETED' }],
actions: [{ type: 'INCREASE_WEIGHT_ABSOLUTE', value: 2.5 }]
},
{
order: 1,
userMessage: "Tough session. Let's stick with this weight.",
conditions: [{ type: 'ANY_SET_FAILED' }],
actions: [{ type: 'MAINTAIN_ALL' }]
}
]
});
Program Integration
The system is designed to work within our broader program planning framework. It respects weekly modifiers (like deload weeks), coaching overrides, and program-specific training focuses. This means progression suggestions are contextually aware of where you are in your training cycle.
What We've Learned
Building this system taught us a lot about the gap between how people actually train and how most fitness apps assume they train:
-
Context Matters: The same performance might call for different responses depending on where you are in your program, your recent training history, and your goals.
-
Transparency Builds Trust: When the app tells you to add weight, you want to understand why. Black box recommendations feel arbitrary.
-
Customization is Essential: Different lifters progress differently. What works for a novice powerlifter might not work for an experienced bodybuilder.
-
Integration is Key: Progression can't be an isolated feature - it needs to work seamlessly with program planning, workout tracking, and coaching relationships.
The Technical Implementation
For developers interested in the implementation, we built this using:
- A service-based architecture with clear separation of concerns
- MongoDB for flexible rule storage and program snapshots
- GraphQL for type-safe API interactions
- Comprehensive simulation capabilities for testing playbooks against historical data
The progression engine runs after each completed workout, evaluating rules in priority order and updating both the user's program state and creating progression suggestions for the next session.
What's Next
We're continuing to refine the condition types and actions based on user feedback. Future plans include:
- Machine learning integration for automatic playbook optimization
- Community sharing of effective playbooks
- Integration with wearable data for recovery-aware progression
- Advanced periodization support
Try It Yourself
If you're interested in seeing how this works in practice, our documentation includes examples of setting up custom playbooks and integrating with the progression system. For self-hosted users, you have complete control over the rule logic and can experiment with different approaches to automated coaching.
We think we've built something that bridges the gap between simple linear progression and complex coaching intuition. It's not perfect - no automated system can replace a good human coach - but it's a step toward making intelligent training guidance accessible to everyone.
As always, the entire system is open source. If you have ideas for improving the progression logic or want to contribute new condition types, we'd love to hear from you.
Sam Baker leads development at OpenLift, where he spends his time thinking about how to make computers better at understanding human performance. He's probably analyzing RPE data right now.
