Building Better Program Plans: How We're Tackling Structured Training
We've been quietly working on something we're pretty excited about: a comprehensive program planning system that handles the complexity of structured training programs without making your head spin. Let me walk you through what we've built and why we think it matters.
The Problem We Set Out to Solve
Anyone who's tried to follow a structured training program knows the drill. You find a great program online, maybe it's a 12-week strength building plan or a hypertrophy-focused split. But then reality hits: the program assumes you train on specific days, doesn't account for your current strength levels, and certainly doesn't adapt when life gets in the way.
Most fitness apps either give you overly simple workout templates or overly complex program builders that require a degree in exercise science to navigate. We wanted to find a middle ground - something sophisticated enough to handle real programming needs, but approachable enough that you don't need to be a powerlifting coach to use it.
What We Built: Program Plans
Our Program Plans system is built around a few core concepts that we've learned matter most in real-world training:
1. Flexible Template Architecture
Each Program Plan is essentially a blueprint. It defines the structure - how many weeks, what exercises, how they progress over time - but it's designed to be personalized when you actually use it. Think of it like a recipe that automatically adjusts portions based on who's cooking.
When you enroll in a program, we create a personal snapshot of that plan. This means your version won't change even if the original program gets updated. Your training stays consistent.
2. Smart Weekly Modifiers
Real programs aren't just linear progressions. Week 4 might be a deload, Week 8 might focus on testing maxes. We built a weekly modifier system that lets program creators define how each week should differ from the baseline.
query GetProgramPlan($id: ID!) {
programPlan(id: $id) {
name
durationWeeks
daysPerWeek
weeklyModifiers {
weekNumber
rpeMultiplier
repsMultiplier
weightMultiplier
}
workoutTemplateLinks {
dayOfWeek
weekNumber
programWorkoutTemplateId
}
}
}
3. Training Focus Integration
Different programs serve different goals. Our training focus system lets each program define its primary objective - strength, hypertrophy, endurance - which then influences how exercises are programmed and progressed.
4. Real-World Scheduling
Here's where we got a bit ambitious. The system doesn't just give you a program - it actually schedules your workouts based on your preferred training days, handles missed sessions intelligently, and keeps you moving forward even when your schedule gets chaotic.
For Developers: The Technical Side
If you're building your own training app or contributing to open source fitness tools, here's what we learned:
Service Architecture
We built this around a fat service pattern - the ProgramPlanService handles all the complex business logic while keeping our GraphQL resolvers thin:
// Creating a new program plan with embedded arrays
const newPlan = await this.prisma.programPlan.create({
data: {
...planBaseData,
trainingFocus: { connect: { id: trainingFocusId } },
createdBy: { connect: { id: user.id } },
workoutTemplateLinks: workoutTemplateLinks || [],
weeklyModifiers: finalWeeklyModifiers || [],
programBlocks: programBlocks || [],
},
include: {
createdBy: true,
trainingFocus: true,
}
});
Permission Model
We implemented a multi-tiered permission system:
- Public programs anyone can use
- Private programs you create
- Coach-client relationships for program sharing
- Admin overrides for system management
Database Design
We went with MongoDB for this, using embedded documents for the complex nested structures. The weekly modifiers, workout template links, and program blocks are all embedded arrays, which keeps queries fast and data consistent.
What's Next
This is just the foundation. We're working on program templates, better discovery features, and integration with our progression tracking system. The goal is to make structured training accessible to everyone, whether you're a beginner following your first program or an experienced lifter designing custom periodization.
For developers interested in the technical implementation, our codebase is open source. We'd love to hear your thoughts on our approach to handling complex fitness program data.
We're still the new kids on the block in the fitness app space, but we think we're building something that puts the user first. Real training programs for real people, with the flexibility to adapt to how you actually live and train.
If you're interested in trying it out or contributing to the project, check out our documentation at docs.openlift.dev. And if you're a program creator looking for a platform that respects the complexity of good programming, we'd love to chat.
Sam Baker is the lead developer behind OpenLift's program planning system. When he's not debugging workout schedules, he's probably deadlifting or thinking about deadlifting.
