progressions
Progressions Feature
Kettlebell swing progression tracker with automatic advancement through reps → time → weight.
Progression Algorithm
- Start: X kg, 10 reps, 10 min EMOM
- Each completed session: +2 reps (until 20)
- At 20 reps: +2 min per session (until 20 min)
- At 20 reps & 20 min: next kettlebell, reset to 10 reps & 10 min
- User confirms completion after each session
10 reps → 12 → 14 → 16 → 18 → 20 reps
↓
10 min → 12 → 14 → 16 → 18 → 20 min
↓
Next kettlebell
Reset to 10/10
Key Files
| File | Purpose |
|---|---|
lib/progressionLogic.ts |
Pure functions: calculateNextLevel, getCurrentLevel, getProgressionPhase |
composables/useProgressions.ts |
List all progressions |
composables/useProgression.ts |
Single progression detail + session history |
composables/useProgressionForm.ts |
Create progression form state |
composables/useProgressionSession.ts |
Active EMOM session with timer |
Database
Tables: progressions, progressionSessions (Dexie v5)
Repository: getProgressionsRepository() from @/db
Usage
// List progressions
const { state, reload } = useProgressions()
// Single progression
const { progression, level, progress, sessions } = useProgression(id)
// Create form
const { name, selectedWeights, toggleWeight, save } = useProgressionForm()
// Active session
const { level, currentMinute, startTimer, completeSession } = useProgressionSession(id)
Progression Logic API
import {
calculateNextLevel,
getCurrentLevel,
getProgressionPhase
} from '@/features/progressions/lib/progressionLogic'
// Get current level from session history
const level = getCurrentLevel(sessions)
// { weight: 24, reps: 14, minutes: 10 }
// Calculate next level after completing session
const nextLevel = calculateNextLevel(currentLevel)
// { weight: 24, reps: 16, minutes: 10 }
// Get phase description
const phase = getProgressionPhase(level)
// 'reps' | 'time' | 'weight_reset'
More from alexanderop/workouttracker
vue-composables
Write high-quality Vue 3 composables following established patterns and best practices. Use when creating new composables, refactoring existing ones, or reviewing composable code. Triggers include requests to "create a composable", "write a use* function", "extract logic into a composable", or any Vue Composition API reusable logic task.
23product-planning
|
19vitest-mocking
|
15add-exercises
Add new exercises to the workout tracker database. Use when asked to add exercises, expand the exercise library, or check what exercises exist. Triggers include "add exercise", "new exercise", "exercise database", "what exercises", "missing exercises", "expand exercises".
12systematic-debugging
|
12repository-pattern
Create and manage Dexie/IndexedDB repositories with type-safe interfaces, converters, and standardized CRUD operations. Use when (1) adding entity storage, (2) implementing save/load/delete operations, (3) designing database schema and indexes, (4) converting between database (Db*) and domain types, (5) handling database errors or migrations, (6) using existing repositories (SettingsRepository, WorkoutsRepository, TemplatesRepository, CustomExercisesRepository, BenchmarksRepository, ActiveWorkoutRepository). Triggers include "database", "repository", "save data", "fetch from database", "delete from storage", "database schema", "database table", "indexes", "migration", "persist", "convert workout", "converter", "buildPartialUpdate", "mock repository", "database error", "bulk operations", "import/export", or specific repository names.
12