Skip to content

Programs and templates

A program in LiftTrace is a named training block: a goal, a list of workout templates, an optional duration in weeks, and, if activated, the source-of-truth prescription for what your Diary prefills every session. Templates are the individual workouts (Push A, Pull B, Legs) that programs group together.

Goal-based programs

Every program carries a goal tag: strength, hypertrophy, cutting, bulking, endurance, or general. The tag is used for filtering in the Programs list and helps Trace answer questions like "what should I focus on this block". The goal does not gate features; you can absolutely run a hypertrophy program during a cut.

Starter templates

On first boot the app seeds a set of templates and programs so the Programs page is not empty:

  • Push / Pull / Legs
  • Upper / Lower
  • Full Body 3x
  • Monumental Valley (branded program)
  • Shredville (branded program)

Seeds live in server/seed-templates.js and server/seed-programs.json. The starter programs are shared by every account and read-only: open one and choose Duplicate from its menu to get a copy of your own to change.

The active program

Exactly one program is active per user. On the Programs page, tap Activate on the one you want to follow; the previous active program deactivates automatically. The Diary then does two things:

  1. On an empty day, shows a Load today's workout button that resolves to the correct template.
  2. When you load that template, prefills every exercise, target weight, target reps, warm-up marker, and RPE target from the prescription.

Deactivate from the same button, or from POST /api/programs/deactivate if you are wiring it externally.

Multi-week progression plans

Set a program's Duration (weeks) in the editor and the Workout template gains a Week tab strip across the top. Each week gets its own per-exercise matrix:

  • Sets: how many
  • Reps: target rep count or range (6-8), or Time for a timed exercise (45, 1:00)
  • Tempo: eccentric / pause / concentric / pause (e.g. 3010)
  • Rest (s): per-exercise rest to feed the timer
  • Load: absolute weight, percentage of a reference, or an RPE target

A "copy this week to next" shortcut clones the current column so you only edit the changes.

The Diary resolves which week you are on using the program's advance mode:

  • sessions (default): the week cursor moves forward after you complete the last workout in a week.
  • calendar: the cursor moves by real days once a week has elapsed.

On the last week, choose hold (stay on the final week's prescription) or repeat (loop back to week one). You can nudge the cursor manually via Repeat this week or Advance to next week in the Load Workout sheet, or programmatically via POST /api/programs/:id/week-cursor.

The week is stamped onto the workout at load time, so a workout you logged in week 2 keeps its week label even after you advance to week 3. Charts and history reflect the actual week you trained under.

How templates prefill the Diary

Templates carry per-set specs, not just per-exercise targets. Every set row in a template can mark warm-up, unilateral L/R, an RPE target, and a rep count. Load the template and every one of those settings flows into the diary. Inside a programmed week, the week's matrix overrides last-session auto-fill so the plan wins.

Templates you edit inline in the Program editor use the same set-row component as the Diary itself (SetRow.svelte), so a set spec you build in the template looks and behaves like the set you will log.

Creating a custom program

Programs page > + New Program. Fill in name, goal, and (optionally) duration in weeks. Add workout templates from the picker (search across all templates you and your trainer have built), or create new templates inline.

For each template:

  1. Pick exercises from the library or search by name.
  2. Set the per-exercise Sets / Reps / Tempo / Rest / Load.
  3. Mark warm-up sets, RPE targets, or unilateral splits per set row.
  4. Group into supersets by assigning the same superset ID to paired rows.

Reorder templates within a program with the drag handle or arrow buttons (PUT /api/programs/:id/reorder). Duplicate a template from its menu when you want a variant. Assign a program to another user (trainer-only) via POST /api/programs/:id/assign (see Coaching).

Trainer-authored programs

Trainers can build a program and assign it to their clients (people who accepted them as coach). The client sees it in their Programs list alongside their own, and can activate it like any other. It opens read-only for the client: its workouts can be followed but not changed. Only the coach changes it, and the change reaches the client on their next load.

Prescribing a single workout on a single day is different from assigning a whole program; see Diary and set logging for the day-of-the-week flow.

Who can change a program

Only the account that made a program can rename it, change its duration, edit its workouts or delete it (Rename, Duration & progression, Delete Program in its menu). Anyone who can see a program can Duplicate it. You see your own programs, the starter programs, and programs a coach assigned to you; nobody else's. On a server without user accounts, every program you made offers Rename, Duration and Delete, and only the starter programs stay read-only.

On a wide screen

On a desktop, a tablet or an opened foldable, Programs splits into the list and a preview pane. The preview has the same actions as the program's own page, and tapping a workout in it opens that workout directly.

Import / export

Program export and import are not on the current release. If you want to publish a program for the community today, the workaround is per-exercise sharing (Exercise detail > Share button) plus a written description of the template. Full program bundles are on the roadmap.