A coach's programming method, turned into software that writes the training itself.
EDSO is a rules-based strength and conditioning engine we built and run: it generates a full 52-week plan from a tiered movement system and daily-undulating periodization, with a movement database, member logbook, and suggested weights.
The problem
Good coaching has a method behind it. The problem is that method usually lives in one coach's head and a stack of spreadsheets, retyped week after week. Writing a year of training by hand is slow, drifts out of sync, and breaks the moment that coach is busy. EDSO takes the method and makes it the software. The tier system, the rep schemes, the wave loading, the volume progression across a full year, all of it becomes rules the engine runs. You set each lifter's maxes, and it generates the plan: which movement, which day, which intensity, how much tonnage, down to the set and rep. The coaching doesn't get watered down. It gets written into code that produces it every time.
What we built
The modules of the system.
Periodization engine
The core of EDSO. It builds a full 52-week schedule from rules, not hand entry. A 3-week rotation cycles the training days, phase-based volume climbs across the year (12 reps up to 36, with planned deload phases dropped in), and daily-undulating periodization rotates each movement through high, medium, and low intensity. Set a lifter's maxes for squat, bench, hinge, press, pull-ups, and row, and the engine assigns the exact rep scheme, intensity, and tonnage for every session.
The tier system
Every training day is built in five tiers: activation supersets, primary barbell strength, single-arm secondary work, two-arm hypertrophy, then a burnout-plus-carry finisher. The movement database holds the exercise options for each tier of each day, so the engine can rotate variations across the year (bench, incline, close-grip, Spoto, pause, and more) instead of repeating the same lift every week. RPE, RIR, and set targets are baked into each tier.
Rep-scheme library with tonnage math
A named library of rep schemes, sorted by central-nervous-system load: low (speed and volume), medium (wave and contrast), high (strength and max), plus heavy, pause, AMRAP, and backdown variants. Each scheme carries its pattern (like '4x3 @ 78% + 2x1 @ 82%'), its intensity range, and a tonnage multiplier. Plug in a lifter's max and the engine computes the real load they'll move that day.
Movement database
A searchable library of movements, live at mdb.edso.app. Each movement carries cues, muscles worked, equipment, modality, difficulty, movement pattern, and which tiers it fits. An AI assistant can analyze a new movement and fill in those details, and a bulk-upload pipeline imports movements in batches. This is the catalog the programming engine draws from.
Logbook and suggested weights
Lifters log what they actually hit, set by set, with RPE, RIR, and VBT bar-speed notes. The program then serves suggested weights off the real history instead of a generic percentage chart, so the next session reflects what the person can truly do today.
Coach tools
Coaches assign programs to clients, see a client list and per-client overview, and edit any week, day, or exercise. The 9-volume program (explosive strength, tempo and pause work, work capacity, and on through hypertrophy) is built so a coach can run a roster off one method without rewriting it for each athlete.
How it fits together
EDSO is one method expressed across a few connected surfaces. The periodization engine is a React app (Vite, Tailwind, Recharts for the load and exposure charts) that turns the rules, the rep-scheme library, the tiered movement templates, and each lifter's maxes into a generated 52-week plan. The movement database is a Node and Express service on PostgreSQL (Drizzle ORM), with an AI step that analyzes and tags new movements, plus teams, auth, and bulk import; it's the catalog the engine pulls from. The program-and-logbook side runs on React and TypeScript over a Postgres backend with row-level security, holding the 9-volume program, the coach tools, and the logbook that feeds suggested weights. The same engine also powers the programming inside the Persistence Athletics gym operating system, so the method runs in a real gym, not just on its own site. We built it, and we run it at program.edso.app.
Under the hood
The decisions that mattered.
Daily-undulating periodization, written as rules
Most programs hold intensity steady for weeks at a time. EDSO undulates it day to day, which is harder to do by hand and easy to get wrong. The engine tracks how often each movement shows up: squat, bench, and pull-ups appear three times every three weeks, while hinge, press, and row appear twice. It then rotates each one through high, medium, and low intensity across its own appearances, not the calendar, so a lift that shows up less often still cycles through the full intensity range over time. That logic is a function, not a coach's memory, so every lifter gets a properly undulated year the same way.
Maxes in, real tonnage out
A percentage on a page doesn't tell a lifter what to load. EDSO parses every rep scheme (patterns like '6x3 @ 75% + 3x1 @ 82%'), turns it into a tonnage multiplier, and multiplies by that lifter's max for the movement. So the plan doesn't just say '78 percent', it says the actual weight and the total tonnage for the day, per person. Change a max, and the whole year's loads update with it. The same idea drives suggested weights: the logbook records what was really lifted, and the next prescription leans on that history instead of a generic chart.
A tiered day, not a list of exercises
EDSO never thinks of a session as a flat list. Every day is five tiers that each do a job: wake the muscle up, build primary strength on the barbell, add single-arm work, drive hypertrophy with dumbbells, then finish with a burnout and a loaded carry. The movement database stores the valid options for each tier of each day, so the engine can swap in variations across the year (eight ways to bench, several rows, different carries) while keeping the structure and the intent identical. That's what lets one method stay fresh for 52 weeks without a coach hand-picking every lift.
A method that feeds the database, and a database that feeds it
The movement library isn't a static spreadsheet. New movements run through an AI step that classifies the pattern, muscles, equipment, difficulty, and which tiers the movement suits, and a bulk-upload pipeline brings them in at scale. That keeps the catalog the engine draws from growing without a human filling in fields one at a time. The engine and the database are two halves of the same loop: the database stocks the options, the engine arranges them into a year of training.
Release log
What we shipped.
The 52-week DUP engine: 3-week rotation, phase-based volume with deloads, intensity that undulates per movement, and a rep-scheme library with tonnage math driven by each lifter's maxes.
A searchable movement library at mdb.edso.app with cues, muscles, equipment, and tier-fit, an AI step that analyzes new movements, and bulk import.
The 9-volume program with set-by-set logging (RPE, RIR, VBT), suggested weights off real history, and coach tools to assign and edit programs per client.
The same engine powers the programming inside the Persistence Athletics gym operating system, so the method runs against live members.
The outcome
EDSO turns a coach's actual method into software that produces the training. A full 52-week plan generates from the rules, with daily-undulating intensity, a five-tier structure, real tonnage off each lifter's maxes, and suggested weights that learn from the logbook. The movement database is live at mdb.edso.app, the program and coach tools run the 9-volume system, and the same engine drives the programming inside a real gym's operating system. We didn't ship a spreadsheet template and walk away. We built the engine and we run it. Your business, on autopilot.
Put your business on autopilot