Is 5 minutes walk after having dinner helpful in muscle boosting
postprandial walking exercise muscle metabolism
does walking after dinner help muscle growth benefits
| Benefit | 5-min Post-Dinner Walk? |
|---|---|
| Blood sugar control | Yes - well supported |
| Better nutrient circulation to muscles | Yes - indirect benefit |
| Digestion and absorption | Yes |
| Direct muscle growth stimulus | No |
| Calorie burn (meaningful) | Minimal |
What types of resistance training are best for muscle growth?
resistance training hypertrophy muscle growth
best types of resistance training for muscle hypertrophy evidence 2024 2025
| Load | Rep Range | Hypertrophy? |
|---|---|---|
| Light (30-50% 1RM) | 15-30 reps | Yes, if near failure |
| Moderate (60-75% 1RM) | 8-15 reps | Yes (most common) |
| Heavy (80-90% 1RM) | 3-6 reps | Yes (also good for strength) |
| Priority | Recommendation |
|---|---|
| #1 | Compound free weight lifts (squat, deadlift, press, row, pull) |
| #2 | Isolation machines for lagging muscles and safe failure work |
| #3 | Train each muscle 2x per week (split routine or full body) |
| #4 | 10-20 sets/muscle/week, near failure each set |
| #5 | Progressive overload every 1-2 weeks |
| #6 | 1.6-2.2g of protein per kg bodyweight daily |
What's a sample beginner's resistance training program without machinery
| Exercise | Sets | Reps | Muscles Targeted |
|---|---|---|---|
| Push-Ups | 3 | 8-15 | Chest, shoulders, triceps |
| Pike Push-Ups | 3 | 8-12 | Shoulders, upper chest |
| Diamond Push-Ups | 2 | 8-12 | Triceps, inner chest |
| Bodyweight Squat | 3 | 15-20 | Quads, glutes, hamstrings |
| Reverse Lunges | 3 | 10/leg | Glutes, quads, balance |
| Glute Bridges | 3 | 15-20 | Glutes, hamstrings |
| Calf Raises (single leg) | 3 | 15/leg | Calves |
| Exercise | Sets | Reps | Muscles Targeted |
|---|---|---|---|
| Pull-Ups or Inverted Rows* | 3 | 5-10 | Back, biceps |
| Bodyweight Rows (under table) | 3 | 10-15 | Mid-back, rear delts |
| Superman Hold | 3 | 10-12 | Lower back, glutes |
| Plank | 3 | 30-45 sec | Core stability |
| Dead Bug | 3 | 8/side | Deep core |
| Hollow Body Hold | 3 | 20-30 sec | Full core |
| Bicycle Crunches | 3 | 12/side | Obliques, abs |
| Exercise | Sets | Reps | Muscles Targeted |
|---|---|---|---|
| Jump Squats (or deep squats) | 3 | 10-15 | Full lower body |
| Push-Up Variations (incline/decline) | 3 | 10-15 | Chest at different angles |
| Step-Ups (on chair/stair) | 3 | 10/leg | Glutes, quads |
| Dips (between two chairs) | 3 | 8-12 | Triceps, lower chest |
| Single-Leg Glute Bridge | 3 | 10-12/leg | Glutes, hamstrings |
| Mountain Climbers | 3 | 20/side | Core, shoulders, cardio |
| Inverted Rows | 3 | 10-15 | Back, biceps |
| Day | Session |
|---|---|
| Monday | Day A |
| Tuesday | Rest or light walk |
| Wednesday | Day B |
| Thursday | Rest or light walk |
| Friday | Day C |
| Saturday | Optional active recovery (stretching, walking) |
| Sunday | Full rest |
| Rule | Why It Matters |
|---|---|
| Stop 2-3 reps before complete failure | Reduces injury risk, still drives growth |
| Prioritize form over reps | Bad form = wasted effort + injury |
| Sleep 7-9 hours | Most muscle repair happens during sleep |
| Eat 1.6-2.2g protein/kg bodyweight | Protein is the raw material for muscle |
| Be consistent for at least 8 weeks | Visible results take time - trust the process |
Generate a downloadable PDF checklist of this workout routine
ls -la /tmp/workspace/ 2>/dev/null || echo "workspace empty or missing"
mkdir -p /tmp/workspace/workout-pdf
~/workout-pdf/generate_workout_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import PageBreak
OUTPUT = "/tmp/workspace/workout-pdf/Beginner_Bodyweight_Workout_Checklist.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.5*cm,
leftMargin=1.5*cm,
topMargin=1.5*cm,
bottomMargin=1.5*cm,
)
# ── Colours ──────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MID_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
ACCENT = colors.HexColor("#E8A020")
LIGHT_GREY = colors.HexColor("#F4F6F9")
MID_GREY = colors.HexColor("#C8CDD5")
WHITE = colors.white
GREEN_CHECK = colors.HexColor("#2D7D46")
# ── Styles ────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
"Title", fontName="Helvetica-Bold", fontSize=22,
textColor=WHITE, alignment=TA_CENTER, spaceAfter=2
)
subtitle_style = ParagraphStyle(
"Subtitle", fontName="Helvetica", fontSize=11,
textColor=colors.HexColor("#BDD9F2"), alignment=TA_CENTER, spaceAfter=4
)
section_style = ParagraphStyle(
"Section", fontName="Helvetica-Bold", fontSize=13,
textColor=WHITE, alignment=TA_LEFT, spaceAfter=2, spaceBefore=2
)
body_style = ParagraphStyle(
"Body", fontName="Helvetica", fontSize=9,
textColor=DARK_BLUE, leading=13
)
small_style = ParagraphStyle(
"Small", fontName="Helvetica", fontSize=8,
textColor=colors.HexColor("#555555"), leading=11
)
note_style = ParagraphStyle(
"Note", fontName="Helvetica-Oblique", fontSize=8,
textColor=colors.HexColor("#444444"), leading=12
)
rule_label = ParagraphStyle(
"RuleLabel", fontName="Helvetica-Bold", fontSize=9,
textColor=DARK_BLUE
)
rule_body = ParagraphStyle(
"RuleBody", fontName="Helvetica", fontSize=9,
textColor=colors.HexColor("#333333"), leading=12
)
# ── Helpers ───────────────────────────────────────────────────────────────────
def header_table(text, bg=DARK_BLUE, fg=WHITE, size=13):
"""Full-width coloured header row."""
s = ParagraphStyle("hdr", fontName="Helvetica-Bold",
fontSize=size, textColor=fg)
t = Table([[Paragraph(text, s)]], colWidths=[178*mm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("ROUNDEDCORNERS", [4]),
]))
return t
def exercise_table(rows, col_widths=None):
"""Zebra-striped exercise table with a checkbox column."""
if col_widths is None:
col_widths = [8*mm, 60*mm, 22*mm, 22*mm, 66*mm]
# header row
hdr = [
Paragraph("<b>✓</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER)),
Paragraph("<b>Exercise</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
Paragraph("<b>Sets</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER)),
Paragraph("<b>Reps</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER)),
Paragraph("<b>Muscles</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
]
table_data = [hdr]
for i, (ex, sets, reps, muscles) in enumerate(rows):
bg = LIGHT_GREY if i % 2 == 0 else WHITE
cell_s = ParagraphStyle("td", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE, leading=11)
cell_c = ParagraphStyle("tdc", fontName="Helvetica", fontSize=10, textColor=MID_GREY, alignment=TA_CENTER)
table_data.append([
Paragraph("☐", cell_c),
Paragraph(ex, cell_s),
Paragraph(sets, ParagraphStyle("tdc2", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE, alignment=TA_CENTER)),
Paragraph(reps, ParagraphStyle("tdc2", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE, alignment=TA_CENTER)),
Paragraph(muscles, cell_s),
])
t = Table(table_data, colWidths=col_widths)
style_cmds = [
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("GRID", (0,0), (-1,-1), 0.3, MID_GREY),
("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, WHITE]),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
t.setStyle(TableStyle(style_cmds))
return t
def progress_table(rows):
"""Simple two-column table for progression ladder."""
col_widths = [40*mm, 138*mm]
hdr = [
Paragraph("<b>Exercise</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
Paragraph("<b>Progression Ladder → Easy to Hard</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
]
table_data = [hdr]
for ex, ladder in rows:
cell_s = ParagraphStyle("td", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE, leading=11)
table_data.append([Paragraph(f"<b>{ex}</b>", cell_s), Paragraph(ladder, cell_s)])
t = Table(table_data, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("GRID", (0,0), (-1,-1), 0.3, MID_GREY),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
return t
# ── Content ───────────────────────────────────────────────────────────────────
story = []
# ── TITLE BANNER ──────────────────────────────────────────────────────────────
title_data = [[
Paragraph("BEGINNER BODYWEIGHT WORKOUT", title_style),
Paragraph("Resistance Training Checklist • No Equipment Required", subtitle_style),
]]
title_t = Table(title_data, colWidths=[178*mm])
title_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING",(0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [6]),
]))
story.append(title_t)
story.append(Spacer(1, 4*mm))
# ── OVERVIEW STRIP ────────────────────────────────────────────────────────────
overview_items = [
("📅", "3 Days / Week", "Mon · Wed · Fri"),
("🏋️", "Full Body", "Each Session"),
("🎯", "10-20 Sets", "Per Muscle / Week"),
("⏱️", "60-90 sec", "Rest Between Sets"),
("💪", "Stop 2-3 reps", "Before Failure"),
]
ov_cells = []
for icon, bold, sub in overview_items:
s1 = ParagraphStyle("ov1", fontName="Helvetica-Bold", fontSize=9, textColor=DARK_BLUE, alignment=TA_CENTER, leading=12)
s2 = ParagraphStyle("ov2", fontName="Helvetica", fontSize=7.5, textColor=MID_BLUE, alignment=TA_CENTER, leading=10)
ov_cells.append([
Paragraph(f"{icon} <b>{bold}</b>", s1),
Paragraph(sub, s2),
])
ov_col = [178*mm / 5] * 5
ov_t = Table([[[Paragraph(f"{icon} <b>{bold}</b>", ParagraphStyle('x', fontName='Helvetica-Bold', fontSize=8.5, textColor=DARK_BLUE, alignment=TA_CENTER, leading=13)),
Paragraph(sub, ParagraphStyle('y', fontName='Helvetica', fontSize=7.5, textColor=MID_BLUE, alignment=TA_CENTER, leading=10))]
for icon, bold, sub in overview_items]],
colWidths=ov_col)
# Flatten the overview into a proper single-row multi-col table
ov_row = []
for icon, bold, sub in overview_items:
s1 = ParagraphStyle("ov1", fontName="Helvetica-Bold", fontSize=9, textColor=DARK_BLUE, alignment=TA_CENTER, leading=13)
s2 = ParagraphStyle("ov2", fontName="Helvetica", fontSize=7.5, textColor=colors.HexColor("#4A7FAA"), alignment=TA_CENTER, leading=10)
ov_row.append(Paragraph(f"{icon}<br/><b>{bold}</b><br/>{sub}", s1))
ov_t2 = Table([ov_row], colWidths=[178*mm/5]*5)
ov_t2.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
("BOX", (0,0), (-1,-1), 0.5, MID_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, MID_BLUE),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0), (-1,-1), 6),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(ov_t2)
story.append(Spacer(1, 5*mm))
# ── WEEKLY SCHEDULE ───────────────────────────────────────────────────────────
story.append(header_table("📆 WEEKLY SCHEDULE", bg=MID_BLUE))
story.append(Spacer(1, 2*mm))
week_days = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
week_sess = ["Day A (Push + Legs)","Rest / Light Walk","Day B (Pull + Core)","Rest / Light Walk","Day C (Full Body)","Active Recovery","Full Rest"]
week_bg = [LIGHT_BLUE, WHITE, LIGHT_BLUE, WHITE, LIGHT_BLUE, colors.HexColor("#FFF8EC"), colors.HexColor("#F0F4F0")]
week_fc = [DARK_BLUE]*7
ws_hdr = [
Paragraph("<b>Day</b>", ParagraphStyle("wh", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
Paragraph("<b>Session</b>", ParagraphStyle("wh", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
Paragraph("<b>✓ Done</b>", ParagraphStyle("wh", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE, alignment=TA_CENTER)),
]
ws_rows = [ws_hdr]
for d, s, bg in zip(week_days, week_sess, week_bg):
cs = ParagraphStyle("wc", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE)
cc = ParagraphStyle("wcc", fontName="Helvetica", fontSize=10, textColor=MID_GREY, alignment=TA_CENTER)
ws_rows.append([Paragraph(f"<b>{d}</b>", cs), Paragraph(s, cs), Paragraph("☐", cc)])
ws_t = Table(ws_rows, colWidths=[35*mm, 120*mm, 23*mm])
ws_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("GRID", (0,0), (-1,-1), 0.3, MID_GREY),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("LEFTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(ws_t)
story.append(Spacer(1, 5*mm))
# ── DAY A ────────────────────────────────────────────────────────────────────
story.append(header_table("DAY A — Push + Legs (Monday)", bg=DARK_BLUE))
story.append(Spacer(1, 2*mm))
day_a = [
("Push-Ups", "3", "8-15", "Chest, Shoulders, Triceps"),
("Pike Push-Ups", "3", "8-12", "Shoulders, Upper Chest"),
("Diamond Push-Ups", "2", "8-12", "Triceps, Inner Chest"),
("Bodyweight Squat", "3", "15-20", "Quads, Glutes, Hamstrings"),
("Reverse Lunges", "3", "10/leg","Glutes, Quads, Balance"),
("Glute Bridges", "3", "15-20", "Glutes, Hamstrings"),
("Single-Leg Calf Raises", "3", "15/leg","Calves"),
]
story.append(exercise_table(day_a))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("<i>Notes / Weight used / RPE:</i> _______________________________________________________", note_style))
story.append(Spacer(1, 5*mm))
# ── DAY B ────────────────────────────────────────────────────────────────────
story.append(header_table("DAY B — Pull + Core (Wednesday)", bg=DARK_BLUE))
story.append(Spacer(1, 2*mm))
day_b = [
("Pull-Ups or Inverted Rows*", "3", "5-10", "Back, Biceps"),
("Bodyweight Rows (table)", "3", "10-15", "Mid-Back, Rear Delts"),
("Superman Hold", "3", "10-12", "Lower Back, Glutes"),
("Plank", "3", "30-45 sec","Core Stability"),
("Dead Bug", "3", "8/side", "Deep Core"),
("Hollow Body Hold", "3", "20-30 sec","Full Core"),
("Bicycle Crunches", "3", "12/side", "Obliques, Abs"),
]
story.append(exercise_table(day_b))
story.append(Spacer(1, 1*mm))
story.append(Paragraph("<i>* If pull-ups are too hard, use inverted rows under a sturdy table or low bar.</i>", note_style))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("<i>Notes / Weight used / RPE:</i> _______________________________________________________", note_style))
story.append(Spacer(1, 5*mm))
# ── DAY C ────────────────────────────────────────────────────────────────────
story.append(header_table("DAY C — Full Body Compound (Friday)", bg=DARK_BLUE))
story.append(Spacer(1, 2*mm))
day_c = [
("Jump Squats (or Deep Squats)", "3", "10-15", "Full Lower Body"),
("Decline / Incline Push-Ups", "3", "10-15", "Chest (Different Angles)"),
("Step-Ups (chair or stair)", "3", "10/leg", "Glutes, Quads"),
("Chair Dips", "3", "8-12", "Triceps, Lower Chest"),
("Single-Leg Glute Bridge", "3", "10-12/leg","Glutes, Hamstrings"),
("Mountain Climbers", "3", "20/side", "Core, Shoulders"),
("Inverted Rows", "3", "10-15", "Back, Biceps"),
]
story.append(exercise_table(day_c))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("<i>Notes / Weight used / RPE:</i> _______________________________________________________", note_style))
# ── PAGE 2 ────────────────────────────────────────────────────────────────────
story.append(PageBreak())
# ── PROGRESSIVE OVERLOAD ──────────────────────────────────────────────────────
story.append(header_table("📈 PROGRESSIVE OVERLOAD — How to Keep Growing", bg=MID_BLUE))
story.append(Spacer(1, 3*mm))
po_methods = [
("1. More Reps", "Hit the top of the rep range before progressing (e.g. 3×15 push-ups → next variation)"),
("2. Harder Variation","Move to a more challenging exercise version (see ladder below)"),
("3. More Sets", "Add a 4th set once 3 sets feel manageable"),
("4. Slower Tempo", "Add a 3-second lowering phase to increase time under tension"),
("5. Reduce Rest", "Shorter rest periods (60 s → 45 s) increase difficulty"),
]
po_rows = [[Paragraph(f"<b>{m}</b>", rule_label), Paragraph(d, rule_body)] for m, d in po_methods]
po_t = Table(po_rows, colWidths=[48*mm, 130*mm])
po_t.setStyle(TableStyle([
("GRID", (0,0), (-1,-1), 0.3, MID_GREY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[LIGHT_GREY, WHITE]),
("LEFTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(po_t)
story.append(Spacer(1, 5*mm))
# ── PROGRESSION LADDER ────────────────────────────────────────────────────────
story.append(header_table("🪜 EXERCISE PROGRESSION LADDER", bg=DARK_BLUE))
story.append(Spacer(1, 2*mm))
ladder = [
("Push-Ups", "Incline → Standard → Decline → Archer → One-Arm Assisted → One-Arm"),
("Squats", "Bodyweight → Pause Squat (3 s) → Bulgarian Split Squat → Shrimp Squat → Pistol Squat"),
("Pull-Ups", "Table Row → Assisted (band/foot) → Negative Pull-Up → Full Pull-Up → Weighted (backpack)"),
("Dips", "Bench Dip → Chair Dip → Parallel Bar Dip → Ring Dip"),
]
story.append(progress_table(ladder))
story.append(Spacer(1, 5*mm))
# ── KEY RULES ─────────────────────────────────────────────────────────────────
story.append(header_table("✅ KEY RULES FOR BEGINNERS", bg=MID_BLUE))
story.append(Spacer(1, 2*mm))
rules = [
("Stop 2-3 reps before failure", "Reduces injury risk while still driving muscle growth"),
("Prioritise form over reps", "Bad form = wasted effort + injury risk"),
("Sleep 7-9 hours / night", "Most muscle repair happens during deep sleep"),
("Eat 1.6-2.2 g protein/kg BW", "Protein is the raw material for muscle synthesis"),
("Be consistent for 8+ weeks", "Visible results take time — trust the process"),
]
rule_rows = [[Paragraph(f"<b>{r}</b>", rule_label), Paragraph(d, rule_body)] for r, d in rules]
rule_t = Table(rule_rows, colWidths=[72*mm, 106*mm])
rule_t.setStyle(TableStyle([
("GRID", (0,0), (-1,-1), 0.3, MID_GREY),
("ROWBACKGROUNDS",(0,0),(-1,-1),[LIGHT_GREY, WHITE]),
("LEFTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(rule_t)
story.append(Spacer(1, 5*mm))
# ── WHAT TO EXPECT ────────────────────────────────────────────────────────────
story.append(header_table("🗓️ WHAT TO EXPECT — Timeline", bg=DARK_BLUE))
story.append(Spacer(1, 2*mm))
timeline = [
("Weeks 1-3", "Soreness & adaptation", "Learning movement patterns; rapid neural strength gains"),
("Weeks 4-6", "Strength rising fast", "Rep counts climbing; exercises feeling more natural"),
("Weeks 7-12", "First visible changes", "Muscle definition emerging; movements feel second nature"),
("Month 3+", "Level up", "Add resistance bands or a weighted backpack for continued overload"),
]
tl_hdr = [
Paragraph("<b>Phase</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
Paragraph("<b>Focus</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
Paragraph("<b>What Happens</b>", ParagraphStyle("th", fontName="Helvetica-Bold", fontSize=8, textColor=WHITE)),
]
tl_rows = [tl_hdr]
for phase, focus, detail in timeline:
cs = ParagraphStyle("tc", fontName="Helvetica", fontSize=8, textColor=DARK_BLUE, leading=11)
tl_rows.append([Paragraph(f"<b>{phase}</b>", cs), Paragraph(focus, cs), Paragraph(detail, cs)])
tl_t = Table(tl_rows, colWidths=[25*mm, 50*mm, 103*mm])
tl_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("GRID", (0,0), (-1,-1), 0.3, MID_GREY),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("LEFTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(tl_t)
story.append(Spacer(1, 6*mm))
# ── FOOTER ────────────────────────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=0.5, color=MID_GREY))
story.append(Spacer(1, 2*mm))
footer_s = ParagraphStyle("footer", fontName="Helvetica", fontSize=7.5,
textColor=colors.HexColor("#888888"), alignment=TA_CENTER)
story.append(Paragraph(
"Based on evidence-based hypertrophy principles • "
"Train hard, recover well, eat enough protein • "
"Generated by Orris AI • August 2026",
footer_s
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
python /tmp/workspace/workout-pdf/generate_workout_pdf.py
Beginner Bodyweight Workout Checklist
PDF Document · PDF