https://youtube.com/shorts/qeH46nfVxMM?si=Pi6PEEp6HV_SH2yj Can you explain about video
How to explain this in presentation
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "created"
mkdir -p /tmp/workspace/ankle-manipulation && python /tmp/skills/shared/scripts/fetch_images.py "https://d361swluvexzqs.cloudfront.net/chats-attachments/65123-1784742802556-1qfook.jpg" "https://d361swluvexzqs.cloudfront.net/chats-attachments/65124-1784742803705-3vngvp.jpg" "https://d361swluvexzqs.cloudfront.net/chats-attachments/65125-1784742804046-e9f8t8.jpg" > /tmp/workspace/ankle-manipulation/images.json && echo "done"
~/ankle-manipulation/create_pptx.py
import json, base64, subprocess
from io import BytesIO
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from lxml import etree
# Load images
with open("/tmp/workspace/ankle-manipulation/images.json") as f:
images = json.load(f)
def add_bg_color(slide, r, g, b):
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = RGBColor(r, g, b)
def add_text(slide, text, x, y, w, h, font_size=24, bold=False,
color=(255,255,255), align=PP_ALIGN.LEFT, italic=False, wrap=True):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = RGBColor(*color)
run.font.name = "Calibri"
return tb
def add_rect(slide, x, y, w, h, r, g, b, alpha=None):
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE
Inches(x), Inches(y), Inches(w), Inches(h)
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(r, g, b)
shape.line.fill.background()
return shape
def add_image(slide, img_data, x, y, w, h):
if img_data and img_data.get("base64"):
raw = base64.b64decode(img_data["base64"].split(",")[-1])
stream = BytesIO(raw)
slide.shapes.add_picture(stream, Inches(x), Inches(y), Inches(w), Inches(h))
def add_multiline(slide, lines, x, y, w, h, font_size=18, color=(255,255,255)):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
for i, (txt, bold) in enumerate(lines):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.space_before = Pt(4)
run = p.add_run()
run.text = txt
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.color.rgb = RGBColor(*color)
run.font.name = "Calibri"
return tb
# ─── COLORS ──────────────────────────────────────────────────────────────────
DARK_BG = (15, 32, 55) # deep navy
ACCENT = (0, 168, 204) # teal/cyan
ACCENT2 = (255, 165, 0) # orange
WHITE = (255, 255, 255)
LIGHT_BG = (24, 48, 80) # slightly lighter navy for cards
GREEN = (46, 184, 92)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ═══════════════════════════════════════════════════════
# SLIDE 1 - TITLE SLIDE
# ═══════════════════════════════════════════════════════
s1 = prs.slides.add_slide(blank)
add_bg_color(s1, *DARK_BG)
# Left accent bar
add_rect(s1, 0, 0, 0.12, 7.5, *ACCENT)
# Top strip
add_rect(s1, 0.12, 0, 13.2, 0.08, *ACCENT)
# Bottom strip
add_rect(s1, 0.12, 7.42, 13.2, 0.08, *ACCENT)
# Main image on right
add_image(s1, images[0], 7.8, 0.8, 5.1, 6.2)
# Title text area
add_text(s1, "ANKLE JOINT", 0.5, 1.5, 7, 1.2, font_size=44, bold=True,
color=WHITE, align=PP_ALIGN.LEFT)
add_text(s1, "MANIPULATION", 0.5, 2.5, 7, 1.2, font_size=44, bold=True,
color=ACCENT, align=PP_ALIGN.LEFT)
add_text(s1, "Long-Axis Distraction Thrust", 0.5, 3.6, 7, 0.7,
font_size=24, bold=False, color=(180,220,240), align=PP_ALIGN.LEFT)
# Divider line
add_rect(s1, 0.5, 4.45, 6.5, 0.06, *ACCENT2)
# Subtitle
add_text(s1, "Talocrural Joint | Physical Therapy Technique", 0.5, 4.6, 7, 0.6,
font_size=18, color=(200,220,235), align=PP_ALIGN.LEFT)
add_text(s1, "Rehab Science", 0.5, 5.3, 7, 0.5,
font_size=15, italic=True, color=(160,200,230), align=PP_ALIGN.LEFT)
# ═══════════════════════════════════════════════════════
# SLIDE 2 - WHAT IS TALOCRURAL MANIPULATION?
# ═══════════════════════════════════════════════════════
s2 = prs.slides.add_slide(blank)
add_bg_color(s2, *DARK_BG)
add_rect(s2, 0, 0, 13.333, 0.08, *ACCENT)
add_rect(s2, 0, 7.42, 13.333, 0.08, *ACCENT)
# Slide title bar
add_rect(s2, 0, 0.08, 13.333, 1.05, *LIGHT_BG)
add_text(s2, "What Is Talocrural Manipulation?", 0.4, 0.15, 12, 0.9,
font_size=30, bold=True, color=ACCENT, align=PP_ALIGN.LEFT)
# Image left
add_image(s2, images[0], 0.3, 1.3, 4.0, 5.5)
# Info cards on right
card_data = [
("🔷 The Joint", "The talocrural joint is the true ankle joint - formed between the tibia, fibula, and the talus bone. It controls up/down movement of the foot (dorsiflexion & plantarflexion)."),
("🔷 The Technique", "A manual therapy procedure where a trained clinician applies a controlled, high-velocity, low-amplitude (HVLA) thrust to restore joint motion."),
("🔷 The Goal", "Decompress the ankle joint, reduce pain, restore normal range of motion, and improve function."),
]
card_y = 1.3
for title, body in card_data:
add_rect(s2, 4.6, card_y, 8.4, 1.6, *LIGHT_BG)
add_rect(s2, 4.6, card_y, 0.07, 1.6, *ACCENT2)
add_text(s2, title, 4.75, card_y + 0.1, 8.1, 0.45, font_size=16, bold=True, color=ACCENT2)
add_text(s2, body, 4.75, card_y + 0.55, 8.1, 1.0, font_size=14, color=WHITE, wrap=True)
card_y += 1.75
# ═══════════════════════════════════════════════════════
# SLIDE 3 - STEP BY STEP (3 images)
# ═══════════════════════════════════════════════════════
s3 = prs.slides.add_slide(blank)
add_bg_color(s3, *DARK_BG)
add_rect(s3, 0, 0, 13.333, 0.08, *ACCENT)
add_rect(s3, 0, 7.42, 13.333, 0.08, *ACCENT)
# Slide title bar
add_rect(s3, 0, 0.08, 13.333, 1.05, *LIGHT_BG)
add_text(s3, "Step-by-Step: The Technique", 0.4, 0.15, 12, 0.9,
font_size=30, bold=True, color=ACCENT, align=PP_ALIGN.LEFT)
steps = [
(images[0], "STEP 1", "Initial Grip", "The therapist grasps the patient's foot firmly around the talus bone with both hands. Patient lies supine on the treatment table."),
(images[1], "STEP 2", "Apply the Thrust", "A quick, controlled long-axis distraction thrust is delivered - pulling the foot straight out along the leg's axis to decompress the joint."),
(images[2], "STEP 3", "Joint Cavitation", "Listen for the audible 'pop' (cavitation) - gas bubbles releasing from the joint. This confirms successful decompression of the talocrural joint."),
]
col_x = [0.25, 4.6, 8.95]
for i, (img, step_num, step_title, step_desc) in enumerate(steps):
x = col_x[i]
# Image box
add_image(s3, img, x, 1.25, 4.0, 3.0)
# Step badge
add_rect(s3, x, 1.25, 1.1, 0.42, *ACCENT2)
add_text(s3, step_num, x, 1.25, 1.1, 0.42, font_size=13, bold=True, color=(30,30,30), align=PP_ALIGN.CENTER)
# Step title
add_rect(s3, x, 4.28, 4.0, 0.52, *LIGHT_BG)
add_text(s3, step_title, x + 0.05, 4.3, 3.9, 0.45, font_size=16, bold=True, color=ACCENT, align=PP_ALIGN.CENTER)
# Description
add_rect(s3, x, 4.82, 4.0, 2.45, 24, 40, 66)
add_text(s3, step_desc, x + 0.1, 4.9, 3.8, 2.3, font_size=13, color=WHITE, wrap=True, align=PP_ALIGN.LEFT)
# ═══════════════════════════════════════════════════════
# SLIDE 4 - CLINICAL BENEFITS
# ═══════════════════════════════════════════════════════
s4 = prs.slides.add_slide(blank)
add_bg_color(s4, *DARK_BG)
add_rect(s4, 0, 0, 13.333, 0.08, *ACCENT)
add_rect(s4, 0, 7.42, 13.333, 0.08, *ACCENT)
add_rect(s4, 0, 0.08, 13.333, 1.05, *LIGHT_BG)
add_text(s4, "Clinical Benefits & Indications", 0.4, 0.15, 12, 0.9,
font_size=30, bold=True, color=ACCENT, align=PP_ALIGN.LEFT)
benefits = [
("✅ Pain Relief", "Stimulates mechanoreceptors to inhibit pain signals (Gate Control Theory). Immediate reduction in ankle pain."),
("✅ Restore Mobility", "Breaks up joint adhesions and restores normal articular mechanics. Improves dorsiflexion range of motion."),
("✅ Joint Decompression","Long-axis traction separates joint surfaces, reduces compressive forces, and improves synovial fluid distribution."),
("✅ Neurological Effect","Activates large-diameter nerve fibers that inhibit pain transmission through the spinal cord."),
("✅ Post-Sprain Recovery","Particularly effective for restoring motion after ankle sprains and post-surgical stiffness."),
("✅ Osteoarthritis", "Provides short-term pain relief and improved function in patients with ankle osteoarthritis."),
]
# 2 columns of 3
cols = [(0.25, 1.3), (6.85, 1.3)]
row_h = 1.75
for i, (title, body) in enumerate(benefits):
col = i % 2
row = i // 2
x, y_start = cols[col]
y = y_start + row * row_h
add_rect(s4, x, y, 6.3, 1.55, *LIGHT_BG)
add_rect(s4, x, y, 0.07, 1.55, *GREEN)
add_text(s4, title, x + 0.15, y + 0.1, 5.9, 0.45, font_size=15, bold=True, color=GREEN)
add_text(s4, body, x + 0.15, y + 0.55, 5.9, 0.95, font_size=13, color=WHITE, wrap=True)
# ═══════════════════════════════════════════════════════
# SLIDE 5 - CONTRAINDICATIONS & SAFETY
# ═══════════════════════════════════════════════════════
s5 = prs.slides.add_slide(blank)
add_bg_color(s5, *DARK_BG)
add_rect(s5, 0, 0, 13.333, 0.08, *ACCENT)
add_rect(s5, 0, 7.42, 13.333, 0.08, *ACCENT)
add_rect(s5, 0, 0.08, 13.333, 1.05, *LIGHT_BG)
add_text(s5, "Contraindications & Safety", 0.4, 0.15, 12, 0.9,
font_size=30, bold=True, color=(220, 80, 80), align=PP_ALIGN.LEFT)
contra = [
"Acute fractures or stress fractures",
"Severe osteoporosis",
"Acute ligament tears (Grade III)",
"Active infection or osteomyelitis",
"Bone tumors or metastatic disease",
"Hypermobility / ligamentous laxity",
"Vascular insufficiency",
"Patient unable to relax / consent",
]
safe = [
"Always perform a thorough assessment first",
"Obtain informed consent from patient",
"Use graded mobilization before HVLA thrust",
"Only trained clinicians should perform",
"Monitor patient response after technique",
"Document findings and outcomes",
]
# Left: contraindications
add_rect(s5, 0.25, 1.25, 6.2, 0.55, 160, 40, 40)
add_text(s5, "⚠ DO NOT USE WHEN:", 0.3, 1.3, 6.0, 0.45, font_size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
for i, item in enumerate(contra):
add_rect(s5, 0.25, 1.85 + i*0.67, 6.2, 0.60, *LIGHT_BG)
add_rect(s5, 0.25, 1.85 + i*0.67, 0.06, 0.60, 220, 80, 80)
add_text(s5, "✗ " + item, 0.38, 1.88 + i*0.67, 5.9, 0.52, font_size=13, color=(255,180,180))
# Right: safety tips
add_rect(s5, 6.85, 1.25, 6.2, 0.55, 20, 100, 60)
add_text(s5, "✔ SAFETY GUIDELINES:", 6.9, 1.3, 6.0, 0.45, font_size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
for i, item in enumerate(safe):
add_rect(s5, 6.85, 1.85 + i*0.78, 6.2, 0.72, *LIGHT_BG)
add_rect(s5, 6.85, 1.85 + i*0.78, 0.06, 0.72, *GREEN)
add_text(s5, "✓ " + item, 6.98, 1.88 + i*0.78, 5.9, 0.62, font_size=13, color=(180,255,200))
# ═══════════════════════════════════════════════════════
# SLIDE 6 - THE CAVITATION EXPLAINED
# ═══════════════════════════════════════════════════════
s6 = prs.slides.add_slide(blank)
add_bg_color(s6, *DARK_BG)
add_rect(s6, 0, 0, 13.333, 0.08, *ACCENT)
add_rect(s6, 0, 7.42, 13.333, 0.08, *ACCENT)
add_rect(s6, 0, 0.08, 13.333, 1.05, *LIGHT_BG)
add_text(s6, "Understanding the 'Pop' - Joint Cavitation", 0.4, 0.15, 12, 0.9,
font_size=28, bold=True, color=ACCENT, align=PP_ALIGN.LEFT)
# Large image center
add_image(s6, images[2], 0.25, 1.25, 4.5, 5.9)
# Explanation boxes
cav_points = [
("What is the 'Pop'?", ACCENT2,
"The audible 'crack' or 'pop' is called joint cavitation. It is caused by the rapid formation and collapse of gas bubbles (mainly CO₂) within the synovial fluid of the joint."),
("Is it Harmful?", GREEN,
"No. The cavitation sound is harmless. It does NOT mean bones are cracking or that damage is occurring. Research confirms it is simply gas bubble dynamics in the joint space."),
("Does it Need to Pop?", (180,180,255),
"Not always. A successful manipulation can occur without audible cavitation. The therapeutic benefit comes from the joint movement itself, not the sound."),
("After the Pop?", (255,180,100),
"A 20-30 minute 'refractory period' follows - the joint cannot cavitate again immediately as gases need time to redissolve into the synovial fluid."),
]
box_y = 1.25
for title, col, body in cav_points:
add_rect(s6, 5.05, box_y, 7.95, 1.4, *LIGHT_BG)
add_rect(s6, 5.05, box_y, 0.08, 1.4, *col)
add_text(s6, title, 5.2, box_y + 0.1, 7.6, 0.45, font_size=15, bold=True, color=col)
add_text(s6, body, 5.2, box_y + 0.55, 7.6, 0.82, font_size=13, color=WHITE, wrap=True)
box_y += 1.5
# ═══════════════════════════════════════════════════════
# SLIDE 7 - SUMMARY / KEY TAKEAWAYS
# ═══════════════════════════════════════════════════════
s7 = prs.slides.add_slide(blank)
add_bg_color(s7, *DARK_BG)
add_rect(s7, 0, 0, 13.333, 0.08, *ACCENT)
add_rect(s7, 0, 7.42, 13.333, 0.08, *ACCENT)
add_rect(s7, 0, 0.08, 13.333, 1.05, *LIGHT_BG)
add_text(s7, "Key Takeaways", 0.4, 0.15, 12, 0.9,
font_size=30, bold=True, color=ACCENT, align=PP_ALIGN.LEFT)
takeaways = [
("1", "The talocrural (ankle) joint manipulation uses a long-axis distraction thrust to decompress the ankle joint and restore mobility."),
("2", "The therapist grips the talus bone and applies a quick pulling force along the leg's axis - a high-velocity, low-amplitude (HVLA) technique."),
("3", "The audible 'pop' (cavitation) is caused by gas bubbles in synovial fluid - it is safe and indicates successful joint decompression."),
("4", "Benefits include pain relief, improved range of motion, reduced stiffness, and enhanced recovery from ankle sprains and osteoarthritis."),
("5", "Only trained physical therapists, chiropractors, or osteopaths should perform this technique after ruling out contraindications."),
]
for i, (num, text) in enumerate(takeaways):
y = 1.35 + i * 1.15
add_rect(s7, 0.25, y, 0.7, 0.85, *ACCENT2)
add_text(s7, num, 0.25, y, 0.7, 0.85, font_size=26, bold=True, color=(30,30,30), align=PP_ALIGN.CENTER)
add_rect(s7, 1.1, y, 11.9, 0.85, *LIGHT_BG)
add_text(s7, text, 1.2, y + 0.08, 11.7, 0.72, font_size=15, color=WHITE, wrap=True)
# Credit
add_text(s7, "Source: Rehab Science | @RehabScience", 0.4, 7.0, 12.5, 0.38,
font_size=12, italic=True, color=(120, 160, 200), align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════
# SAVE
# ═══════════════════════════════════════════════════════
out_path = "/tmp/workspace/ankle-manipulation/Ankle_Joint_Manipulation.pptx"
prs.save(out_path)
print(f"Saved: {out_path}")
cd /tmp/workspace/ankle-manipulation && python create_pptx.py
Ankle Joint Manipulation
Presentation · PPTX
| Slide | Title | Content |
|---|---|---|
| 1 | Title Slide | "Ankle Joint Manipulation - Long-Axis Distraction Thrust" with your video screenshot |
| 2 | What Is Talocrural Manipulation? | Explains the joint anatomy, technique definition, and goal |
| 3 | Step-by-Step Technique | All 3 of your screenshots with captions for each step |
| 4 | Clinical Benefits | 6 benefit cards: pain relief, mobility, decompression, neurological effects, etc. |
| 5 | Contraindications & Safety | Red warning cards (when NOT to use) + green safety guidelines |
| 6 | Understanding the 'Pop' | Explains joint cavitation using your 3rd screenshot |
| 7 | Key Takeaways | 5 summary points with numbered callouts |
Generate a speaker notes document to go with these slides
~/ankle-manipulation/create_speaker_notes.py
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
doc = Document()
# ── Page margins ──────────────────────────────────────────────────────────────
section = doc.sections[0]
section.page_width = Inches(8.5)
section.page_height = Inches(11)
section.top_margin = Inches(1.0)
section.bottom_margin = Inches(1.0)
section.left_margin = Inches(1.1)
section.right_margin = Inches(1.1)
# ── Default style ─────────────────────────────────────────────────────────────
normal = doc.styles["Normal"]
normal.font.name = "Calibri"
normal.font.size = Pt(11)
# ── Helper functions ──────────────────────────────────────────────────────────
def add_colored_heading(doc, text, level, r, g, b):
p = doc.add_heading(text, level=level)
for run in p.runs:
run.font.color.rgb = RGBColor(r, g, b)
return p
def add_para(doc, text, indent=False, bullet=False, bold_prefix=None):
p = doc.add_paragraph()
if indent:
p.paragraph_format.left_indent = Inches(0.35)
if bullet:
p.paragraph_format.left_indent = Inches(0.35)
p.paragraph_format.first_line_indent = Inches(-0.2)
p.paragraph_format.space_after = Pt(4)
if bold_prefix:
run = p.add_run(bold_prefix)
run.bold = True
run.font.name = "Calibri"
run.font.size = Pt(11)
run = p.add_run(text)
run.font.name = "Calibri"
run.font.size = Pt(11)
else:
if bullet:
run = p.add_run("• " + text)
else:
run = p.add_run(text)
run.font.name = "Calibri"
run.font.size = Pt(11)
return p
def add_timing_box(doc, time_str):
p = doc.add_paragraph()
p.paragraph_format.space_before = Pt(2)
p.paragraph_format.space_after = Pt(6)
run = p.add_run(f" ⏱ Suggested time: {time_str}")
run.font.name = "Calibri"
run.font.size = Pt(10)
run.font.italic = True
run.font.color.rgb = RGBColor(80, 80, 80)
def add_tip_box(doc, text):
p = doc.add_paragraph()
p.paragraph_format.left_indent = Inches(0.25)
p.paragraph_format.space_after = Pt(6)
run = p.add_run("💡 Presenter Tip: ")
run.bold = True
run.font.name = "Calibri"
run.font.size = Pt(10.5)
run.font.color.rgb = RGBColor(0, 140, 170)
run2 = p.add_run(text)
run2.font.name = "Calibri"
run2.font.size = Pt(10.5)
run2.font.color.rgb = RGBColor(50, 50, 50)
run2.font.italic = True
def add_divider(doc):
p = doc.add_paragraph("─" * 72)
p.paragraph_format.space_before = Pt(4)
p.paragraph_format.space_after = Pt(4)
for run in p.runs:
run.font.color.rgb = RGBColor(180, 180, 180)
run.font.size = Pt(9)
def add_question_box(doc, questions):
p = doc.add_paragraph()
run = p.add_run("❓ Audience Engagement:")
run.bold = True
run.font.name = "Calibri"
run.font.size = Pt(10.5)
run.font.color.rgb = RGBColor(200, 100, 0)
for q in questions:
add_para(doc, q, bullet=True)
# ── COVER PAGE ────────────────────────────────────────────────────────────────
doc.add_paragraph()
doc.add_paragraph()
title_p = doc.add_paragraph()
title_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
tr = title_p.add_run("SPEAKER NOTES")
tr.font.name = "Calibri"
tr.font.size = Pt(28)
tr.bold = True
tr.font.color.rgb = RGBColor(0, 90, 130)
sub_p = doc.add_paragraph()
sub_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
sr = sub_p.add_run("Ankle Joint Manipulation: Long-Axis Distraction Thrust")
sr.font.name = "Calibri"
sr.font.size = Pt(16)
sr.font.color.rgb = RGBColor(60, 60, 60)
doc.add_paragraph()
info_p = doc.add_paragraph()
info_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
ir = info_p.add_run("Based on Rehab Science | @RehabScience • 7-Slide Presentation")
ir.font.name = "Calibri"
ir.font.size = Pt(11)
ir.font.italic = True
ir.font.color.rgb = RGBColor(100, 100, 100)
doc.add_paragraph()
doc.add_paragraph()
# Quick guide box
guide_p = doc.add_paragraph()
guide_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
gr = guide_p.add_run("Total Suggested Duration: 20–30 minutes")
gr.font.name = "Calibri"
gr.font.size = Pt(13)
gr.bold = True
gr.font.color.rgb = RGBColor(0, 140, 60)
doc.add_paragraph()
# How to use this doc
add_colored_heading(doc, "How to Use This Document", 2, 0, 90, 130)
add_para(doc, "This document provides word-for-word speaker notes for each slide in the presentation. "
"Each section includes:")
for item in [
"Slide summary - what the audience sees",
"Full script - suggested spoken text (read naturally, not verbatim)",
"Presenter tips - cues for pausing, pointing, or engaging the audience",
"Suggested timing - approximate time per slide",
"Audience questions - prompts to encourage interaction",
]:
add_para(doc, item, bullet=True)
doc.add_page_break()
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 - TITLE SLIDE
# ═══════════════════════════════════════════════════════════════════════════════
add_colored_heading(doc, "SLIDE 1 — Title Slide", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "What's on Screen", 3, 80, 80, 80)
add_para(doc, "Title: 'Ankle Joint Manipulation — Long-Axis Distraction Thrust'. "
"A clinical photo showing a therapist gripping a patient's foot on a treatment table.")
add_colored_heading(doc, "Speaker Script", 3, 0, 120, 160)
add_para(doc, "Good [morning/afternoon/evening] everyone. Today we're going to look at a "
"specific manual therapy technique called the talocrural joint manipulation — "
"more specifically, a long-axis distraction thrust applied to the ankle.")
doc.add_paragraph()
add_para(doc, "This technique comes from a short demonstration by Rehab Science, and over the next "
"few minutes we'll break it down completely — what it is, how it's performed, "
"why it works, and when it's appropriate to use.")
doc.add_paragraph()
add_para(doc, "Whether you're a student, a clinician, or just someone curious about physical therapy, "
"by the end of this presentation you'll have a solid understanding of exactly "
"what's happening when a therapist performs an ankle manipulation.")
add_timing_box(doc, "1–2 minutes")
add_tip_box(doc, "Make eye contact with the audience before starting. Let the image on the slide "
"speak for itself for a few seconds — let them observe what's happening before you explain.")
add_divider(doc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 - WHAT IS TALOCRURAL MANIPULATION?
# ═══════════════════════════════════════════════════════════════════════════════
add_colored_heading(doc, "SLIDE 2 — What Is Talocrural Manipulation?", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "What's on Screen", 3, 80, 80, 80)
add_para(doc, "Three information cards explaining the joint anatomy, the technique definition, "
"and the treatment goal. Clinical photo of the therapist's grip on the left.")
add_colored_heading(doc, "Speaker Script", 3, 0, 120, 160)
add_para(doc, "Let's start with some anatomy. The talocrural joint — also simply called the ankle joint — "
"is where the two lower leg bones, the tibia and fibula, come together to form a socket "
"around the talus, which is the uppermost bone of the foot.")
doc.add_paragraph()
add_para(doc, "This joint is responsible for the up-and-down rocking motion of the foot — "
"what we call dorsiflexion when you pull your toes up, and plantarflexion when "
"you push them down. Think of climbing stairs or walking — this joint does a lot of work.")
doc.add_paragraph()
add_para(doc, "Now, manipulation in physical therapy is a manual technique where the clinician "
"applies a controlled, very rapid, small-amplitude force to a joint. "
"You'll hear the terms HVLA — high velocity, low amplitude. That means a quick "
"movement, but only over a small distance.")
doc.add_paragraph()
add_para(doc, "The goal here is threefold: first, decompress the joint — reduce the compressive "
"forces that cause pain. Second, restore normal range of motion that may have been "
"lost from injury or stiffness. And third, reduce pain through neurological mechanisms "
"that we'll cover in a moment.")
add_timing_box(doc, "2–3 minutes")
add_tip_box(doc, "Point to the clinical photo when mentioning the talus grip. If you have a model or "
"can touch your own ankle, this is a great moment to show where the talus sits "
"(just below the shin, above the heel).")
add_question_box(doc, [
"Has anyone here ever had an ankle sprain or ankle stiffness? Keep that in mind as we go through this.",
])
add_divider(doc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 - STEP BY STEP
# ═══════════════════════════════════════════════════════════════════════════════
add_colored_heading(doc, "SLIDE 3 — Step-by-Step: The Technique", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "What's on Screen", 3, 80, 80, 80)
add_para(doc, "Three screenshots from the video side-by-side: Step 1 (initial grip), "
"Step 2 (applying the thrust), Step 3 (cavitation cue). Each with a description below.")
add_colored_heading(doc, "Speaker Script", 3, 0, 120, 160)
add_para(doc, "Now let's walk through the actual technique, step by step.")
doc.add_paragraph()
add_para(doc, "Step 1 — Initial Positioning and Grip", bold_prefix="")
add_para(doc, "The patient lies flat on their back on the treatment table with their leg straight. "
"The therapist stands at the foot of the table. Notice how the therapist's hands are "
"positioned — both hands wrap around the foot and grasp firmly around the talus bone. "
"This specific grip is important: you're not gripping the toes, the heel, or the mid-foot. "
"You're specifically targeting the talus to ensure the force goes directly into "
"the talocrural joint.", indent=True)
doc.add_paragraph()
add_para(doc, "Step 2 — The Long-Axis Distraction Thrust", bold_prefix="")
add_para(doc, "Here's where the manipulation actually happens. The therapist takes up the slack in "
"the soft tissues — this is called 'taking up the slack' — and then delivers a quick, "
"decisive pull along the long axis of the leg. Not sideways, not rotating — "
"straight out, as if pulling the foot away from the body.", indent=True)
doc.add_paragraph()
add_para(doc, "The 'thrust' is the high-velocity part — it's fast, controlled, and only travels "
"a short distance. The patient should be fully relaxed. Tension in the patient's muscles "
"makes the technique harder to perform and less effective.", indent=True)
doc.add_paragraph()
add_para(doc, "Step 3 — The Cavitation", bold_prefix="")
add_para(doc, "In the third image and in the video, the therapist asks you to 'listen for the joint "
"cavitation or pop.' That pop is the hallmark sound of a successful manipulation, "
"though — and this is important — it doesn't always occur, and the technique can still "
"be effective without it. We'll explain the science of that sound on the next slide.", indent=True)
add_timing_box(doc, "3–4 minutes")
add_tip_box(doc, "Walk through each image slowly. This is the most visual slide — give the audience "
"time to observe the hand position changes between Step 1 and Step 2. "
"Mime the pulling motion with your own hands if it helps illustrate the long-axis direction.")
add_question_box(doc, [
"Can anyone see why the grip position matters? What might happen if you gripped the heel instead?",
])
add_divider(doc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 - CLINICAL BENEFITS
# ═══════════════════════════════════════════════════════════════════════════════
add_colored_heading(doc, "SLIDE 4 — Clinical Benefits & Indications", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "What's on Screen", 3, 80, 80, 80)
add_para(doc, "Six benefit cards: pain relief, restored mobility, joint decompression, "
"neurological effects, post-sprain recovery, and osteoarthritis.")
add_colored_heading(doc, "Speaker Script", 3, 0, 120, 160)
add_para(doc, "So why do therapists use this technique? There are actually several well-supported "
"mechanisms at play.")
doc.add_paragraph()
benefits_script = [
("Pain Relief",
"The manipulation stimulates mechanoreceptors — pressure-sensitive nerve endings inside "
"the joint capsule. These large-diameter nerve fibers transmit signals faster than pain "
"fibers, effectively 'closing the gate' on pain transmission. This is the Gate Control Theory "
"of pain, first described by Melzack and Wall in 1965. It explains why rubbing an injury "
"actually helps — same principle."),
("Restoring Mobility",
"Joint manipulation mechanically breaks up adhesions — sticky, fibrous tissue that forms "
"in a joint after injury or prolonged immobility. It also stretches the joint capsule, "
"giving back the end-range motion that patients often lose after ankle sprains."),
("Joint Decompression",
"The long-axis traction force literally separates the joint surfaces. This reduces "
"compressive loads, which is particularly helpful in osteoarthritis where cartilage "
"breakdown causes bone-on-bone pain."),
("Neurological Effects",
"Beyond gate control, manipulation also triggers endorphin release and changes the "
"sensitivity of pain receptors in the area — a process called central sensitization reversal."),
("Post-Sprain Recovery",
"Ankle sprains often leave patients with restricted dorsiflexion — they can't bend "
"the ankle upward properly. This limits walking, squatting, and stair-climbing. "
"Manipulation directly targets this restriction."),
("Osteoarthritis",
"Research supports short-term benefits in ankle OA patients — reduced pain scores "
"and improved function, though regular sessions are usually needed."),
]
for title, text in benefits_script:
add_para(doc, title + " — ", bold_prefix="")
add_para(doc, text, indent=True)
doc.add_paragraph()
add_timing_box(doc, "3–4 minutes")
add_tip_box(doc, "You don't need to cover every card in depth. Pick 2-3 that are most relevant "
"to your audience. For a student audience, emphasize the Gate Control Theory — "
"it's a concept that appears frequently in exams and clinical reasoning.")
add_question_box(doc, [
"Which of these benefits do you think would matter most to a patient recovering from a sports ankle sprain?",
"Has anyone heard of Gate Control Theory before?",
])
add_divider(doc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 - CONTRAINDICATIONS
# ═══════════════════════════════════════════════════════════════════════════════
add_colored_heading(doc, "SLIDE 5 — Contraindications & Safety", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "What's on Screen", 3, 80, 80, 80)
add_para(doc, "Left column (red): situations where the technique must NOT be used. "
"Right column (green): safety and best-practice guidelines.")
add_colored_heading(doc, "Speaker Script", 3, 0, 120, 160)
add_para(doc, "Every effective technique also has situations where it should not be used. "
"As clinicians and students, understanding contraindications is just as important "
"as understanding the benefits.")
doc.add_paragraph()
add_para(doc, "The absolute contraindications — the hard stops — include:")
for item in [
"Acute fractures: You must never manipulate a fractured ankle. Always rule out fracture first with the Ottawa Ankle Rules — a simple clinical decision tool that helps determine when an X-ray is needed.",
"Severe osteoporosis: The bone may not withstand the thrust force, risking fracture.",
"Acute Grade III ligament tears: When the ligament is completely torn, the joint is already hypermobile — adding more force is dangerous.",
"Active infection or bone tumors: Manipulation could spread infection or damage pathological bone.",
"Vascular insufficiency: Poor circulation means the tissues cannot handle the stress of manipulation.",
]:
add_para(doc, item, bullet=True)
doc.add_paragraph()
add_para(doc, "On the safety side, always remember:")
for item in [
"Assessment first — a thorough examination before any intervention is non-negotiable.",
"Informed consent — explain what you are about to do, including the possibility of a popping sound, before you perform the technique.",
"Graded progression — consider gentler mobilizations (Maitland Grades I-IV) before moving to a Grade V HVLA thrust.",
"Only trained clinicians should perform this. It is not a technique to attempt without proper hands-on training and supervision.",
]:
add_para(doc, item, bullet=True)
add_timing_box(doc, "2–3 minutes")
add_tip_box(doc, "Emphasize the Ottawa Ankle Rules if your audience is clinical. It's a practical tool "
"they can use immediately. If time is short, at minimum stress: fracture rule-out first, "
"consent always, training required.")
add_question_box(doc, [
"If a patient walks in and says their ankle 'just feels stiff' after a sprain from 3 weeks ago — is that a candidate for this technique?",
])
add_divider(doc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 - THE CAVITATION
# ═══════════════════════════════════════════════════════════════════════════════
add_colored_heading(doc, "SLIDE 6 — Understanding the 'Pop' — Joint Cavitation", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "What's on Screen", 3, 80, 80, 80)
add_para(doc, "Clinical photo of the thrust being performed. Four explanation boxes: "
"what the pop is, is it harmful, does it need to pop, and what happens after.")
add_colored_heading(doc, "Speaker Script", 3, 0, 120, 160)
add_para(doc, "This is the question I get asked most often: what IS that popping sound, "
"and should patients be worried about it?")
doc.add_paragraph()
add_para(doc, "The sound is called joint cavitation. Here's the science behind it. "
"Your joints are filled with synovial fluid — a viscous lubricating liquid. "
"Dissolved within that fluid are gases, mainly carbon dioxide. When the joint "
"is rapidly distracted — pulled apart — the pressure inside the joint drops very quickly. "
"This causes those dissolved gases to suddenly come out of solution and form bubbles. "
"The collapse or rapid formation of those bubbles is what creates the popping sound.")
doc.add_paragraph()
add_para(doc, "Think of it like opening a carbonated drink. The gas is dissolved under pressure. "
"When you release the pressure — pop the cap — the gas escapes. Same principle, "
"just inside a joint.")
doc.add_paragraph()
add_para(doc, "Is it harmful? No. This has been studied extensively. The popping sound does not "
"indicate bone cracking, joint damage, or anything negative. However, patients "
"sometimes find it alarming the first time — so always warn them in advance.")
doc.add_paragraph()
add_para(doc, "Does the joint need to pop for the technique to work? No. Many successful manipulations "
"occur without any audible cavitation. The therapeutic benefit comes from the joint "
"movement and the neurological response — not from the sound itself.")
doc.add_paragraph()
add_para(doc, "After cavitation, there's a refractory period of about 20 to 30 minutes where the "
"joint typically won't cavitate again. This is because the gases need time to redissolve "
"back into the synovial fluid. This is why you can't just keep cracking the same joint "
"repeatedly in a session.")
add_timing_box(doc, "2–3 minutes")
add_tip_box(doc, "The carbonated drink analogy is very effective with lay audiences and students alike. "
"Use it and then pause — let it sink in. For clinical audiences you can add that "
"the 2015 MRI study by Kawchuk et al. actually filmed cavitation occurring in real time "
"in a knuckle joint, finally confirming the bubble formation theory.")
add_question_box(doc, [
"Hands up — has anyone ever had their ankle or knuckle 'cracked' by a therapist or doctor? What did it feel like?",
])
add_divider(doc)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 - KEY TAKEAWAYS
# ═══════════════════════════════════════════════════════════════════════════════
add_colored_heading(doc, "SLIDE 7 — Key Takeaways", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "What's on Screen", 3, 80, 80, 80)
add_para(doc, "Five numbered summary points covering the full technique, its mechanism, "
"benefits, safety, and clinical application.")
add_colored_heading(doc, "Speaker Script", 3, 0, 120, 160)
add_para(doc, "Let's bring it all together with five key points to take away from today.")
doc.add_paragraph()
takeaways_script = [
("The Technique",
"The talocrural long-axis distraction thrust is a high-velocity, low-amplitude manipulation "
"that pulls the ankle joint surfaces apart along the leg's axis. The therapist's hands "
"specifically grip the talus bone to direct the force into the correct joint."),
("The Mechanics",
"The rapid joint distraction decompresses the ankle, stretches the joint capsule, breaks up "
"adhesions, and triggers gas bubble formation in the synovial fluid — the cavitation or 'pop.'"),
("The Benefits",
"Clinically, patients experience pain relief through Gate Control mechanisms, restored "
"range of motion especially dorsiflexion, and improved function. This is supported by evidence "
"in post-sprain rehab, chronic ankle stiffness, and ankle osteoarthritis."),
("The Safety",
"Always assess first. Rule out fracture with Ottawa Ankle Rules. Obtain consent. "
"Screen for contraindications. This is a trained-clinician-only technique."),
("The 'Pop'",
"The cavitation sound is harmless gas bubble dynamics in the synovial fluid. "
"It does not need to occur for the technique to be effective."),
]
for i, (title, text) in enumerate(takeaways_script, 1):
p = doc.add_paragraph()
r1 = p.add_run(f"{i}. {title}: ")
r1.bold = True
r1.font.name = "Calibri"
r1.font.size = Pt(12)
r1.font.color.rgb = RGBColor(0, 130, 170)
r2 = p.add_run(text)
r2.font.name = "Calibri"
r2.font.size = Pt(11)
p.paragraph_format.space_after = Pt(8)
doc.add_paragraph()
add_para(doc, "Close with something like:")
add_para(doc,
'"If you ever see a therapist perform this technique on a patient, or experience it yourself, '
'now you know exactly what is happening, why it is being done, and what that pop means. '
'Are there any questions?"',
indent=True)
add_timing_box(doc, "2–3 minutes")
add_tip_box(doc, "Read the takeaways slowly — one at a time. Pause after each one. "
"Then open the floor to questions. If you have extra time, offer to replay "
"the original Rehab Science video with the sound on so the audience can hear "
"the actual cavitation.")
add_question_box(doc, [
"What patient population do you think would benefit most from this technique?",
"What assessment would you do first before considering this treatment?",
"Any other questions?",
])
add_divider(doc)
# ═══════════════════════════════════════════════════════════════════════════════
# APPENDIX - QUICK REFERENCE
# ═══════════════════════════════════════════════════════════════════════════════
doc.add_page_break()
add_colored_heading(doc, "APPENDIX — Quick Reference Card", 1, 0, 90, 130)
add_divider(doc)
add_colored_heading(doc, "Slide Timing Summary", 2, 60, 60, 60)
timing_rows = [
("Slide 1", "Title Slide", "1–2 min"),
("Slide 2", "What Is Talocrural Manipulation?", "2–3 min"),
("Slide 3", "Step-by-Step: The Technique", "3–4 min"),
("Slide 4", "Clinical Benefits & Indications", "3–4 min"),
("Slide 5", "Contraindications & Safety", "2–3 min"),
("Slide 6", "Understanding the 'Pop'", "2–3 min"),
("Slide 7", "Key Takeaways + Q&A", "4–6 min"),
("TOTAL", "", "17–25 min"),
]
table = doc.add_table(rows=1, cols=3)
table.style = "Table Grid"
hdr = table.rows[0].cells
hdr[0].text = "Slide"
hdr[1].text = "Title"
hdr[2].text = "Time"
for cell in hdr:
for p in cell.paragraphs:
for r in p.runs:
r.bold = True
r.font.name = "Calibri"
r.font.size = Pt(11)
for slide, title, time in timing_rows:
row = table.add_row().cells
row[0].text = slide
row[1].text = title
row[2].text = time
if slide == "TOTAL":
for cell in row:
for p in cell.paragraphs:
for r in p.runs:
r.bold = True
doc.add_paragraph()
add_colored_heading(doc, "Key Terms to Know", 2, 60, 60, 60)
terms = [
("Talocrural joint", "The true ankle joint — between tibia/fibula and the talus bone."),
("HVLA thrust", "High-Velocity Low-Amplitude — the defining feature of joint manipulation."),
("Long-axis distraction", "Pulling force applied along the length of the limb to separate joint surfaces."),
("Cavitation", "Formation/collapse of gas bubbles in synovial fluid, producing the 'pop' sound."),
("Gate Control Theory", "Pain-inhibiting mechanism activated by mechanoreceptor stimulation."),
("Dorsiflexion", "Upward movement of the foot/toes — the range often restricted after ankle injury."),
("Ottawa Ankle Rules", "Clinical decision tool to determine if an ankle X-ray is needed to rule out fracture."),
("Synovial fluid", "Lubricating fluid inside joints that contains dissolved gases."),
]
for term, defn in terms:
add_para(doc, f"{term}: ", bold_prefix=defn)
# ── SAVE ──────────────────────────────────────────────────────────────────────
out_path = "/tmp/workspace/ankle-manipulation/Speaker_Notes_Ankle_Manipulation.docx"
doc.save(out_path)
print(f"Saved: {out_path}")
cd /tmp/workspace/ankle-manipulation && python create_speaker_notes.py
Speaker Notes Ankle Manipulation
Word Document · DOCX
| Section | What it Contains |
|---|---|
| What's on Screen | Quick reminder of what the audience sees |
| Speaker Script | Full spoken text — natural, conversational, detailed |
| 💡 Presenter Tip | Cues for pausing, pointing, using analogies, or miming |
| ❓ Audience Engagement | Discussion questions to prompt interaction |
| ⏱ Suggested Time | Per-slide timing (total: 17–25 minutes) |