This tool allows you to quickly build your weightlifting programs, ensure you have proper weekly volume per muscle group , and balance it with the time you spend in a gym . You can build multi-week programs, plan your mesocycles, deload weeks, testing 1RM weeks, and see the weekly undulation of volume and intensity of each exercise on a graph.
Set the program name, create weeks and days, type the list of exercises for each day, putting each exercise on a new line, along with the number of sets and reps after slash (/) character, like this:
Squat / 3x3-5
Romanian Deadlift / 3x8
Autocomplete will help you with the exercise names. You can also create custom exercises if they're missing in the library.
On the right you'll see Weekly Stats , where you can see the number of sets per week per muscle group, whether you're in the recommended range (indicated by color), strength/hypertrophy split, and if you hover a mouse over the numbers - you'll see what exercises contribute to that number, and how much.
The exercise syntax supports RPEs , percentage of 1RM , rest timers, various progressive overload types, etc. Read more about the features in the docs !
When you're done, you can convert this program to Liftosaur program, and run what you planned in the gym, using the Liftosaur app !
To use this program:
Install Liftosaur app Copy the link to this program by clicking on below Import the link in the app, on the Choose Program screen. Week Stats
Total Sets: 93
Strength Sets: 53, 57%
Hypertrophy Sets: 40, 43%
Upper Sets: 53 (28s , 25h ) , 3d
Lower Sets: 25 (19s , 6h ) , 3d
Core Sets: 6 (6h ) , 1d
Push Sets: 38 (22s , 16h ) , 3d
Pull Sets: 35 (20s , 15h ) , 3d
Legs Sets: 14 (11s , 3h ) , 2d
Shoulders: 32↓ (18s , 14h ) , 3d
Triceps: 18↓ (11s , 7h ) , 3d
Back: 30↓ (16s , 14h ) , 3d
Abs: 3↑ (3h ) , 1d
Glutes: 23↓ (15s , 8h ) , 3d
Hamstrings: 14↓ (10s , 5h ) , 3d
Quadriceps: 15↓ (14s , 2h ) , 3d
Chest: 36↓ (21s , 15h ) , 3d
Biceps: 17↓ (6s , 11h ) , 3d
Calves: 10↑ (10s ) , 3d
Forearms: 11 (3s , 8h ) , 3d
{"maxWidth":2400,"url":"/planner","isLoggedIn":false}
{"exportedProgram":{"customExercises":{"piyyqtrc":{"name":"EMOM Pull up","types":["pull"],"id":"piyyqtrc","isDeleted":false,"meta":{"synergistMuscles":["Biceps Brachii"],"targetMuscles":["Latissimus Dorsi"],"bodyParts":[],"sortedEquipment":[]},"vtype":"custom_exercise"},"yxybriyw":{"name":"EMOM Dips","types":["push"],"id":"yxybriyw","isDeleted":false,"meta":{"synergistMuscles":["Triceps Brachii"],"targetMuscles":["Pectoralis Major Sternal Head"],"bodyParts":[],"sortedEquipment":[]},"vtype":"custom_exercise"}},"program":{"deletedExercises":[],"planner":{"name":"531 - GZCLP - Calisthenics","weeks":[{"name":"Week 1","days":[{"name":"Squat/Bench","exerciseText":"Squat / 1x5 58%, 1x5 67%, 1x5+ 76%, 5x5 58% / warmup: none\nBench Press, Barbell / 1x5 58%, 1x5 67%, 1x5+ 76%, 5x5 58% / warmup: none\nPull Up, Bodyweight / 1x1-50+ / 60s / update: custom() {~\n if (setIndex == ns && sum(completedReps) < max(reps)) {\n numberOfSets += 1\n }\n~} / progress: custom() {~\n if (numberOfSets <= 5) {\n reps += 10\n }\n~}\nRomanian Deadlift, Barbell / 3x10 55% / 3x8 55% / 3x6 55% / warmup: none / progress: custom(stage1weight: 0kg, increase: 2.5kg, stage3increase: 5kg) {~\n if (descriptionIndex == 1) {\n descriptionIndex = 2\n }\n if (completedReps >= reps) {\n weights = completedWeights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = completedWeights[ns]\n setVariationIndex += 1\n } else if (setVariationIndex == 2) {\n setVariationIndex += 1\n } else {\n setVariationIndex = 1\n weights = state.stage1weight + state.stage3increase\n }\n~}\nShoulder Press / 3x10 55% / 3x8 55% / 3x6 55% / warmup: none / progress: custom(stage1weight: 0kg, increase: 2.5kg, stage3increase: 5kg) {~\n if (descriptionIndex == 1) {\n descriptionIndex = 2\n }\n if (completedReps >= reps) {\n weights = completedWeights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = completedWeights[ns]\n setVariationIndex += 1\n } else if (setVariationIndex == 2) {\n setVariationIndex += 1\n } else {\n setVariationIndex = 1\n weights = state.stage1weight + state.stage3increase\n }\n~}\nLateral Raise / 2x15 60% 90s, 1x15+ 60% 90s / warmup: none / progress: custom() {~\n if (completedReps[ns] >= 25) {\n weights = completedWeights[ns] + 2.5kg\n }\n~}\nLying Bicep Curl / 2x15 60% 90s, 1x15+ 60% 90s / warmup: none / progress: custom() {~\n if (completedReps[ns] >= 25) {\n weights = completedWeights[ns] + 2.5kg\n }\n~}","id":"vltoihki"},{"name":"Deadlift/OHP","exerciseText":"Deadlift / 1x5 58%, 1x5 67%, 1x5+ 76%, 5x5 58% / warmup: none\nOverhead Press / 1x5 58%, 1x5 67%, 1x5+ 76%, 5x5 58% / warmup: none\nPull Up, Bodyweight / 1x1-50+ / 60s / update: custom() {~\n if (setIndex == ns && sum(completedReps) < max(reps)) {\n numberOfSets += 1\n }\n~} / progress: custom() {~\n if (numberOfSets <= 5) {\n reps += 10\n }\n~}\nSeated Row, Leverage Machine / 3x10 55% / 3x8 55% / 3x6 55% / warmup: none / progress: custom(stage1weight: 0kg, increase: 2.5kg, stage3increase: 5kg) {~\n if (descriptionIndex == 1) {\n descriptionIndex = 2\n }\n if (completedReps >= reps) {\n weights = completedWeights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = completedWeights[ns]\n setVariationIndex += 1\n } else if (setVariationIndex == 2) {\n setVariationIndex += 1\n } else {\n setVariationIndex = 1\n weights = state.stage1weight + state.stage3increase\n }\n~}\nChest Dip / 3x10 55% / 3x8 55% / 3x6 55% / warmup: none / progress: custom(stage1weight: 0kg, increase: 2.5kg, stage3increase: 5kg) {~\n if (descriptionIndex == 1) {\n descriptionIndex = 2\n }\n if (completedReps >= reps) {\n weights = completedWeights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = completedWeights[ns]\n setVariationIndex += 1\n } else if (setVariationIndex == 2) {\n setVariationIndex += 1\n } else {\n setVariationIndex = 1\n weights = state.stage1weight + state.stage3increase\n }\n~}\nFace Pull, Cable / 2x15 60% 90s, 1x15+ 60% 90s / warmup: none / progress: custom() {~\n if (completedReps[ns] >= 25) {\n weights = completedWeights[ns] + 2.5kg\n }\n~}\nBicep Curl, Cable / 2x15 60% 90s, 1x15+ 60% 90s / warmup: none / progress: custom() {~\n if (completedReps[ns] >= 25) {\n weights = completedWeights[ns] + 2.5kg\n }\n~}","id":"zlhhrgpi"},{"name":"Calisthenics","exerciseText":"EMOM Pull up / 6x4 / warmup: none / 0kg / progress: custom() {~\n if (completedReps >= reps) {\n numberOfSets += 1\n }\n~}\nEMOM Dips / 6x8 / 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n numberOfSets += 1\n }\n~}\n// GIANT SET\nPistol Squat / 3x6+ 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// GIANT SET\nHanging Leg Raise, Bodyweight / 3x10+ / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// GIANT SET\nReverse Hyperextension, Bodyweight / 3x10+ / 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// MYO REPS\nPush Up, Bodyweight / 1x20, 1x5, 1x5, 1x5, 1x5, 1x5, 1x5\n// MYO REPS\nInverted Row, Bodyweight / 1x20, 1x5, 1x5, 1x5, 1x5, 1x5, 1x5","id":"rrqqjmbs"}],"id":"fwwqogvx"},{"name":"Week 2","days":[{"name":"Squat/Bench","exerciseText":"Squat / 1x3 63%, 1x3 72%, 1x3+ 81%, 5x5 63%\nBench Press / 1x3 63%, 1x3 72%, 1x3+ 81%, 5x5 63%\nPull Up, Bodyweight / 1x1-50+ / 60s / update: custom() {~\n if (setIndex == ns && sum(completedReps) < max(reps)) {\n numberOfSets += 1\n }\n~} / progress: custom() {~\n if (numberOfSets <= 5) {\n reps += 10\n }\n~}\nRomanian Deadlift, Barbell / 3x10 55% / 3x8 55% / 3x6 55%\nShoulder Press / 3x10 55% / 3x8 55% / 3x6 55%\nLateral Raise / 2x15 60% 90s, 1x15+ 60% 90s\nLying Bicep Curl / 2x15 60% 90s, 1x15+ 60% 90s","id":"goeaulcu"},{"name":"Deadlift/OHP","exerciseText":"Deadlift / 1x3 63%, 1x3 72%, 1x3+ 81%, 5x5 63%\nOverhead Press / 1x3 63%, 1x3 72%, 1x3+ 81%, 5x5 63%\nPull Up, Bodyweight / 1x1-50+ / 60s / update: custom() {~\n if (setIndex == ns && sum(completedReps) < max(reps)) {\n numberOfSets += 1\n }\n~} / progress: custom() {~\n if (numberOfSets <= 5) {\n reps += 10\n }\n~}\nSeated Row, Leverage Machine / 3x10 55% / 3x8 55% / 3x6 55%\nChest Dip / 3x10 55% / 3x8 55% / 3x6 55%\nFace Pull, Cable / 2x15 60% 90s, 1x15+ 60% 90s\nBicep Curl, Cable / 2x15 60% 90s, 1x15+ 60% 90s","id":"qecrqdpi"},{"name":"Calisthenics","exerciseText":"EMOM Pull up / 6x4 / warmup: none / 0kg / progress: custom() {~\n if (completedReps >= reps) {\n numberOfSets += 1\n }\n~}\nEMOM Dips / 6x8 / 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n numberOfSets += 1\n }\n~}\n// GIANT SET\nPistol Squat / 3x6+ 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// GIANT SET\nHanging Leg Raise, Bodyweight / 3x10+ / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// GIANT SET\nReverse Hyperextension, Bodyweight / 3x10+ / 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// MYO REPS\nPush Up, Bodyweight / 1x20, 1x5, 1x5, 1x5, 1x5, 1x5, 1x5\n// MYO REPS\nInverted Row, Bodyweight / 1x20, 1x5, 1x5, 1x5, 1x5, 1x5, 1x5","id":"bsqjqfjr"}],"id":"jbjqonmp"},{"name":"Week 3","days":[{"name":"Squat/Bench","exerciseText":"Squat / 1x5 67%, 1x3 76%, 1x1+ 85%, 5x5 67%\nBench Press / 1x5 67%, 1x3 76%, 1x1+ 85%, 5x5 67%\nPull Up, Bodyweight / 1x1-50+ / 60s / update: custom() {~\n if (setIndex == ns && sum(completedReps) < max(reps)) {\n numberOfSets += 1\n }\n~} / progress: custom() {~\n if (numberOfSets <= 5) {\n reps += 10\n }\n~}\nRomanian Deadlift, Barbell / 3x10 55% / 3x8 55% / 3x6 55%\nShoulder Press / 3x10 55% / 3x8 55% / 3x6 55%\nLateral Raise / 2x15 60% 90s, 1x15+ 60% 90s\nLying Bicep Curl / 2x15 60% 90s, 1x15+ 60% 90s","id":"ieqkthli"},{"name":"Deadlift/OHP","exerciseText":"Deadlift / 1x5 67%, 1x3 76%, 1x1+ 85%, 5x5 67%\nOverhead Press / 1x5 67%, 1x3 76%, 1x1+ 85%, 5x5 67%\nPull Up, Bodyweight / 1x1-50+ / 60s / update: custom() {~\n if (setIndex == ns && sum(completedReps) < max(reps)) {\n numberOfSets += 1\n }\n~} / progress: custom() {~\n if (numberOfSets <= 5) {\n reps += 10\n }\n~}\nSeated Row, Leverage Machine / 3x10 55% / 3x8 55% / 3x6 55%\nChest Dip / 3x10 55% / 3x8 55% / 3x6 55%\nFace Pull, Cable / 2x15 60% 90s, 1x15+ 60% 90s\nBicep Curl, Cable / 2x15 60% 90s, 1x15+ 60% 90s","id":"oyjrllnm"},{"name":"Calisthenics","exerciseText":"EMOM Pull up / 6x4 / warmup: none / 0kg / progress: custom() {~\n if (completedReps >= reps) {\n numberOfSets += 1\n }\n~}\nEMOM Dips / 6x8 / 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n numberOfSets += 1\n }\n~}\n// GIANT SET\nPistol Squat / 3x6+ 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// GIANT SET\nHanging Leg Raise, Bodyweight / 3x10+ / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// GIANT SET\nReverse Hyperextension, Bodyweight / 3x10+ / 0kg / warmup: none / progress: custom() {~\n if (completedReps >= reps) {\n var.stop = 0\n for (var.i in reps) {\n if (var.stop == 0 && reps[var.i] == min(reps)) {\n reps[var.i] = min(reps) + 1\n var.stop = 1\n }\n }\n }\n~}\n// MYO REPS\nPush Up, Bodyweight / 1x20, 1x5, 1x5, 1x5, 1x5, 1x5, 1x5\n// MYO REPS\nInverted Row, Bodyweight / 1x20, 1x5, 1x5, 1x5, 1x5, 1x5, 1x5","id":"sbibyvud"}],"id":"uouiphil"}],"vtype":"planner"},"exercises":[],"days":[],"deletedDays":[],"url":"","isMultiweek":false,"name":"531 - GZCLP - Calisthenics","weeks":[],"nextDay":4,"shortDescription":"","clonedAt":1741089483721,"description":"","id":"nnuymdhk","tags":[],"deletedWeeks":[],"author":"","vtype":"program"},"version":"20260304084247","settings":{"timers":{"warmup":90,"workout":180,"reminder":900},"units":"kg"}},"shouldSyncProgram":false,"isMobile":false,"revisions":[]}