Session Builder
Session Builder
The Session Builder is a drag-and-drop workout authoring tool for coaches. It lets you compose training sessions from the movement library, configure blocks and scaling tiers, set load expressions, and schedule sessions to programme tracks — all from a single browser-based interface.
URL: /dashboard/session-builder
Navigation: Coach Tools → Session Builder
Getting to the Session Builder
- Log in as a coach.
- In the dashboard sidebar, scroll to the Coach Tools section.
- Click Session Builder.
You can also deep-link to a specific session or pre-fill the date and track using query parameters:
/dashboard/session-builder?sessionId=<id>&date=YYYY-MM-DD&trackId=<id>
Session Metadata
Before adding blocks, configure the session header fields:
| Field | Description |
|---|---|
| Title | Short name for the session (e.g. "Monday Strength + MetCon") |
| Programme Track | Select which track the session belongs to |
| Scheduled Date | Date to publish the session; up to 12 weeks ahead |
| Stimulus | Intended training stimulus (e.g. "Aerobic capacity, moderate load") |
| Time Domain | Total session duration in minutes |
| Timer Type | AMRAP, EMOM, For Time, Tabata, Every X Minutes, or Open |
| Coach Preamble | Introductory notes shown to members before the session |
Block Types
Sessions are structured as an ordered list of blocks. Each block has a type, an optional label you can customise, and block-level notes for pacing cues, equipment setup, or transitions.
| Block Type | Colour | Typical Use |
|---|---|---|
| Warm-Up | Amber | Mobility, activation, general prep |
| Strength | Blue | Barbell or loading work with progressive sets |
| Conditioning | Red | Aerobic or cardio-based pieces |
| Skill | Violet | Gymnastics, technique, or sport-specific work |
| MetCon | Orange | Mixed-modal metabolic conditioning |
| Cool-Down | Emerald | Stretching, recovery, breathwork |
Adding and Reordering Blocks
- Click Add Block and select a block type from the dropdown.
- Drag the grip handle (⠿) on the left edge of any block to reorder it.
- Click the block header to collapse or expand its contents.
- Click the delete icon to remove a block.
Adding Movements
Inside any block, click Add Movement to open the Movement Picker modal.
Movement Picker
- Use the search bar (debounced full-text search) to find movements by name.
- Switch between category tabs to browse by movement type.
- Click a movement to add it to the block.
Once added, each movement row expands to show its configuration fields.
Per-Movement Configuration
| Field | Description |
|---|---|
| Scaling Tier | RX / Performance / Foundations (see below) |
| Reps / Sets | Free-text field (e.g. 5 x 3, 21-15-9) |
| Load Expression | Percentage-based load (e.g. 75% 1RM Back Squat) |
| Absolute kg Fallback | Fixed kg value used when a 1RM is not on record |
| Interval Seconds | Work interval for EMOM or Every X formats |
| Notes | Movement-specific coaching notes or cues |
Reordering Movements
Movements within a block can be dragged into any order using their grip handle, independently of block reordering.
Scaling Tiers
Each movement entry is assigned a scaling tier. Coaches typically add the same movement multiple times with different tiers to provide options for all athlete levels.
| Tier | Badge | Intended Athlete |
|---|---|---|
| RX | Blue | Athletes performing the standard prescription |
| Performance | Violet | Intermediate athletes with movement proficiency |
| Foundations | Emerald | Newer athletes or those developing capacity |
The right panel of the Session Builder includes a Scaling Tier Guide with descriptions for each tier.
Load Expressions
Load expressions let you specify a percentage of a member's recorded 1RM rather than a fixed weight. The platform resolves these at serve-time using the member's strength data.
Format: <percentage>% 1RM <lift name>
Example: 75% 1RM Back Squat
Resolution Rules
- The system looks up the member's most recent 1RM for the named lift.
- The calculated load is rounded to the nearest 2.5 kg.
- If no 1RM is on record, the absolute kg fallback value is used instead.
- If neither is set, no load is displayed to the member.
The right panel includes a Load Calculator Guide explaining this behaviour.
Saving and Publishing
Save Draft
Click Save Draft to persist the session without making it visible to members. Drafts can be reopened and edited at any time. The button shows a spinner while saving and a check icon on success.
- Calls the
training.authorSessiontRPC mutation. - Creates a new session record if one does not exist; updates it if a
sessionIdis already set.
Publish
Click Publish to flip the session status to published. Published sessions are immediately served to members on the scheduled date.
- Calls the
training.publishSessiontRPC mutation. - A session must have at least a title, a programme track, and a scheduled date before publishing.
Note: Publishing is not reversible from the Session Builder UI. Contact your platform administrator to revert a published session to draft.
Editing an Existing Session
To reopen a previously saved session, navigate to:
/dashboard/session-builder?sessionId=<id>
The builder will load the session's blocks, movements, and metadata automatically.
Technical Reference
| Detail | Value |
|---|---|
| Page file | src/app/dashboard/session-builder/page.tsx |
| Client component | src/app/dashboard/session-builder/session-builder-client.tsx |
| Render mode | force-dynamic (per-request auth) |
| Drag-and-drop library | @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/utilities |
| tRPC procedures used | training.listTracks, training.getSessionById, training.authorSession, training.publishSession, movements.search, movements.list |
| Database tables | training_sessions, session_blocks, session_movements |
| Schema changes | None |
| New dependencies | None |