01 / Core discovery
Across 382 videos, the same programme-design grammar keeps reappearing
The corpus reveals something more general than one universal prescription: a stable system for generating different programmes according to the objective, trainee and circumstances.
The implicit grammarChoose the objective. Select the movements. Fit the variations to the trainee. Progress, regress or substitute. Combine and dose simply. Protect recovery and repeatability.
The programme implicit across the corpus
Six decisions repeatedly organise the teaching
This is an inference from recurring objects and relations—not a programme Dan John states in this exact form.
- 01Choose the objective
- 02Select fundamental movement categories
- 03Choose suitable variations
- 04Apply progressions, regressions or substitutions
- 05Combine and dose them simply
- 06Preserve recovery and repeatability
Different expressions of one logic
Easy Strength, Southwood, Rite of Passage, Armor Building Complex and Mass Made Simple select from overlapping movement families and vary their volume, density and progression by goal.
Exercises are taught relationally
Movements become understandable through what precedes them, replaces them, combines with them, follows them or performs the same function.
Five videos cover every selected structure
The smallest defensible viewing set covers all seven structures used as the coverage target, turning a 382-video corpus into a compact route through the inferred system.
What the system appears to optimise
Useful physical improvement with the least unnecessary complexity and fatigue
The objective is not to maximise one lift at any cost. It is to get meaningfully better without needing a recovery plan from the recovery plan.
- Strength and power that transfer to real activities.
- Repeatable training that can be sustained over time.
- Adequate—not maximal—training volume.
- Progress without undermining recovery.
- Simple exercise selection and program structure.
- Broad physical competence: strength, mobility, work capacity and body composition.
- Adjusting the program to the trainee’s immediate goal.
Inferred optimisation principleMaximise useful, sustainable results per unit of time, effort, complexity and recovery cost.
Why this interpretation is visible
Turn down the noise and recognisable subjects appear
The frequency-≥3 network is not random noise wearing a lab coat. It breaks into named programmes, exercise systems and recurring training concerns.
- 147
- connected objects
- 137
- retained edges
- 23
- connected components
- 99
- objects in the main component
| Inferred topic | Representative objects |
|---|---|
| Kettlebell practice and Rite of Passage | kettlebell swing, clean and press, kettlebell snatch, Pavel Tsatsouline, Rite of Passage |
| Easy Strength and general strength development | Easy Strength, strength, pull-up, overhead press, repetitions in reserve |
| Loaded carries and trunk/hip strength | loaded carry, suitcase carry, waiter walk, bear-hug carry, hip thrust, Stuart McGill |
| Swing challenges and work capacity | 10,000 Swing Challenge, 500 daily swings, loaded carries, grip strength, work capacity |
| Fat loss and recovery | Easy Strength for Fat Loss, walking, fat loss, protein, sleep, recovery, body composition |
| Original Strength and mobility resets | Original Strength, Tim Anderson, neck nod, six-point rock, mobility, Humane Burpee |
| Southwood program | power clean, military press, front squat, bench press, Southwood program |
| Repetition schemes and transformation programs | three sets of eight, three sets of five, one-minute rest, transformation program |
| Armor Building Complex | double-kettlebell clean, front squat and press, Armor Building Complex |
| Mass Made Simple | high-repetition squat, barbell complex, muscle mass, Mass Made Simple |
| Basic nutrition | health, nutrition, vegetable |
Strongest structural hubs · connection score
Some ideas do more of the heavy lifting
- armor building complex
- 78
- kettlebell swing
- 44
- easy strength
- 40
- southwood program
- 34
- rite of passage
- 32
Cross-topic bridges
What connects otherwise distinct subjects
- kettlebell swing
- easy strength
- armor building complex
- humane burpee
- goblet squat
- overhead squat
- armor building formula
- easy strength for fat loss
The ≥3 threshold gives the cleanest view of the strongest recurring programmes and systems. Dropping to ≥2 is messier but better for seeing how those subjects bleed into one another. The topic names are interpretations of the shapes in the network, not labels smuggled into the original data.
02 / Training structures
The relations show how exercises become programmes
Frequency identifies what Dan John repeatedly discusses. Exercise pairs identify what repeatedly travels together. Relation wording reveals whether that connection is a progression, regression, substitute, sequence, combination or functional analogy.
- 124
- relation instances
- 58
- distinct exercise pairs
- 38
- exercises with a direct exercise relation
- 19
- exercises retained at pair frequency ≥3
Five groups at pair frequency ≥3
Repeated exercise pairs form recognisable training systems
The largest group contains a squat progression, a swing-teaching progression and a complete workout composition. Four smaller groups preserve pressing, clean, get-up and carry relationships.
Squat, swing and Humane Burpee group
Squat: progression and substitution · Swing: regression, preparation and substitution · Humane Burpee: compositionThe dominant group contains three overlapping structures. The Humane Burpee connects the squat and swing systems by combining the goblet squat, kettlebell swing and push-up.
Squat progression
back squat ─9─ front squat
front squat ─5─ overhead squat
goblet squat ─6─ overhead squat
Swing progression
glute bridge ─3─ hip thrust ─6─ kettlebell swing
├─6─ Bulgarian goat-bag swing
└─4─ kettlebell snatch
Humane Burpee combination
push-up
│ 8
goblet squat ─6─ humane burpee ─6─ kettlebell swingPressing progression
Load progression and variationThe push press follows, progressively replaces or permits greater loading than the strict press.
strict press ─4─ push press
Clean variations
Substitution and suitabilityThe clean and press and clean and jerk are discussed as alternatives with different suitability and purposes.
clean and press ─3─ clean and jerk
Get-up progression
Assessment and unloaded variationThe naked get-up is consistently treated as an unloaded or assessment version of the Turkish get-up.
naked get-up ─3─ Turkish get-up
Carry and trunk relationship
Functional equivalenceThe suitcase carry is repeatedly described as functioning like a moving plank.
moving plank ─3─ suitcase carry
What returns at frequency ≥2
Weaker pairs extend rather than overturn the structure
- Bench press ↔ military pressComparison: historical displacement and relative strength levels, not a programme combination.
- Swimming ↔ walkingInterchangeable or alternating conditioning and recovery activities.
- Farmer walk ↔ moving plankFunctional analogy: the farmer walk is also characterised as a moving plank.
- Power clean → front squatExercise sequencing: the power clean precedes the front squat.
- Clean and jerk → front squatExercise sequencing: the front squat follows the clean and jerk.
- Glute bridge → kettlebell swingExplicit regression, reinforcing the swing-teaching sequence.
Some relation directions are inconsistent—particularly between glute bridge and hip thrust, and between strict press and push press. The evidence supports the relationship type more confidently than one universal direction.
A linguistic signal in the relations
Singular and plural terms do different work
In four tested noun pairs, the singular and plural forms occupy strikingly different relational neighbourhoods. Singular terms tend to name or classify a thing; plurals more often carry programming context such as doses, blocks, methods or accumulated effects.
- loaded carry / loaded carries
- 7.1% neighbour overlap
- Olympic lift / Olympic lifts
- 5.4% neighbour overlap
- hill sprint / hill sprints
- 0% neighbour overlap
- vegetable / vegetables
- 3.4% neighbour overlap
This is a small test, but it provides a reason not to collapse the forms automatically as aliases.
Reverse reading of the methodology
Reading the research backwards exposed its real result
Viewed chronologically, the work is a record of extraction and analysis. Viewed from its findings backwards, it becomes an argument for an implicit programme-generating framework.
| Reverse-reading stage | What it contributes |
|---|---|
| Exercise relation groups | The practical structure: squat, hinge/swing, press, get-up and carry/trunk work |
| Exercise list | The available variations for filling those movement roles |
| Implicit methodology | Why those exercises are organised this way |
| Recurring programs and communities | Examples of the framework applied to different goals |
| Frequency and relation analysis | Evidence that the structure recurs across the corpus |
| Extraction experiments | How that evidence was obtained and its limitations |
Implied programme architecture
The movement roles remain stable while their contents change
The named programmes look less like unrelated prescriptions and more like different implementations of this shared architecture.
Physical training
├── Squat
│ └── choose an appropriate variation or progression
├── Hinge and ballistic work
│ └── regress through bridge, hip thrust or goat-bag swing
│ before progressing toward swings and snatches
├── Press
│ └── move between strict and push-press variations
├── Get-up
│ └── assess unloaded before adding load
├── Loaded carry and trunk work
└── Simple combinations
└── example: Humane Burpee
├── goblet squat
├── kettlebell swing
└── push-upStrongest supported conclusionDan John repeatedly applies a recurring programme-design grammar to produce different programmes for different circumstances.
03 / Minimum sufficient viewing
The five videos you definitely should watch
Five is the smallest set that covers all seven recurring exercise structures identified in the selected exercise set. It covers 13 of 22 repeated exercise pairs; it is not a claim that five videos represent every subject in the corpus.
01 · Best single overview
Kettlebell Swings, WTH Effect, Easy Strength, Armor Building, 65+ Training & More | DJU Podcast #217
Covers Easy Strength, recovery, kettlebell and Olympic-lift integration, Armor Building Complex, Humane Burpees, get-ups, snatches and carries. It also provides an alternating programme and argues for selecting the most important tools rather than using everything.
Open on YouTube02 · Progression and programme balance
Armor Building Complex, Kettlebell Weights, Easy Strength & Balancing Training | DJU Podcast #248
Explains progression as more than adding load, including the route from glute bridge through hip thrust and rack deadlift to swings and Olympic lifts. It also covers pressing progressions, clean-and-press variations and front squats.
Open on YouTube03 · The squat-teaching sequence
Steve Maxwell, Worst Exercises, Squats, Bodyweight Training, Kettlebells & More | DJU Podcast 197
Provides the clearest explicit progression from goblet squat to overhead squat, front squat and back squat, including the reason for teaching them in that order.
Open on YouTube04 · Loaded carries and trunk training
The Dan John Podcast - Ep 35 | Single Leg Training, Deadlift Height, My Favorite Exercise
Supplies the loaded-carry rationale: loaded carries operate as moving planks, and the suitcase carry functions as a single-arm farmer walk.
Open on YouTube05 · Get-ups and goal-specific application
Turkish Get-Ups, Easy Strength, Mass Made Simple, Mobility, Fat Loss & More | DJU Podcast #234
Shows how the get-up can be decomposed, assessed and performed unloaded, while connecting Easy Strength, Mass Made Simple, mobility and fat-loss work.
Open on YouTubeCoverage trade-off
Why stop at five?
The first three provide the efficient short version. Videos four and five add the otherwise missing loaded-carry and get-up systems.
#217 is the best overview
It crosses more of the identified framework than any other single source.
#217, #248 and #197 give the essential framework
Together they explain most of the programme architecture and much of its rationale.
The smallest seven-system set
Loaded carries and get-ups complete all seven systems. Covering all 22 repeated pairs would require 13 videos for substantially less return.
04 / Interactive evidence
Test the interpretation against the source-linked relation network
Search the ranked frequency table, select an object and carry that selection into the relation network. Adjust object scope, direct or second-order depth, and the minimum pair frequency from one to four. The explorer preserves disconnected components rather than implying that every subject belongs to one graph region.
Interactive evidence
Load the full frequency table and relation network when you need them
The large browser dataset is deferred until this section approaches the viewport. You can also load it now.
05 / Code and reproducibility
The operations that generated and exposed the results
Each stage keeps the operation, executable code and observed output together. The snippets come from the working Jupyter notebook and the browser explorer used on this page. The Python for NLP and Semantic SEO reference provides the broader implementation context for these operations.
01 / Prepare
Load ranked objects and source-linked records
from pathlib import Path
import json
import pandas as pd
frequency_data = (
pd.read_csv(Path("object_frequencies.csv"))
.sort_values("rank")
.reset_index(drop=True)
)
records_dir = Path("v1_1_objects_relations/records")
record_paths = list(records_dir.glob("*.json"))
print(f"Objects: {len(frequency_data):,}")
print(f"Video records: {len(record_paths):,}")02 / Cutoff
Calculate the recurring-object elbow
recurring_objects = frequency_data.loc[
frequency_data["frequency"] > 1
].copy()
normalized_rank = (
(recurring_objects["rank"] - recurring_objects["rank"].min())
/ (recurring_objects["rank"].max() - recurring_objects["rank"].min())
)
normalized_frequency = (
(recurring_objects["frequency"] - recurring_objects["frequency"].min())
/ (recurring_objects["frequency"].max() - recurring_objects["frequency"].min())
)
distance_from_endpoint_line = (1 - normalized_rank) - normalized_frequency
knee_index = distance_from_endpoint_line.idxmax()
cutoff_frequency = int(frequency_data.loc[knee_index, "frequency"])
cutoff_rank = int(frequency_data.loc[
frequency_data["frequency"] >= cutoff_frequency, "rank"
].max())03 / Network
Count pairs and expand relational neighbourhoods
from collections import Counter, defaultdict
analysis_group = set(
frequency_data.head(cutoff_rank)["object"].str.strip().str.lower()
)
adjacency = defaultdict(set)
pair_frequency = Counter()
for record_path in records_dir.glob("*.json"):
record = json.loads(record_path.read_text(encoding="utf-8-sig"))
labels = {
item["id"]: item["label"].strip().lower()
for item in record.get("objects", [])
}
for relation in record.get("relations", []):
subject = labels.get(relation.get("subject"))
object_ = labels.get(relation.get("object"))
if subject and object_ and subject != object_:
pair_frequency[tuple(sorted((subject, object_)))] += 1
adjacency[subject].add(object_)
adjacency[object_].add(subject)
first_order = set().union(*(adjacency[item] for item in analysis_group)) - analysis_group
second_order = (
set().union(*(adjacency[item] for item in first_order))
- analysis_group - first_order
)04 / Structure
Retain recurring pairs and find connected groups
def connected_groups(pair_counts, minimum_frequency):
graph = defaultdict(set)
for (left, right), count in pair_counts.items():
if count >= minimum_frequency:
graph[left].add(right)
graph[right].add(left)
groups, visited = [], set()
for start in sorted(graph):
if start in visited:
continue
stack, component = [start], set()
visited.add(start)
while stack:
node = stack.pop()
component.add(node)
for neighbour in graph[node] - visited:
visited.add(neighbour)
stack.append(neighbour)
groups.append(sorted(component))
return sorted(groups, key=lambda group: (-len(group), group))
retained_pairs = {
pair: count for pair, count in pair_frequency.items()
if count >= 3
}05 / Explore
Filter and render the browser network
const filteredEdges = data.edges.filter(
(edge) =>
edge.frequency >= minPairFrequency &&
scopeNodes.has(edge.source) &&
scopeNodes.has(edge.target)
);
const visible = new Set([selectedId, ...direct, ...second]);
cytoscape({
container: networkRef.current,
elements,
minZoom: 0.04,
maxZoom: 5,
style: networkStyles,
layout: selectedId
? { name: "concentric", animate: false }
: { name: "preset", fit: true, padding: 38 },
});06 / Methodological record
How the unit of analysis changed across ten epochs
The discovery appears first on this page. This chronological record preserves the experiments, failures and corrections that made it possible—and shows how the project moved from maximum extraction towards minimum sufficient explanation. It extends the site's research pipeline into a bounded transcript corpus.
- Extraction record
- V1.1 source-linked object–relation JSON records produced directly from downloaded transcripts with Codex 5.6 Sol at extra-high reasoning
- Responsibilities
- Codex extracted candidate objects and relations; Python aggregated frequencies and pairs; human analysis defined the question, thresholds, interpretation and return to sources
The separation of automated extraction, computation and human interpretation follows the human-supervised research approach documented in the Semantic SEO Lab.
General method
Discover structure, then return to the sources
This is the transferable operation demonstrated by the Dan John corpus.
Large unstructured corpus
↓
Acquire and preserve sources
↓
Extract objects and relations
↓
Count recurring objects
↓
Identify persistent object pairs
↓
Construct relational neighbourhoods
↓
Recognise larger structures
↓
Return to individual sources for interpretationThe project’s deeper progression
The unit of analysis expanded before the answer contracted
Individual records became a network; the network then made it possible to return to a small number of particularly informative sources.
Playlist
↓
Transcripts
↓
Per-video objects and relations
↓
Corpus-wide object frequencies
↓
Repeated object pairs
↓
Relation network
↓
Exercise and program structures
↓
Implicit program-design methodology
↓
Minimum representative video setThe CreepyTok analysis provides a parallel case: it prepares a TikTok corpus for supervised interpretation, while this study continues through corpus-wide relational analysis and return to individual sources.
Corpus acquisition
What videos exist, and can their transcripts be obtained?
The playlist was inspected, a dedicated project directory was created, transcripts were downloaded, and collection failures were checked.
Record definition
What should be stored for each video?
The proposed record included URL, official title, alternative title, summary, transcript, semantic map, objects and relations. Repeated discussion exposed where premature database and ontology design was overreaching.
Rich-analysis experiment
Can each video immediately be interpreted in depth?
Initial records attempted titles, summaries, semantic maps, objects and relations. The summaries were sometimes useful, but the process was slow and produced more interpretation than the developing analysis required.
Model comparison
Could API models perform equivalent extraction faster?
GPT-4.1 and GPT-4.1 mini were tested against the original Codex 5.6 Sol work, run with extra-high reasoning. GPT-4.1 mini was rejected as unsuitable. GPT-4.1 produced useful relations but required pruning.
Minimal collection specification
What is the smallest useful extraction task?
The task was reduced to official title, objects and relations. Attempts to make the API analyse, prune or construct higher-order relations were identified as unnecessary scope inflation.
Corpus-scale direct extraction
Can the entire corpus be processed consistently?
Codex extracted objects and relations directly, in batches, from the complete transcript set. Stalling and continuity were recurring operational failures. One irrelevant Asmongold transcript was identified and removed. A rapid error check followed completion.
Object-frequency analysis
Which extracted objects warrant attention first?
The corpus contained 18,254 normalized object labels. The recurring-object curve produced an elbow after rank 115, corresponding to frequency 15 or greater. These 115 became the analysis group.
Relational expansion and visualisation
What surrounds the analysis group?
The 115 objects connected to 3,168 first-order objects and 4,059 additional second-order objects, producing a 7,342-object network. The notebook gained frequency plots, cutoff calculation, interactive network navigation, node scaling, edge-opacity changes and a frequency slider.
Repeated-pair and community analysis
Which connections persist across the corpus?
Object-pair frequency became the main simplification mechanism. At pair frequency ≥3, the network revealed programs, exercise systems, hubs and bridges. Southwood, Easy Strength, Armor Building Complex, Rite of Passage and swing-related structures became visible.
Program-grammar synthesis
What does the network imply about Dan John’s underlying method?
Exercise relations exposed squat, swing, press, clean, get-up and carry systems. Reading the findings backwards revealed a program-generating framework optimising useful improvement, simplicity, repeatability and recovery. The corpus was then compressed into a five-video viewing set covering the complete framework.
Three broader eras
The project changed character twice
Collection era
The project treated each video as a document to preserve and interpret. This established provenance and produced the raw object–relation records, while rich per-video analysis repeatedly exceeded what the corpus-level question required.
Structural-analysis era
The unit of analysis changed from the individual transcript to the complete usable corpus. Frequency established recurrence, object pairs exposed persistent associations, and graph distance supplied first- and second-order context.
Interpretive-synthesis era
The work moved from repeated objects to what their relations implied: exercise systems, a programme-generating grammar, and a minimum set of source videos covering the selected framework.
07 / Research artefacts
Inspect the notebook, corpus metadata and derived data
The page is an interface to the analysis, not a replacement for its working materials.
To reproduce the notebook, install the listed Python packages, keep the frequency CSV beside it, and extract the records archive so its v1_1_objects_relations directory is beside the notebook.
08 / Limits
What the analysis does not establish
Recurrence directs attention. It does not convert extracted language into truth or remove the need to inspect sources.
- Transcript inaccuracies can affect the extracted evidence.
- Two playlist entries lacked usable transcripts and received no analysis.
- Object aliases and composite labels remain incompletely resolved.
- Singular and plural forms remain separate because their relational neighbourhoods differed.
- Relation wording and direction vary between records.
- Changing the pair-frequency threshold changes the visible network.
- The model comparison was not like-for-like: the original rich-analysis records used Codex 5.6 Sol with extra-high reasoning, while the later tests used GPT-4.1 and GPT-4.1 mini.
- Frequency measures recurrence, not whether a claim is correct or universally applicable.
Return to the question
The corpus makes visible the recurring decisions from which many Dan John programmes can be built.
It does not reduce the work to one prescription. It shows how objectives, movement roles, suitable variations, progressions, substitutions, dosage and recovery repeatedly combine—and identifies five videos covering every exercise structure used as the final coverage target.