pour-fit-module-brief
pour fit — Workout Module Design Brief
Intent
A pour fit module for logging workout sessions to the Obsidian vault. Reuses the category-dependent pattern established by the coffee module: a top-level split selector gates conditional fields via show_when, with composite_array for structured set logging.
Module Shape
| Key | Value |
|---|---|
| Name | fit |
| Display name | Workout |
| Mode | create — one note per session |
| Path | 02 - Areas/202 - Health/00 - Fitness/%Y%m%d-{{split}}.md |
Fields
Category
split—static_select: Push / Pull / Legs / Upper / Lower / Cardio / Custom- Controls conditional fields below via
show_when
- Controls conditional fields below via
Conditional per Split
-
exercises_push,exercises_pull,exercises_legs, etc. —dynamic_selectper split- Source folders:
Health/00 - Fitness/Exercises/Push/,…/Pull/,…/Legs/, etc. allow_create = truewith an exercise template for adding new exercises inline- Each folder contains
.mdnote stubs (e.g.,Bench Press.md,Deadlift.md)
- Source folders:
-
Cardio-specific:
distance_km(number),pace(text),heart_rate_avg(number)show_when = { field = "split", equals = "Cardio" }
Universal
-
sets—composite_arrayfor set logging- Sub-fields:
exercise(text),weight_kg(number),reps(number),rpe(number) - Appears for all strength splits (Push/Pull/Legs/Upper/Lower)
- Could use
show_when = { field = "split", one_of = ["Push", "Pull", "Legs", "Upper", "Lower"] }
- Sub-fields:
-
duration_min—number: Total session duration -
bodyweight_kg—number: Optional daily weigh-in -
notes—textarea→ body: How the session felt, energy level, injuries
Frontmatter Targets
All fields target frontmatter except notes (body) and sets (frontmatter as array of objects).
Vault Structure Needed
02 - Areas/202 - Health/00 - Fitness/
├── Exercises/
│ ├── Push/
│ │ ├── Bench Press.md
│ │ ├── Overhead Press.md
│ │ └── ...
│ ├── Pull/
│ │ ├── Deadlift.md
│ │ ├── Barbell Row.md
│ │ └── ...
│ ├── Legs/
│ │ ├── Squat.md
│ │ ├── Romanian Deadlift.md
│ │ └── ...
│ └── Cardio/
│ ├── Running.md
│ └── Cycling.md
├── Exercises.md (existing — index note)
└── Push Pull Legs.md (existing — reference note)
Template: Exercise
[templates.exercise]
path = "02 - Areas/202 - Health/00 - Fitness/Exercises/{{category}}/{{name}}.md"
[[templates.exercise.fields]]
name = "category"
field_type = "static_select"
prompt = "Category"
options = ["Push", "Pull", "Legs", "Cardio"]
[[templates.exercise.fields]]
name = "muscle_group"
field_type = "text"
prompt = "Primary muscle group"
Open Questions
-
Per-exercise vs per-session tracking: The
setscomposite_array logs sets inline. An alternative is a separatepour setappend module that adds rows to the session note — more granular but more friction per set. -
Exercise selection within the form: Currently
composite_arraysub-fields can't bedynamic_select. The exercise field insidesetswould be plain text unless we extend sub-field types. Alternatively, a top-levelexercisedynamic_select could pre-fill. -
Progressive overload tracking: Showing previous session's numbers for the same exercise requires reading from vault history — not currently supported. Could be a future
history_hintfeature on fields. -
Rest timer: Out of scope for Pour (a capture tool, not a training timer). Could note rest periods as a composite sub-field if desired.
-
Upper/Lower vs PPL: The split options include both PPL and Upper/Lower to support different program structures. The exercise folders might need to be organized differently (some exercises span categories). Consider whether
Customsplit should show all exercises. -
Warm-up sets: Should warm-up sets be distinguished from working sets? Could add a
set_typesub-field (Warm-up/Working/Drop).
References
- Existing vault:
02 - Areas/202 - Health/00 - Fitness/hasExercises.md,Push Pull Legs.md - Coffee module pattern:
resources/mads_config.toml[modules.coffee]— category → equipment → method-specific → universal show_whenspec:pour - docs/02 references/field-types.mdcomposite_arrayspec: same reference doc