Skip to main content

MoPrograms

"The Architect" — "I design your training structure"

Status: ✅ Built

MoPrograms provides program templates like PPL (Push/Pull/Legs) that define training structure.


Purpose

  • Define program structures and rotations
  • Specify movement slots per day
  • Set default rep ranges and RPE targets
  • Enable template-based training
  • Support program selection

Implementation

Database Schema

// Program Template
export const programTemplates = pgTable("program_templates", {
id: text("id").primaryKey(),
name: text("name").notNull(),
description: text("description"),
daysPerWeek: integer("days_per_week").notNull(),
rotation: text("rotation").array().notNull(),
createdAt: timestamp("created_at").defaultNow(),
});

// Template Days
export const templateDays = pgTable("template_days", {
id: text("id").primaryKey(),
programId: text("program_id").references(() => programTemplates.id),
name: text("name").notNull(),
dayType: text("day_type").notNull(), // 'push_a', 'pull_b', etc.
displayOrder: integer("display_order").notNull(),
});

// Template Slots
export const templateSlots = pgTable("template_slots", {
id: text("id").primaryKey(),
templateDayId: text("template_day_id").references(() => templateDays.id),
movementPattern: text("movement_pattern").notNull(),
slotOrder: integer("slot_order").notNull(),
defaultExerciseId: text("default_exercise_id"),
sets: integer("sets").notNull(),
repRangeMin: integer("rep_range_min").notNull(),
repRangeMax: integer("rep_range_max").notNull(),
targetRPE: integer("target_rpe"),
isRequired: boolean("is_required").default(true),
notes: text("notes"),
});

PPL Template Structure

Rotation Pattern

Week 1: Push A → Pull A → Legs A → Push B → Pull B → Legs B → Rest
Week 2: Push A → Pull A → Legs A → Push B → Pull B → Legs B → Rest
(Continues...)

Push A Day

SlotPatternExerciseSets × RepsRPE
1Horizontal PushBarbell Bench Press4 × 6-88
2Horizontal PushIncline DB Press3 × 8-107-8
3Vertical PushOverhead Press3 × 8-107-8
4Horizontal PushCable Flyes3 × 12-157
5Arm IsolationTricep Pushdowns3 × 10-127
6Shoulder IsolationLateral Raises3 × 12-157

Pull A Day

SlotPatternExerciseSets × RepsRPE
1Vertical PullPull-ups4 × 6-88
2Horizontal PullBarbell Row4 × 6-88
3Horizontal PullCable Row3 × 10-127
4Vertical PullLat Pulldown3 × 10-127
5Arm IsolationBarbell Curls3 × 10-127
6Arm IsolationHammer Curls3 × 10-127

Legs A Day

SlotPatternExerciseSets × RepsRPE
1SquatBarbell Back Squat4 × 6-88
2HingeRomanian Deadlift3 × 8-107-8
3LungeWalking Lunges3 × 10-127
4Leg IsolationLeg Extension3 × 12-157
5Leg IsolationLeg Curl3 × 12-157
6Leg IsolationCalf Raises4 × 12-157

API Endpoints

EndpointMethodDescription
/api/programsGETList all programs
/api/programs/:idGETGet program details
/api/programs/:id/daysGETGet program days
/api/programs/:id/days/:dayIdGETGet day with slots

Code Location

/lib/db
├── seed-ppl-template.ts → PPL program seed
├── seed-warmup-general.ts → General warmup
├── seed-warmup-push.ts → Push day warmup
├── seed-warmup-pull.ts → Pull day warmup
├── seed-warmup-legs.ts → Legs day warmup
└── schema.ts → Program schemas

/app/api/programs
├── route.ts → List programs
└── [id]/
├── route.ts → Program details
└── days/route.ts → Program days

Warmup Templates

Each day type has an associated warmup template:

interface WarmupTemplate {
id: string;
name: string;
forDayType: string[]; // ['push_a', 'push_b']

phases: WarmupPhase[];
}

interface WarmupPhase {
name: string; // 'General', 'Dynamic', 'Movement Prep'
exercises: WarmupExercise[];
}

interface WarmupExercise {
name: string;
sets: number;
reps: number | null;
duration: number | null; // seconds
notes: string | null;
}

Program Selection Flow

1. User onboarding
2. Show available programs
3. User selects PPL (only option for now)
4. Set as active program in user_settings
5. PPL rotation drives daily workouts

Implementation Status

FeatureStatus
PPL template✅ Full 6-day rotation
Template slots✅ All patterns defined
Warmup templates✅ Per day type
Program API✅ Built
Day details API✅ Built
Multiple programs❌ Future (only PPL)
Custom programs❌ Future