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. Delete Week Add New Week Duplicate Week Add Week Description
Add Day Description
Delete Day
Add Day Description
Delete Day
Add Day Description
Delete Day
Add Day
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 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 Glutes: 27↓ (19s , 8h ), 3d Hamstrings: 18↓ (14s , 5h ), 3d Quadriceps: 17↓ (15s , 2h ), 3d Chest: 36↓ (21s , 15h ), 3d Biceps: 17↓ (6s , 11h ), 3d Forearms: 15↓ (7s , 8h ), 3d {"maxWidth":2400,"url":"/planner"}
{"exportedProgram":{"customExercises":{"piyyqtrc":{"name":"EMOM Pull up","types":["pull"],"id":"piyyqtrc","isDeleted":false,"meta":{"synergistMuscles":["Biceps Brachii"],"targetMuscles":["Latissimus Dorsi"],"bodyParts":[],"sortedEquipment":[]}},"yxybriyw":{"name":"EMOM Dips","types":["push"],"id":"yxybriyw","isDeleted":false,"meta":{"synergistMuscles":["Triceps Brachii"],"targetMuscles":["Pectoralis Major Sternal Head"],"bodyParts":[],"sortedEquipment":[]}}},"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 = weights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = weights[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 = weights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = weights[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 = weights[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 = weights[ns] + 2.5kg\n }\n~}"},{"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 = weights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = weights[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 = weights[ns] + state.increase\n } else if (setVariationIndex == 1) {\n state.stage1weight = weights[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 = weights[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 = weights[ns] + 2.5kg\n }\n~}"},{"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"}]},{"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"},{"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"},{"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"}]},{"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"},{"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"},{"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"}]}]},"exercises":[],"days":[],"deletedDays":[],"url":"","isMultiweek":false,"name":"531 - GZCLP - Calisthenics","weeks":[],"nextDay":4,"shortDescription":"","clonedAt":1741089483721,"description":"","id":"nnuymdhk","tags":[],"deletedWeeks":[],"author":""},"version":"20250306192146","settings":{"timers":{"warmup":90,"workout":180,"reminder":900},"units":"kg"}},"shouldSyncProgram":false,"isMobile":false,"revisions":[]}