# Cadence — Claude's independent interface proposals

These three proposals came from the actual installed Claude Code client. No Codex concepts or mockups were supplied. They are comparison proposals; no implementation direction has been approved. All examples are synthetic.

## Provenance

- Model: **claude-opus-5[1m]** (canonical `claude-opus-5`).
- Claude Code: **2.1.278**; configured default model, no model override.
- Completed successfully in **578.0 seconds**, one turn.
- Tools, slash commands and MCP servers were disabled. No permission bypass was used.
- Neutral input: `claude-brief.md`; normalized output: `claude-directions.json`.
- Raw CLI stdout is retained locally as `claude-result.json` for provenance.
- Proposal content below retains Claude's fields. Rendering prompts in the normalized JSON are labeled Codex derivations.

## Deck — claude-1

The workout is a deck of exercise cards and the phone shows exactly one movement at a time, full screen, with every control you need for the set you are actually doing held in the bottom third where your thumb already is. You never scroll to find the live set, because the live set is the screen.

### Distinctive principle

Single-focus paging plus a permanent in-app number pad. Only one exercise exists on screen at a time; the rest of the session is a tappable rail of chips across the top. Numeric entry never uses the system keyboard, so the layout never jumps, nothing is ever hidden behind a keyboard, and the primary Log button sits at a fixed height for every set of every exercise. Exercise switching is both a swipe and a visible tap target, so nothing depends on discovering a gesture.

### Navigation

Three tabs. Train holds Today, start controls, routines, programs and the other activity starters. Library is a first-class tab for the 290 exercise entries, search with aliases, muscle and equipment filters, recents, custom exercises, archive and restore, with the exercise guide as a push. Record holds history and progress behind a two-item segmented control in the nav bar, so sessions and charts share one stack. Settings is a gear in the Train nav bar opening a sheet. The active workout is a fullScreenCover, not a sheet, because it is a mode rather than a detail. Minimising collapses it to a 56 pt dock bar pinned directly above the tab bar on every tab: exercise name, set n of total, a live rest countdown when one is running, and a large chevron-up resume target spanning the full bar. Tapping any Start control anywhere while a workout is active never starts anything; it raises a confirmation dialog titled Upper A is in progress with Resume Upper A and Cancel, naming the active workout rather than the routine you were looking at.

### Visual system

| Role | Light | Dark |
| --- | --- | --- |
| canvas | `#FFFFFF` | `#000000` |
| surface | `#F1F3F7` | `#13161B` |
| ink | `#101318` | `#F2F5F9` |
| muted | `#5E6672` | `#8D96A4` |
| accent | `#2F5BEA` | `#7C9BFF` |
| success | `#1C7A4D` | `#4BD08A` |

**Typography:** SF Pro Display for titles: exercise name 28 pt semibold, screen titles 20 pt semibold. SF Pro Rounded for the two live readouts (weight and reps) at 56 pt semibold with monospacedDigit and tracking -0.5, which keeps a three-character load like 67.5 stable while it changes. Effort readouts in SF Pro Rounded 28 pt medium. Set ledger rows in SF Pro Text 15 pt regular with monospacedDigit so the kg column aligns. Micro labels (EQUIPMENT, PRESCRIPTION, LAST TIME) in SF Pro Text 11 pt semibold, uppercase, tracking +0.6, colour muted. Buttons 17 pt semibold. Dynamic Type is supported to AX5 on every text style; micro labels use a relative style capped so they stop growing past 15 pt rather than pushing the layout apart, and the two 56 pt readouts scale to a 96 pt ceiling. At accessibility1 and above the keypad drops from three columns to two, the weight and reps readouts stack vertically instead of sitting side by side, and the exercise chip rail becomes a single Current exercise button that opens a picker list.

**Component grammar:** An 8 pt spacing grid, 20 pt outer margins, 24 pt between zones. Cards are 20 pt corner radius on surface with no shadow and no border in light mode; in dark mode they gain a 0.5 pt #262B33 hairline because the black canvas gives no edge. Keypad keys are 12 pt radius, 56 pt tall, 8 pt gutters. The primary action is a 60 pt tall full-width capsule-ish 14 pt radius accent fill with white or near-black label depending on mode. Set type, plate hint and RIR are 32 pt tall pills with 8 pt radius. The exercise chips are 36 pt tall rounded rects inside a 44 pt scroll strip so the touch target meets 44 pt. Native components throughout: TabView, NavigationStack, List with insetGrouped for settings and library, Menu for exercise options, ConfirmationDialog for discard and for resume conflicts, Charts for progress, searchable for the library. The pager is a TabView with page style and an explicit index control rather than a bare ScrollView. Imagery belongs on exercise detail and library rows (a 64 pt movement drawing thumbnail, full width muscle figures on the guide page) and in the finish summary. Imagery is deliberately absent from the live set card: when a drawing exists it is reachable through the exercise header disclosure, not printed over the numbers. Rows without a drawing show a neutral equipment glyph at the same 64 pt size so lists never reflow.

### Screen plans

**today**

Train tab, first screen. A 20 pt date line Thursday 1 October. Then a full-width next-up card on surface: program name Upper / Lower as a micro label, routine name Upper A at 28 pt, a three-figure row 5 exercises · 15 sets · 45 min last time in 15 pt monospaced digits, and the accent Start Upper A button at 60 pt. Below it a secondary row of three 44 pt outline buttons: Open workout, Timer, Log activity (run, cardio, mobility). Then a week strip of seven 44 pt day cells with weekday initials, filled for trained days, reading 3 sessions this week. Then Last session as a single tappable row, Upper A · Tue 29 Sep · 43 min · 15 sets. Then All routines as a list; each row has the name, a 3 x 8-10 style summary, and a trailing Start button, with the row body pushing to the routine preview so the two actions are never confused.

**activeWorkout**

Described in detail in activeLayout.

**routinesPrograms**

Train tab, below Today. Routines list supports create, duplicate, reorder with EditMode, and delete with confirmation. The routine editor is a deck of the same exercise cards used in the live workout but in a planning state: sets, rep range, load, rest, RPE or RIR target, progression rule (fixed or double), and a superset group chip. Programs are an ordered list of routines with a Next marker you can move; the editor states plainly that a program advances when a routine is completed and is not a calendar. Routine text import is a sheet: paste, then a reviewable parsed table where each line maps to a library exercise with a change control, unmatched lines held back until resolved, and nothing saved until confirmed.

**history**

Record tab, Sessions segment. A list grouped by month: date, routine name, duration, set count, total load. Detail is the deck in review mode, paged by exercise, with skipped sets shown greyed and struck rather than hidden. Editing opens a draft copy with Save and Revert, so an edit in progress cannot corrupt the stored session. Delete is a confirmation dialog naming the session.

**progress**

Record tab, Progress segment. A month calendar where a trained day is a filled cell and the caption reads days trained, not workouts; tapping a day pushes that day's sessions. Then Charts: weekly consistency as a bar chart of sessions, weekly external load volume in kg, primary-muscle working-set counts as a horizontal bar list. Then Exercise records as a searchable list; tapping Bench Press (Barbell) pushes a page with heaviest working load 72.5 kg, an Epley estimated max table for 1 to 12 reps, rep records, best set per rep range, and a line chart of estimated max over time.

**libraryExerciseDetail**

Library tab. Search field at top recognising db press, pullup, curls, rdl. Two filter menus, Muscle and Equipment, as Menu pickers showing active filters as removable chips. Recents section first, then all exercises alphabetically, each row with a 64 pt drawing or equipment glyph, name, and a brand or model line such as Machine A where set. Multiselect is a Select button that turns rows into checkboxes with an Add n exercises button. Long press gives Guide, Edit, Archive. The exercise detail page stacks: drawing if available, primary and secondary muscle figures, guide text, setup note, default weight jump, brand and model, then this exercise's history and records. Archived exercises live behind a toggle at the bottom of the list and can be restored; archiving never touches history or routine references and the confirmation says so.

**settingsRecoveryMeasurements**

Gear sheet from Train. Sections: Units and defaults (default weight jump, bar weight, plate inventory), Rest (sound, haptics, lock screen notification, Live Activity), Appearance, Measurements (bodyweight plus custom metric entries, swipe to remove, with a small chart per metric), Apple Health (export finished workouts as type and duration only, read latest bodyweight, each permission requested at the moment you tap the action), Data (export JSON, import with validation, restore previous snapshot, Hevy CSV import with its mapping review and duplicate detection), Sample database (load and unload the six-week synthetic set, labelled Temporary, never merged), Artwork credits, About. Read-only recovery replaces the Train tab content with a full-page card titled This database could not be read, explains that nothing was deleted, and offers Restore previous snapshot and Import a backup; a persistent muted bar appears above the dock on every tab and logging controls are disabled rather than hidden.

### Active screen layout

1. 0 to 56 pt — Nav bar. Left: chevron-down Minimise. Title: Upper A, 17 pt semibold, with 18:42 beneath in 12 pt monospaced muted. Right: ellipsis Menu containing Finish workout, Add exercise, Reorder, Workout notes, Discard workout.
2. 56 to 100 pt — Exercise rail. Horizontal scroll of 36 pt chips: 1 Bench Press, 2 Seated Row, 3 Lateral Raise, 4 Face Pull, 5 Triceps. The current chip is accent filled; completed chips show a filled dot; superset partners share a bracket drawn under the pair. Tapping a chip pages the deck. The rail is also the progress indicator, so there is no separate bar.
3. 100 to 164 pt — Exercise header. Bench Press (Barbell) at 28 pt semibold, a trailing chevron that pushes the exercise page. Under it a micro row: BARBELL · CHEST · 3 x 8-10 · 70 KG · 120 S · RPE 8.
4. 164 to 216 pt — Setup note strip. Full width, 4 pt accent left bar, wrench symbol, Rack height 9 · feet under knees at 15 pt. Tap opens an inline editor. This strip stays on screen for the whole exercise and is visually distinct from the workout note and the routine note.
5. 216 to 268 pt — Comparison and recommendation. One line: LAST TIME 67.5 x 10 · 9 · 8 in monospaced digits. One line in accent: Hold 70 kg, 8 or more reps on all sets to progress.
6. 268 to 436 pt — Set ledger. Three 48 pt rows plus an Add set row. Row 1: 1, a success tick, 70 kg x 9, RPE 8, and a trailing undo arrow. Row 2 is the live row, accent left bar, reading 2, 70 kg x 8, RPE 8. Row 3: 3, an em dash, 70 kg x --. Each row is tappable to become the live row, including the completed one, which reopens it for correction. A set-type pill sits at the row's left edge for warm-up, failure, drop, AMRAP and timed.
7. 436 to 540 pt — Live set panel. Two large readouts side by side: 70 with caption KG, and 8 with caption REPS. Beneath them a 32 pt row: RPE 8, RIR 2 (shown only when RIR is enabled for this exercise), and a plate pill reading 25 kg per side that opens the plate calculator.
8. 540 to 712 pt — Keypad rail, always present. A four-item segmented control KG / REPS / RPE / RIR selects the target field, and the matching readout above gains an accent underline. Left column: two 56 pt steppers, minus and plus, stepping by the exercise's default weight jump for kg and by 1 for reps and effort. Right: a three-by-four pad of digits plus decimal and backspace. Typing replaces the field on first keystroke, matching today's select-all behaviour.
9. 712 to 784 pt — Primary action. Full width 60 pt accent button reading Log set 2 · 70 x 8. While a rest is running this zone becomes a rest slab: 01:15 at 44 pt monospaced over a draining 4 pt rule, with three 44 pt controls +15, Skip and a More menu for other adjustments, and a 44 pt secondary button Log set 3 now so resting never blocks logging.
10. 784 to 852 pt — Session strip in the safe area: 18:42 · 6 of 15 sets · 2,310 kg. Tapping it opens the full session overview sheet listing every exercise and set, which is also the out-of-order jump control.

### Interaction sequence

1. Open the app on Train. The next-up card reads Upper A, 5 exercises, 15 sets, 45 min last time. Tap Start Upper A. The deck opens full screen on card 1.
2. The setup note strip already reads Rack height 9 · feet under knees, so reviewing setup costs nothing. Tap the strip, correct it to Rack height 9 · feet under knees · shoes off, tap Done; the edit is committed immediately and is visible on the exercise page afterwards.
3. Set 1 was logged earlier at 70 kg x 9 RPE 8 and the ledger shows the tick. Set 2 is the live row. The segmented control is on KG and the readout shows 70.
4. To change the load, tap plus once for 72.5 or type 7 then 2 then . then 5 on the pad. Tap REPS in the segment and type 8, or tap the reps plus stepper. Tap RPE and type 8. Optionally tap RIR and type 2.
5. Tap Log set 2 · 72.5 x 8. The row fills with a success tick, the rest slab replaces the button zone and starts at 120 seconds, the live row advances to set 3, and a PR chip appears only if the result beats a stored record; 70 x 8 against a 72.5 kg heaviest working load shows no chip.
6. During rest, tap +15 to add fifteen seconds, or Skip to end it. Lock the phone and the Live Activity shows Bench Press, 01:15 counting down, with Skip and +15 as buttons; a local notification fires if the Live Activity is unavailable.
7. If the log was wrong, tap row 2. It becomes the live row again with its values loaded, the button reads Update set 2, and the undo arrow on the row clears the completion entirely. Correcting a set does not restart rest.
8. Swipe left or tap chip 3 to reach Lateral Raise (Dumbbell). Its chip is bracketed with Face Pull (Cable). After logging a lateral raise set the deck pages itself to Face Pull and the button reads Log set 1 · Face Pull, with a small SUPERSET label above the chip rail. Tapping the Lateral Raise chip overrides the routing and the app stays where you put it until you log again.
9. Tap Minimise. The deck collapses to the dock bar above the tab bar reading Upper A · Face Pull · set 1 of 3 · 00:42 rest. Browse Library or Progress freely; the rest countdown keeps running in the dock and in the Dynamic Island.
10. Tap Start on any routine row while minimised. A dialog appears: Upper A is in progress, with Resume Upper A and Cancel. Nothing new is started.
11. Tap the dock bar to reopen. The deck restores the exercise and set you left, scrolled to the live row.
12. Tap the ellipsis, then Finish workout. A sheet lists what will be saved: 13 of 15 sets completed, 2 sets will be recorded as skipped, with Save workout and Discard. Discard requires a second confirmation naming the workout. Saving shows a completion summary: duration, sets completed and skipped, total external load, per-exercise lines, any records set, and an Add to Apple Health button that requests permission only when tapped.

### Sample screens

**Today**

White canvas. A 20 pt muted date line sits 24 pt below the nav bar, left aligned at the 20 pt margin, with a gear glyph top right. Below it a full-bleed-to-margin surface card, 20 pt radius, 24 pt internal padding: a tiny uppercase program label, then the routine name at 28 pt semibold, then a single row of three figures separated by thin vertical rules, each a 22 pt monospaced number above an 11 pt uppercase caption. The accent Start button fills the card's width at 60 pt tall with 20 pt of space above it. Under the card, a row of three equal outline buttons. Then a hairline, then the week strip: seven evenly spaced 44 pt cells, filled accent for trained days, outlined for untrained, each with an 11 pt weekday initial beneath. Then Last session as a plain row with a chevron. Then a section header and the routines list, each row name at 17 pt with a 13 pt muted summary beneath and a compact Start button pinned right.

Visible copy:
- Thursday 1 October
- UPPER / LOWER
- Upper A
- 5 exercises
- 15 sets
- 45 min last time
- Start Upper A
- Open workout
- Timer
- Log activity
- THIS WEEK
- 3 sessions
- M T W T F S S
- Upper A · Tue 29 Sep · 43 min · 15 sets
- ALL ROUTINES
- Upper A · 5 exercises · 15 sets
- Lower A · 5 exercises · 16 sets
- Start

**Active workout**

Full screen over the tab bar. The chip rail runs edge to edge under the nav bar, the first chip filled accent and the third and fourth joined by a thin bracket. The exercise name sits large at the left margin with a chevron at the right. The setup strip is a full-width tinted band with a 4 pt accent bar on its leading edge. The ledger's three rows are separated by hairlines, the middle row carrying an accent leading bar and a slightly raised surface tint. Below them the two big rounded numerals sit side by side with a 16 pt gutter, captions centred beneath each. The keypad occupies a fixed 172 pt block: a segmented control across the top, then a two-column layout with steppers on the left at 72 pt wide and the digit grid filling the rest. The accent Log button spans the full width beneath it, and a thin muted session line closes the screen.

Visible copy:
- Upper A
- 18:42
- 1 Bench Press
- 2 Seated Row
- 3 Lateral Raise
- 4 Face Pull
- Bench Press (Barbell)
- BARBELL · CHEST · 3 x 8-10 · 70 KG · 120 S · RPE 8
- Rack height 9 · feet under knees
- LAST TIME 67.5 x 10 · 9 · 8
- Hold 70 kg, 8 or more reps on all sets to progress
- 1  70 kg x 9  RPE 8
- 2  70 kg x 8  RPE 8
- 3  70 kg x --
- 70
- KG
- 8
- REPS
- RPE 8
- RIR 2
- 25 kg per side
- KG  REPS  RPE  RIR
- Log set 2 · 70 x 8
- 18:42 · 6 of 15 sets · 2,310 kg

**Library**

Standard navigation stack with a large title and a search field pinned beneath it. Two filter buttons sit in a 44 pt row under search, left aligned, each a bordered pill with a chevron; active filters appear as accent-tinted removable chips to their right. A RECENT section shows three rows, then ALL EXERCISES runs alphabetically with sticky letter headers. Each row is 68 pt tall: a 64 pt square drawing or glyph at the leading edge on a surface tile with 10 pt radius, the exercise name at 17 pt, and a 13 pt muted line giving equipment and, where present, the brand and model. A Select button in the nav bar turns the list into checkboxes with a bottom accent bar reading Add 2 exercises.

Visible copy:
- Library
- Search exercises
- row
- Muscle
- Equipment
- Back
- Machine
- RECENT
- Bench Press (Barbell)
- Barbell · Chest
- Seated Row (Machine) · Machine A
- Machine · Back
- RESULTS FOR ROW
- Bent-Over Row (Barbell)
- Cable Row (Cable)
- Chest-Supported Row (Machine) · Machine B
- Seated Row (Machine) · Machine A
- Single-Arm Row (Dumbbell)
- Select
- Add 2 exercises
- Show archived

### Strength, tradeoff and effort

**Strength:** The motor pattern for logging is identical for every set in the app and lives entirely in the bottom 310 points of the screen. Because numeric entry never raises the system keyboard, the live card never resizes, never scrolls underneath a keyboard, and the Log button is always in the same place even when you are out of breath and looking at the screen for half a second. It also sidesteps the keyboard toolbar frame warning for all numeric fields.

**Tradeoff:** You cannot see the whole session at once. Checking what is left, reordering exercises, or logging out of order all cost a tap into the chip rail or the session overview sheet, which is slower than a single list for people who like to survey the plan. The custom keypad is non-standard: it has to carry its own VoiceOver and Dynamic Type behaviour, and users who prefer the system decimal pad need a settings escape hatch, which the design includes.

**Implementation effort:** high. A paged deck host with explicit index control, a custom keypad with its own focus model replacing the existing TextField and keyboard Next chain, a dock bar that has to survive on every tab, and a fullScreenCover presentation path replacing the current sheet coordination. No stored data changes: the focused field, the current card index and the keypad mode are all view state, so no migration and no schemaVersion bump.

### Accessibility

Every interactive element is at least 44 pt tall; keypad keys are 56 pt and the Log button 60 pt. Completion, live and skipped states each carry a shape as well as a colour: a filled tick for completed, an accent leading bar plus a filled dot for live, a struck em dash for skipped, so nothing depends on hue. Accent on canvas and accent-fill with its label both exceed 4.5:1 in light and dark. VoiceOver reads the live row as Set 2 of 3, 70 kilograms by 8 reps, RPE 8, not yet logged, and the Log button as Log set 2, 70 kilograms by 8 reps; the keypad keys are grouped under a Number pad container with the selected field announced on change. The chip rail is an adjustable element so a VoiceOver user can swipe between exercises without flicking through chips. Dynamic Type is honoured to AX5 with the stacked and two-column fallbacks described above, and the exercise header truncates to two lines rather than shrinking. Reduce Motion replaces the page transition and the post-log scroll with a crossfade, and the rest slab's draining rule becomes a stepped numeric readout.

### Preserved features

- **1. Starting and resuming:** Train tab next-up card and routine rows, fullScreenCover workout, dock bar above the tab bar on every tab, and a named Upper A is in progress dialog on any competing Start.
- **2. Strength logging:** Live set panel plus keypad rail; set type pill per row; previous-session comparison line; add, delete and reorder from the ellipsis menu; replacement warns that recorded sets for that exercise are removed from this session.
- **3. Equipment setup:** Setup note strip under every exercise header, editable in place and mirrored on the exercise page; brand and model in the micro row and in library rows; default weight jump in Settings and per exercise, seeding only new prescriptions; archive and restore in Library.
- **4. Supersets:** Bracketed chips in the rail, automatic paging to the partner after logging, manual override by tapping a chip, reordering preserved through the ellipsis menu.
- **5. Rest:** Rest slab replacing the primary action zone, countdown mirrored in the dock bar, Live Activity and Dynamic Island with Skip and +15, local notification fallback, deadline persisted so it survives termination.
- **6. Finishing:** Finish sheet stating how many sets will be saved and how many recorded as skipped, explicit two-step discard, completion summary built only from stored values.
- **7. Routines and programs:** Train tab below Today; routine editor reuses the deck in planning state; program editor as an ordered routine list with a movable Next marker; routine text import as a reviewable parsed table.
- **8. Progression:** Recommendation line under the comparison row in the live card and in the routine editor; recommendations seed entry only and never alter stored prescriptions or history.
- **9. History:** Record tab, Sessions segment; detail reuses the deck in review mode with skipped sets struck; draft editing with Save and Revert; exercise history and records on the exercise page; live PR chips on log.
- **10. Progress:** Record tab, Progress segment: month calendar counting days trained with tap-through to that day's sessions, consistency, volume and muscle count charts, per-exercise charts and records.
- **11. Library:** Its own tab with alias search, muscle and equipment filters, recents, multiselect add, custom exercise create, edit and delete when unused, archive toggle and restore, guide with drawings and muscle figures.
- **12. Plate calculator:** Plate pill under the weight readout opening a per-side sheet with the closest achievable load when the inventory cannot match exactly; bar weight and inventory in Settings.
- **13. Other activities:** Train tab Timer and Log activity buttons; runs and mobility are deck cards with their own fields and computed pace; interval, EMOM and AMRAP timers are a deck card type that can also sit inside a strength workout, recovering from wall time after backgrounding.
- **14. Data and measurements:** Settings sheet sections for export and import with validation and snapshot restore, Hevy CSV with mapping review and deduplication, Measurements with swipe to remove, Apple Health export and bodyweight read with permission requested at the point of action.
- **15. Sample and recovery:** Settings Sample database section, clearly temporary and never merged; read-only recovery replaces the Train tab with an explanatory page and a persistent bar on every tab; Artwork credits in Settings.

## Ledger — claude-2

Cadence becomes a written training record. A session is one continuous ruled page you can see all of, every set is a line you can write on at any time, and you tick lines off as you do them. It reads like the notebook a serious lifter already keeps, and the app never hides a number from you to make room for something else.

### Distinctive principle

No expand and collapse anywhere in the workout. Every set in the session is a fully editable table row at all times, and the live set is marked by a rule and an accent bar rather than by turning into a different, larger component. Because nothing changes height, the scroll position never moves under your thumb, logging out of order is free, and correcting yesterday's mistake uses the same row you logged it in. The second structural choice is that there is no tab bar: the app is one Desk page and one navigation stack, with a single persistent control for the active workout.

### Navigation

No tab bar. The app is a single NavigationStack rooted on Desk, a long scrolling page of sections in reading order: Today, This week, Start, Routines, Programs, Recent sessions, Measurements, and a footer row to Settings. Everything else is a push: Progress, History, Library, each exercise, each routine. Two pieces of persistent chrome prevent the deep stack from becoming a maze. First, a magnifier in the Desk nav bar opens a global search sheet that searches exercises, routines and past sessions in one list, so any screen is two taps away. Second, a 56 pt Now bar pinned to the bottom of every screen in the stack whenever a workout is active: the ruled bar shows Upper A, the current exercise, set n of total, and the rest countdown, with the whole bar as the resume target. When no workout is active the bar is absent and the screen is taller. The active workout itself is a full screen cover with its own stack. Any Start control tapped while a workout is active opens a dialog reading Upper A is still open, with Open Upper A and Cancel.

### Visual system

| Role | Light | Dark |
| --- | --- | --- |
| canvas | `#F4EFE4` | `#121110` |
| surface | `#FCF9F2` | `#1D1A16` |
| ink | `#1B1813` | `#EEE7DA` |
| muted | `#6D6354` | `#9B9183` |
| accent | `#9B3A1A` | `#E07A4D` |
| success | `#3F6B2C` | `#8FC56B` |

**Typography:** New York (SF Serif) carries identity: screen titles 26 pt semibold, exercise names 22 pt semibold, session titles 20 pt. SF Pro Text carries interface: body 16 pt, secondary 14 pt, buttons 17 pt semibold. SF Mono carries every number in a table: 17 pt regular for kg and reps cells, 15 pt for RPE and RIR, 13 pt for timestamps and totals. Monospace is the point, because the ledger's value is that columns line up down the page. Column headings and section labels in SF Pro Text 11 pt semibold uppercase with tracking +0.8. Setup notes are set in New York 15 pt italic in accent so they read as marginalia rather than data. Dynamic Type is supported to AX5: the table keeps five columns to accessibility1, then reflows each set into a two-line stacked card with SET 2 on the first line and KG 70, REPS 8, RPE 8 as labelled pairs on the second, with the tick box moving to the trailing edge of the first line. Serif titles truncate to two lines rather than shrinking.

**Component grammar:** Rules, not cards. 0.5 pt hairlines in a 12 percent ink tint separate rows; 1 pt rules in a 24 percent tint close an exercise block. No shadows, no card radii; the only rounded things are buttons at 6 pt and the tick box at 6 pt. Margins 16 pt, which is tighter than the Deck direction on purpose. Row height 48 pt, column widths fixed as SET 40 pt, KG 86 pt, REPS 72 pt, RPE 60 pt, with the tick box filling the remaining 56 pt trailing column. Alternating rows carry a 3 percent ink wash so the eye tracks across. The live row gains a 3 pt accent leading bar and a slightly warmer surface tint. Native components: List with plain style and pinned section headers, Section for each exercise, searchable for global search, Menu for row and exercise options, swipeActions for delete and set type, Charts, Form for settings. Imagery lives on exercise pages and in the library as a 56 pt drawing at the leading edge of a row and as full width primary and secondary muscle figures on the guide; it is deliberately kept out of the ledger page, because a drawing in a table ruins the alignment that makes the table worth having. Where no drawing exists, the exercise page shows the muscle figures alone at full width and the row shows a ruled placeholder of the same 56 pt so lists do not jump.

### Screen plans

**today**

The top of Desk. A serif date heading Thursday 1 October. Under it a ruled block titled NEXT IN UPPER / LOWER with the routine name in serif 26 pt and a three-column monospaced line reading 5 EXERCISES, 15 SETS, 45 MIN LAST TIME under uppercase column heads, exactly the same table idiom as the workout page. A single accent Start Upper A button 52 pt tall sits under the rule. Below, a ruled THIS WEEK row of seven cells with weekday initials and a filled square for each trained day and the count 3 sessions at the right. Below that a START section with three plain rows, Open workout, Timer, Log a run or activity, each with a chevron. The Routines and Programs sections follow as lists of ruled rows with a trailing Start text button; the row body pushes to the preview.

**activeWorkout**

Described in detail in activeLayout.

**routinesPrograms**

Pushed from Desk. The routine editor is literally the ledger page in a planning state: the same five column table, but the KG column holds the prescribed load, a REPS column holds the rep range 8-10, and two further columns hold REST and RPE. Progression is a per-exercise footnote line under the table reading Double progression · 8-10 reps · +2.5 kg when all sets reach 10, with a tap to change. Superset groups are drawn as a brace in the left margin spanning the grouped exercise blocks. The program editor is a numbered ordered list of routines with a caret marking the next one, and a plain sentence under it saying this advances when you finish a routine and is not tied to dates. Text import pastes into a sheet that produces a draft ledger page you correct row by row before saving; unmatched lines stay red and block saving until mapped or removed.

**history**

Pushed from Desk Recent sessions, or from global search. A list of ruled rows grouped by month: Tue 29 Sep, Upper A, 43 min, 15 sets, 3,120 kg, all in monospace so the columns align down the months. Session detail is the same ledger page, read-only, with skipped rows showing an open tick box and the word SKIPPED in muted small caps in the RPE column. Edit creates a draft copy of the page; the nav bar shows Editing draft with Save and Discard changes, and nothing touches storage until Save.

**progress**

Pushed from Desk. Top is the month calendar as a ruled grid, each trained day a filled square, with the caption 12 days trained in October; tapping a day pushes that day's sessions. Then a Charts section using Charts with hairline axes and no gradients: weekly consistency as a step line, weekly external load as bars labelled in kg, primary-muscle working sets as a ruled horizontal bar table with the count in monospace at the right. Then Records, a ruled table of exercises with heaviest working load and estimated max, pushing to the exercise page.

**libraryExerciseDetail**

Pushed from Desk, from global search, or from Add exercise during a workout. A searchable list with a filter row of two Menu buttons for muscle and equipment. Rows are ruled, 64 pt, drawing at the leading edge, serif name, monospace secondary line reading MACHINE · BACK · MACHINE A. Recents sit under a RECENT heading first. Select mode adds tick boxes in the same 56 pt trailing column used by the workout table, which makes the idiom consistent. The exercise page opens with the drawing and muscle figures, then a ruled facts table (equipment, primary and secondary muscles, brand and model, default weight jump), then the setup note as italic marginalia, then History as a ruled table of every logged set by date, then Records, then a line chart. Archive sits at the bottom with text explaining that history and routine references are kept.

**settingsRecoveryMeasurements**

Pushed from the Desk footer, a standard Form. Sections: Defaults (weight jump, bar weight, plate inventory as an editable ruled table of plate pairs), Rest, Appearance, Measurements, Apple Health, Data, Sample database, Artwork credits, About. Measurements is a ruled table of dated entries, bodyweight plus custom metrics with their own units, swipe to remove, with a small sparkline per metric. Data holds export, import with validation, restore previous snapshot, pre-import recovery copies, and the Hevy CSV importer whose mapping review is itself a ruled two-column table of CSV name to Cadence exercise with a change control on each row and a note of how many rows were skipped as already imported. Read-only recovery replaces Desk entirely with a single page: a serif heading Your training record could not be read, a plain paragraph saying the files were left untouched, and two buttons, Restore previous snapshot and Import a backup, with Settings reachable beneath. Every write control in the app is disabled with a muted explanation rather than removed.

### Active screen layout

1. 0 to 54 pt — Nav bar. Left: Minimise. Title: Upper A in New York 17 pt semibold. Right: ellipsis Menu with Add exercise, Reorder exercises, Workout note, Discard workout.
2. 54 to 78 pt — A single ruled status line, monospace 13 pt, muted, spanning the width: THU 1 OCT · 18:42 · 6/15 SETS · 2,310 KG. It is the session footer from the current app, moved to the top where it does not fight the thumb.
3. 78 to 118 pt — Workout title and note. The title Upper A is an inline editable serif field; under it a single tappable line reading Add a note for this session, or the note itself in italic if written.
4. 118 to 166 pt — Pinned exercise header for whichever exercise block you are scrolled into, using List section header pinning. It holds the serif exercise name, a trailing chevron to the exercise page, and a right-aligned monospace prescription 3 x 8-10 · 70 KG · 120 S · RPE 8.
5. 166 to 202 pt — Pinned setup note line, directly under the pinned header and inside the same pinned container: a wrench glyph and Rack height 9 · feet under knees in accent italic. These two pinned lines are the only things that follow you down the page, so the information you need between sets is always on screen while the rest of the record scrolls.
6. 202 to 230 pt — Column heads for the current block: SET, KG, REPS, RPE, with the tick column unlabelled.
7. 230 to 470 pt — The Bench Press table. Row 1: 1, 70, 9, 8, filled success tick with a long press or swipe for Undo. Row 2 is the live row with the accent leading bar: 2, 70, 8, 8, empty tick box. A thin LAST TIME line sits immediately under the table in muted monospace reading 67.5 x 10 · 67.5 x 9 · 67.5 x 8, and under it the recommendation in accent, Hold 70 kg, 8 or more on all sets to progress. Row 3: 3, 70, empty, empty, empty tick box. An Add set row closes the block. Set type is a swipe action and a left-margin letter, W for warm-up, F for failure, D for drop, A for AMRAP, T for timed, so type is visible without a control taking space.
8. 470 to 520 pt — When a rest is running it appears as a full-width band inside the table, directly beneath the row you ticked: RESTING 01:15 in monospace with a 2 pt draining rule, and three text buttons +15, Skip, Adjust, each padded to 44 pt. If you scroll it off, the pinned header area grows by 28 pt to carry a compact RESTING 01:15 · SKIP strip, so the rest is never lost and never duplicated.
9. 520 to 788 pt — Continuing scroll into the next exercise blocks, in prescribed order. Seated Row (Machine) · Machine A with its own setup note Seat 4 · chest pad 3 and its 3 x 10-12 at 45 kg table. Then the braced superset pair, Lateral Raise (Dumbbell) and Face Pull (Cable), with the brace drawn in the left margin and a NEXT caret in that margin on whichever row the routing points to. Then Add exercise as the last row of the page.
10. 788 to 852 pt — Footer bar pinned to the safe area, 64 pt, ruled top edge. Left: a monospace mini total 6/15. Centre: the thumb action, a 44 pt accent button reading Log 70 x 8, which commits the live row without reaching up to its tick box. Right: Finish as a bordered 44 pt button. When you are scrolled away from the live row the centre button reads Jump to set 2 on first tap and Log 70 x 8 on the second, so the button never logs something you cannot see.

### Interaction sequence

1. Desk opens on Thursday 1 October with Upper A in the next block. Tap Start Upper A. The ledger page opens full screen, scrolled to the first unlogged row with the pinned header showing Bench Press and the setup note.
2. The setup note is already on screen. Tap it, the line becomes an editable field in place with the keyboard and a Done bar, type the change, tap Done. The page does not resize because the note was already a single line.
3. Set 1 shows 70, 9, 8 with a filled tick. Set 2 is the live row. Tap the KG cell: the value selects whole, the decimal pad rises with a toolbar reading minus 2.5, plus 2.5, Next, Done. Type 72.5 or tap plus 2.5 once.
4. Tap Next. Focus moves to REPS on the same row, value selected. Type 8. Tap Next again for RPE, type 8. Next from the last column moves to the KG cell of row 3, which is how you pre-fill a whole exercise if you want to.
5. Tap Done to dismiss the pad, then tap the row's tick box, or without dismissing anything tap the footer button reading Log 72.5 x 8. Either commits the set. The tick fills green, the row keeps exactly the same height, a rest band appears directly beneath it at 02:00, and the accent bar and the NEXT caret move to row 3. Nothing scrolls.
6. A PR mark appears in the left margin only when the set beats a stored record; 70 x 8 against a 72.5 kg heaviest working load gets no mark, and the margin stays empty rather than showing a consolation badge.
7. During rest, tap +15 or Skip in the band. Scroll down to read ahead and the band is mirrored as a compact strip under the pinned header. Lock the phone and the Live Activity shows Bench Press, the countdown, Skip and +15; a notification is the fallback.
8. If the log was wrong, tap the tick box again. A confirmation-free undo clears completion and leaves the numbers, or swipe the row for Undo and Delete set. You can also just retype the cells of a completed row: changing a logged value updates it in place and leaves the tick filled, because a ledger is a record you correct, not a sequence you replay.
9. Scroll to the braced pair. After you tick a Lateral Raise row the NEXT caret jumps to the Face Pull row and the page scrolls just far enough to put that row under the pinned header. Tapping any other row's cell moves the caret there instead, and the routing resumes from wherever you logged last.
10. Tap Minimise. The page closes to the Desk with the 56 pt Now bar pinned at the bottom reading Upper A · Face Pull · set 1 of 3 · 00:42. Push into Library or Progress; the bar follows down the stack.
11. Tap Start on another routine row. The dialog reads Upper A is still open, with Open Upper A and Cancel.
12. Tap the Now bar to return; the page restores its scroll offset and the caret. Tap Finish. A sheet summarises 13 of 15 sets logged, 2 rows will be saved as skipped, and offers Save session and Discard session, with discard requiring a second confirmation. Saving writes the session and shows the finished page in review mode with a short ruled summary at the top: duration, sets, total load, any records, and an Add to Apple Health row.

### Sample screens

**Today**

Warm paper canvas with no cards at all. A serif date heading at the 16 pt margin, a 1 pt rule under it. The next-up block is defined by two rules: an uppercase 11 pt label, the serif routine name at 26 pt, then a three-column monospace row sitting under three uppercase column heads, the columns evenly dividing the width with hairline dividers between them. A 52 pt accent button spans the content width. A 1 pt rule closes the block. The week row is seven filled or hollow 20 pt squares evenly spaced with initials beneath and a right-aligned count. The lists below are plain ruled rows, serif name on the left, monospace summary right-aligned above the rule, with a small accent Start text button at the trailing edge.

Visible copy:
- Thursday 1 October
- NEXT IN UPPER / LOWER
- Upper A
- EXERCISES  SETS  LAST TIME
- 5    15    45 MIN
- Start Upper A
- THIS WEEK
- M T W T F S S
- 3 sessions
- START
- Open workout
- Timer
- Log a run or activity
- ROUTINES
- Upper A
- 5 EX · 15 SETS
- Start
- Lower A
- 5 EX · 16 SETS
- RECENT SESSIONS
- Tue 29 Sep · Upper A · 43 MIN · 15 SETS

**Active workout**

One continuous ruled page. The status line, title and note sit at the top in reading order. The pinned header occupies two lines, serif name with a right-aligned monospace prescription on the first, accent italic setup note on the second, with a 1 pt rule beneath that visually anchors the table. The table has fixed columns; numbers are right-aligned in their columns so decimals line up down the page. Row two carries a 3 pt accent bar at the leading edge and a faintly warmer background. Directly beneath the table sit two small lines, the previous session comparison in muted monospace and the recommendation in accent, then the rest band as a full width ruled block. Further down, the brace for the superset pair is drawn as a thin accent bracket in the 12 pt left margin spanning both exercise blocks. The footer bar is separated by a 1 pt rule, with the total at the left, the accent log button centred, and Finish outlined at the right.

Visible copy:
- Upper A
- THU 1 OCT · 18:42 · 6/15 SETS · 2,310 KG
- Add a note for this session
- Bench Press (Barbell)
- 3 x 8-10 · 70 KG · 120 S · RPE 8
- Rack height 9 · feet under knees
- SET  KG  REPS  RPE
- 1   70   9   8   ✓
- 2   70   8   8
- 3   70   --  --
- LAST TIME 67.5 x 10 · 67.5 x 9 · 67.5 x 8
- Hold 70 kg, 8 or more on all sets to progress
- RESTING 01:15   +15   Skip   Adjust
- Add set
- Seated Row (Machine) · Machine A
- 3 x 10-12 · 45 KG
- Seat 4 · chest pad 3
- Lateral Raise (Dumbbell)
- Face Pull (Cable)
- Add exercise
- 6/15
- Log 70 x 8
- Finish

**Progress**

A pushed page with a serif large title. The month grid is drawn with hairlines as a true grid rather than floating circles: seven columns, weekday initials in 11 pt uppercase across the top, each cell 44 pt with a filled 20 pt square centred on trained days. A caption line sits under the grid. A 1 pt rule, then the charts: each chart is 140 pt tall with hairline axes, no fill gradients, monospace axis labels, and a one-line serif heading plus an 11 pt uppercase unit label. Muscle counts are a ruled table rather than a chart, with the muscle name in serif at the left and the working-set count right-aligned in monospace. The records table at the bottom uses the same five-column idiom as the workout page so the whole app reads as one document.

Visible copy:
- Progress
- OCTOBER
- M T W T F S S
- 12 days trained in October
- Tap a day to see its sessions
- WEEKLY CONSISTENCY
- SESSIONS PER WEEK
- WEEKLY EXTERNAL LOAD
- KG
- WORKING SETS BY PRIMARY MUSCLE · LAST 4 WEEKS
- Chest    24
- Back     31
- Quads    18
- Shoulders 16
- RECORDS
- EXERCISE  HEAVIEST  EST. MAX
- Bench Press (Barbell)  72.5  92
- Seated Row (Machine) · Machine A  52.5  --

### Strength, tradeoff and effort

**Strength:** You can see and change the whole session at once. Logging out of order, fixing a set you mistyped two exercises ago, pre-filling the next exercise while you rest, and reading what is left all cost one tap on the thing itself, because every set is already a live editable row. It is the fastest direction for people who think in terms of the whole session, and it makes supersets obvious because both exercises are visible at the same time with a brace joining them.

**Tradeoff:** It is dense. Table cells are 48 pt rows with columns as narrow as 60 pt, which is harder to hit accurately than a large card while your hands are shaking, and that is why the footer carries a second large log button. Removing the tab bar means Progress and History are a scroll plus a push rather than one tap, which the global search mitigates but does not eliminate. The warm paper palette and serif titles are a strong opinion that some people will simply dislike, and the dark mode is a dim warm page rather than true black, so it is not the best choice on an OLED screen in a dark gym.

**Implementation effort:** medium. Mostly a List and Section layout with a fixed column grid, which SwiftUI handles well, and it keeps the system keyboard and the existing keyboard Next chain rather than replacing them. The real work is removing the TabView in favour of one stack with a persistent Now bar and a global search sheet, the pinned header and setup note container that also absorbs the rest strip, and the Dynamic Type reflow from table to stacked pairs. No stored data changes: pinning, caret position and draft state are view state, so no migration and no schemaVersion bump.

### Accessibility

Rows are 48 pt and every tick box, button and swipe action is at least 44 pt; the footer log button is 44 pt and full-thumb width. State is never colour alone: completed is a filled tick glyph, live is an accent bar plus a caret in the margin, skipped is an open box plus the word SKIPPED, set types are letters W, F, D, A, T in the margin, and records are a star glyph rather than a coloured number. Ink on paper gives roughly 13:1 in light mode and 12:1 in dark; accent on canvas clears 4.5:1 in both and is never the only carrier of meaning. VoiceOver treats each row as one element reading Set 2, 70 kilograms, 8 reps, RPE 8, not logged, double tap to log, with a custom rotor action for Edit values, Set type and Delete. The pinned header is an accessibility container announced on exercise change. Serif text is used only at 20 pt and above, never for small data, which keeps legibility fine for low vision; the stacked AX reflow is described above. Reduce Motion removes the jump-to-row animation and renders the rest band's draining rule as a numeric countdown only. Reduce Transparency has nothing to disable because the design uses no blur.

### Preserved features

- **1. Starting and resuming:** Desk next-up block and routine rows with separate Start buttons, full screen ledger, persistent Now bar in the single stack, and an Upper A is still open dialog on any competing Start.
- **2. Strength logging:** The ledger table itself: kg, reps, RPE and RIR columns, select-all entry with the decimal pad and a Next chain across and down, previous-set line under each table, set types as margin letters and swipe actions, add and delete rows, reorder and replace from the exercise header menu with the removed-sets warning.
- **3. Equipment setup:** Pinned setup note line under every exercise header, editable in place and mirrored on the exercise page; brand and model in the header and library rows; per-exercise default weight jump on the exercise page, seeding new prescriptions only; archive and restore at the foot of the exercise page.
- **4. Supersets:** A margin brace spanning grouped exercise blocks, a NEXT caret that moves to the partner's row after a tick, manual override by tapping any row, reordering within the brace preserved.
- **5. Rest:** Rest band inside the table beneath the logged row, mirrored as a compact pinned strip when scrolled off, persisted deadline, +15, Skip and Adjust, Live Activity and Dynamic Island, notification fallback.
- **6. Finishing:** Footer Finish, a summary sheet stating logged and skipped counts, two-step discard, and a review-mode page with a ruled summary built from stored values only.
- **7. Routines and programs:** Desk sections; the routine editor is the same ledger table in planning state with progression as a footnote per exercise; programs are a numbered ordered list with a next caret; text import produces a correctable draft page that blocks saving on unmatched lines.
- **8. Progression:** Recommendation line under each exercise table and in the routine editor footnote, seeding entry without altering stored prescriptions or past sessions.
- **9. History:** Desk Recent sessions and global search; session detail is the same page read-only with SKIPPED rows; draft editing with Save and Discard changes; per-exercise history table on the exercise page; PR margin marks on log.
- **10. Progress:** Pushed Progress page: ruled month grid counting days trained with tap-through, consistency and volume charts, muscle working-set table, records table linking to exercise pages.
- **11. Library:** Pushed from Desk, search and the workout's Add exercise; alias search, muscle and equipment filters, recents, select mode with the same tick column, custom exercise create, edit and delete when unused, archive toggle, guide with drawings and muscle figures.
- **12. Plate calculator:** A small per-side footnote under the KG cell for barbell exercises reading 25 / SIDE, tappable to the full sheet with the closest achievable load; bar weight and plate inventory as an editable table in Settings.
- **13. Other activities:** Desk Start section; a run or mobility entry is a ledger page with its own columns (distance, duration, computed pace, or duration and effort); interval, EMOM and AMRAP are a ledger block of round rows you tick off, with work and rest settings in the block header, wall-time recovery after backgrounding and foreground-only phase cues.
- **14. Data and measurements:** Settings Form: export and import with validation, snapshot restore, pre-import recovery copies, Hevy CSV with a two-column mapping review table and duplicate reporting, Measurements as a dated ruled table with swipe to remove, Apple Health export and bodyweight read with permission on demand.
- **15. Sample and recovery:** Settings Sample database section marked temporary and never merged; read-only recovery replaces Desk with a plain explanatory page offering restore and import and disables every write control with a visible reason; Artwork credits in Settings.

## Session Tape — claude-3

A workout is a tape you add to. The bottom of the screen is a permanent composer already loaded with the next set, everything above it is what has happened so far in order, and logging is always the same three adjustments and one big key. The workout is not a sheet you open, it is the middle tab of the app, always there.

### Distinctive principle

An append-only composer with a fixed footprint. The plan and the record are physically separated: the plan is a thin pinned strip at the top, the record is the scrolling tape, and the composer sits in a 190 pt block at the bottom that never resizes, never moves and never scrolls. Every set, every rest, every note and every exercise handover appears as a dated entry in the tape, so the session reads back as a chronology and the workout screen is also the history screen. This matches the domain, where prescriptions and logged sets are different things, and it means the motor pattern for logging is identical in every situation including supersets, timers and corrections.

### Navigation

Five tabs: Today, Plan, Workout, History, Progress. The centre Workout tab is the active-workout route itself, which is the structural difference from the current app. With nothing active, the Workout tab is a start screen with four large blocks: Start a routine, Open workout, Timer, Log an activity. With a workout active, the same tab is the tape, the tab icon shows a filled dot, and its label changes from WORKOUT to the live elapsed time or the rest countdown so the tab bar is itself the persistent indicator. Minimise is just tapping another tab; resume is just tapping the centre tab, which means there is no sheet, no bottom inset and no separate dock. Any Start control on Today or Plan while a workout is active opens a dialog reading Upper A is in progress, with Go to Upper A and Cancel, naming the active workout, not the routine you tapped. Library is reached from Plan, from the workout's Add exercise, and from a global search field at the top of Plan; it is not a tab because the five slots are spent and the workout tab is worth more.

### Visual system

| Role | Light | Dark |
| --- | --- | --- |
| canvas | `#FFFFFF` | `#06080A` |
| surface | `#EDF1F5` | `#141A21` |
| ink | `#0A0E13` | `#E9EFF5` |
| muted | `#5A6673` | `#8B98A6` |
| accent | `#C4164B` | `#FF5C8A` |
| success | `#15803D` | `#4ADE80` |

**Typography:** SF Pro with the width axis doing the identity work, which is available natively from iOS 16 through Font.Width and needs no custom font file. Scoreboard numerals: SF Pro Display 44 pt heavy, width condensed, monospacedDigit, tracking -1, used for the composer's three values and for the rest countdown. Section and strip labels: SF Pro Text 11 pt heavy, width compressed, uppercase, tracking +1. Tape entry primary line: SF Pro Text 17 pt semibold with monospacedDigit for the numbers inside it. Tape secondary line: 14 pt regular muted. Exercise names in the plan strip: 15 pt heavy condensed uppercase. Buttons: 18 pt heavy. Body text elsewhere: SF Pro Text 16 pt. Dynamic Type to AX5: the composer's three stepper cells sit in a row to accessibility1, then stack into three full-width rows each 72 pt tall with the label on the left, the value centred and minus and plus at either end, and the tape entries reflow from a two-line to a four-line stack. The condensed width is dropped at AX3 and above in favour of the default width, because condensed glyphs lose legibility exactly where it matters most. The Log key keeps its height and grows downward into space freed by collapsing the plan strip.

**Component grammar:** Solid blocks and hard edges, not hairlines. Surfaces are flat fills with 10 pt radius; the composer block has a 1 pt top border in muted at 20 percent rather than a shadow. 16 pt margins, 12 pt gutters, 8 pt grid. Tape entries are 10 pt radius blocks on surface with a 4 pt coloured leading rail: success for a logged set, muted for a rest, accent for a live rest or a note, ink for an exercise handover. Stepper cells are 10 pt radius blocks 72 pt tall and 44 pt wide for the minus and plus halves, with the value centred and tappable to raise the decimal pad. The Log key is a 62 pt full-width accent block with 12 pt radius and an 18 pt heavy label. Chips are 32 pt with 8 pt radius. Native components: TabView with five tabs, NavigationStack per tab, List for everything retrospective, Charts, Menu, ConfirmationDialog, searchable, and ScrollViewReader to keep the tape pinned to its last entry. Imagery is used sparingly and loudly: a single full-width 180 pt movement drawing at the top of the exercise guide page, 120 pt primary and secondary muscle figures side by side beneath it, and a 44 pt drawing thumbnail in library rows. The tape contains no imagery at all, and the plan strip contains no imagery, because both are read at a glance. Where a drawing is missing the guide shows the muscle figures at the same 180 pt height with an uppercase caption NO DRAWING FOR THIS MOVEMENT, so the page never collapses.

### Screen plans

**today**

Tab one. A full-bleed accent block at the top, 240 pt tall, containing UPPER / LOWER in 11 pt heavy uppercase, UPPER A in 40 pt heavy condensed, a row of three figures in 28 pt condensed with 11 pt uppercase captions beneath, and a white-on-accent START block 62 pt tall at its foot. Under the block, a 72 pt THIS WEEK row of seven solid squares with weekday initials and 3 SESSIONS in condensed at the right. Then LAST SESSION as a single surface block: UPPER A, TUE 29 SEP, 43 MIN · 15 SETS · 3,120 KG. Then a two-up grid of smaller start blocks, OPEN WORKOUT and TIMER, and a wide LOG AN ACTIVITY block. Today is deliberately short; it is a launcher, and everything else lives in Plan.

**activeWorkout**

Described in detail in activeLayout.

**routinesPrograms**

Tab two, Plan. A search field at the top covering routines, programs and exercises. Then PROGRAMS as a list of blocks, each showing the program name, its ordered routines as a row of small chips with the next one filled, and a sentence reading Advances when you finish a routine. Then ROUTINES as blocks with name, exercise count, set count and a trailing START. The routine editor is a planning version of the tape: the plan strip at the top becomes the editable summary, and the body becomes a list of exercise blocks with sets, rep range, load, rest, RPE or RIR target and a progression control reading DOUBLE · 8-10 · +2.5 KG. The composer at the bottom is replaced by an ADD EXERCISE key in the same position, so the thumb habit transfers. Superset groups are formed by selecting two or more blocks and tapping GROUP, and are drawn as a single outlined container labelled SUPERSET with the members inside. Text import opens a sheet: paste, then a reviewable list where each parsed line is a block with its matched exercise and a CHANGE control; unmatched lines are accent-outlined and block saving.

**history**

Tab four. A list of session blocks: UPPER A, TUE 29 SEP, three figures 43 MIN · 15 SETS · 3,120 KG, and a thin 15-segment bar showing logged versus skipped. Opening a session shows the tape exactly as it was, read-only, with the composer area replaced by a summary block and an EDIT key. Edit creates a draft: the tape becomes editable in place, the top strip reads EDITING DRAFT in accent, and SAVE and DISCARD CHANGES replace the Log key. Deleting a session is a confirmation dialog naming it.

**progress**

Tab five. A month calendar as a grid of solid squares, filled for trained days, captioned 12 DAYS TRAINED; tapping a day pushes that day's sessions. Then three charts, each in its own surface block with an uppercase heading and a condensed unit label: weekly consistency as bars, weekly external load in kg as bars, and primary-muscle working sets as a horizontal bar list with counts in condensed numerals. Then EXERCISES as a searchable list of blocks; tapping Bench Press (Barbell) pushes a page whose top is a scoreboard of three figures, HEAVIEST 72.5 KG, EST. MAX 92 KG, BEST 8-10 70 x 9, then an estimated-max line chart, then an Epley table for 1 to 12 reps, then rep records, then every logged set by date.

**libraryExerciseDetail**

Reached from Plan's search, from Plan's LIBRARY row and from Add exercise in the workout. Search with alias matching, two filter Menus for muscle and equipment with active filters as removable accent chips, RECENT first, then all exercises. Rows are 60 pt with a 44 pt drawing thumbnail, the name in 17 pt semibold and an 11 pt uppercase line MACHINE · BACK · MACHINE A. A SELECT key in the nav bar turns rows into checkboxes with an accent ADD 2 EXERCISES key in the composer position at the bottom. The exercise page leads with the drawing and muscle figures, then a scoreboard row of personal figures, then a facts block, then the setup note in an accent-railed block, then history and records. Custom exercises can be created, edited and deleted while unused; archive is a block at the bottom that states plainly that history, routine references and the exercise's identity are kept and that it only disappears from new selection.

**settingsRecoveryMeasurements**

A gear in the Today nav bar opens Settings as a sheet with a standard Form: Defaults, Rest, Appearance, Measurements, Apple Health, Data, Sample database, Artwork credits, About. Measurements is a list of metrics each with a sparkline and a dated entry list, swipe to remove, plus an ADD ENTRY key in the composer position so the habit transfers here too. Data holds export, import with validation, restore previous snapshot, pre-import recovery copies, and the Hevy CSV importer with its mapping review and a report of how many rows were skipped as already imported. Apple Health exports a finished workout as type and duration only and reads the latest bodyweight, requesting permission at the moment the action is tapped, with stable sync identifiers so repeats do not duplicate and local edits do not rewrite what was exported. Read-only recovery takes over the whole tab bar: all five tabs show the same page, a full-width accent block reading COULD NOT READ YOUR DATA, a plain paragraph saying nothing was changed or deleted, and two keys, RESTORE PREVIOUS SNAPSHOT and IMPORT A BACKUP, with a link to Settings and to Artwork credits beneath.

### Active screen layout

1. 0 to 52 pt — Nav bar on the Workout tab. Left: 18:42 in condensed monospaced digits. Centre: UPPER A in 17 pt heavy condensed uppercase. Right: FINISH as an accent-outlined 44 pt text button, and an ellipsis Menu holding Add exercise, Reorder, Workout note, Discard workout.
2. 52 to 120 pt — Plan strip, pinned, tappable to expand. Line one in 11 pt heavy uppercase muted: NEXT · SET 2 OF 3 · 3 x 8-10 · 70 KG · RPE 8 · REST 120 S. Line two is a 6 pt progress rail of 15 segments, 6 filled success, 1 accent for the live set, 8 empty, which is the whole session at a glance in one row. Tapping the strip opens a sheet listing every remaining exercise and set, which is also how you log out of order: tap any set in the sheet and the composer loads it.
3. 120 to 176 pt — Setup note block, pinned under the strip, 4 pt accent rail, wrench glyph, RACK HEIGHT 9 · FEET UNDER KNEES at 15 pt. It always shows the note for the exercise currently in the composer and is tappable to edit. This and the plan strip are the only fixed things at the top, so between sets the two facts you need are on screen without scrolling.
4. 176 to 610 pt — The tape, scrolled to its last entry and kept there by ScrollViewReader. Entries from older at the top to newest at the bottom. Example contents from the top of the visible region downward: an exercise handover entry, ink rail, BENCH PRESS (BARBELL) with a secondary line 3 WORKING SETS · LAST TIME 67.5 x 10 / 9 / 8. Then a logged-set entry, success rail: SET 1 · 70 KG x 9 · RPE 8 with a secondary line LAST TIME 67.5 x 10 and an UNDO text button at the trailing edge. Then a rest entry, muted rail: REST 120 S · COMPLETE. Above those, earlier entries from the warm-ups and the first exercise remain in the tape and can be scrolled back to and tapped to correct. The last entry when a rest is running is a live rest block, accent rail, 72 pt tall: RESTING in 11 pt uppercase, 01:15 in 44 pt condensed, a draining 4 pt bar, and two 44 pt keys +15 and SKIP.
5. 610 to 724 pt — Composer, fixed. Line one is a 32 pt exercise row: the exercise name in condensed uppercase at the left, a WORKING chevron chip for set type at the right. For a superset this row shows two chips, LATERAL RAISE and FACE PULL, with the active one filled accent, and tapping the other switches manually. Line two is three stepper cells in a row, each 72 pt tall: KG with minus, 70, plus; REPS with minus, 8, plus; RPE with minus, 8, plus. Under the KG cell, an 11 pt line reads 25 / SIDE and is tappable to the plate calculator. A small RIR 2 chip sits to the right of the RPE cell when RIR is enabled. Tapping any value raises the decimal pad with select-all and a Next and Done toolbar; the composer stays put and only the tape scrolls, so the Log key is never covered.
6. 724 to 790 pt — The Log key, fixed, 62 pt, accent fill, reading LOG SET 2 · 70 x 8. Pressing it appends a logged-set entry to the tape, starts rest and appends the live rest block, advances the composer to set 3 or to the superset partner, and updates the plan rail. If the result beats a stored record the new tape entry carries a PR chip; 70 x 8 against a 72.5 kg heaviest working load gets none.
7. 790 to 852 pt — Tab bar, with the centre Workout tab showing a filled dot and its label replaced by 01:15 while resting or 18:42 otherwise.

### Interaction sequence

1. Open Today. The accent block reads UPPER A, 5 EXERCISES, 15 SETS, 45 MIN LAST TIME. Press START. The app switches to the Workout tab, which is now the tape, with the plan strip, the setup note and the composer loaded with set 1.
2. The setup note is already pinned: RACK HEIGHT 9 · FEET UNDER KNEES. Tap it to edit in a small sheet, press Save; the pinned block updates and the exercise page shows the same note afterwards.
3. Set 1 was logged at 70 x 9 RPE 8 and appears in the tape with a success rail. The composer now reads SET 2, 70, 8, 8.
4. To change the load, press the plus half of the KG cell once for 72.5, or tap the number 70 to raise the decimal pad with the value selected and type 72.5. To change reps, press minus or plus on the REPS cell, or tap and type. Next on the keyboard toolbar moves KG to REPS to RPE; Done dismisses. The composer never moves.
5. Press LOG SET 2 · 72.5 x 8. The tape appends the entry at the bottom, the live rest block appears with 02:00 counting down, the plan rail gains a filled segment, and the composer advances to SET 3 with the same values pre-filled.
6. During rest press +15 or SKIP in the live block. You can also just log set 3 immediately; the Log key is never disabled by a running rest, and logging early ends the rest and appends a REST ENDED EARLY entry so the tape stays truthful.
7. Lock the phone. The Live Activity and Dynamic Island show BENCH PRESS, the countdown, and SKIP and +15 buttons; a local notification is the fallback. Unlocking returns to the Workout tab with the rest still running.
8. To correct the set, press UNDO on its tape entry, which removes the completion and reloads those values into the composer with the key reading UPDATE SET 2, or tap the entry to open a small editor and change the numbers in place. Corrections append nothing new; they amend the entry so the tape does not fill with retractions.
9. When the composer reaches the superset, its exercise row shows LATERAL RAISE and FACE PULL as two chips. Logging a lateral raise set appends a handover entry reading NEXT · FACE PULL and flips the composer to Face Pull. Tapping the LATERAL RAISE chip overrides it, and the routing resumes from wherever you last logged.
10. Tap the History tab to look something up. The workout is untouched; the Workout tab icon keeps a filled dot and its label shows the running rest. Press START on a routine in Plan and a dialog reads Upper A is in progress, with Go to Upper A and Cancel.
11. Tap the centre tab to come back. The tape is where you left it, pinned to its last entry, with the composer still loaded.
12. Press FINISH. A sheet reads 13 OF 15 SETS LOGGED, 2 SETS WILL BE SAVED AS SKIPPED, with SAVE SESSION and DISCARD, discard requiring a second confirmation naming the workout. Saving replaces the composer with a summary block: duration, sets logged and skipped, total external load, a per-exercise list, any records, and an ADD TO APPLE HEALTH key that requests permission only when pressed. The Workout tab then returns to its start screen.

### Sample screens

**Today**

The top 240 pt is a single flat accent block running edge to edge under the status bar with no radius at the top and 16 pt radius at the bottom, white text throughout. Inside it the program label sits small at the top left, the routine name is set enormous in condensed heavy beneath it, and three figures sit in a row divided by 1 pt white rules at 20 percent opacity, each number above a tiny uppercase caption. The START key is a white block inset 16 pt from the accent block's edges with accent-coloured heavy text. Below the block, the week row is seven 36 pt solid squares on surface, filled ink for trained days and outlined for untrained, with initials beneath and a condensed count right-aligned. Last session is one surface block with the routine name left and three figures right. Two half-width surface blocks sit side by side under it, and a full-width one below them.

Visible copy:
- THU 1 OCT
- UPPER / LOWER
- UPPER A
- 5
- EXERCISES
- 15
- SETS
- 45
- MIN LAST TIME
- START
- THIS WEEK
- M T W T F S S
- 3 SESSIONS
- LAST SESSION
- UPPER A · TUE 29 SEP
- 43 MIN · 15 SETS · 3,120 KG
- OPEN WORKOUT
- TIMER
- LOG AN ACTIVITY

**Active workout**

Dark canvas in dark mode, white in light. The plan strip is a thin pinned band whose dominant element is the 15-segment rail, reading as a loading bar for the session. The setup note block sits directly beneath it as a solid surface slab with a thick accent rail on its leading edge. The tape fills the middle as a stack of surface blocks separated by 8 pt gaps, each with its coloured leading rail, numbers inside the primary line set in monospaced digits so the kg values align down the stack even though the blocks are not a table. The live rest block is visually the loudest thing in the tape: taller, accent-railed, with the countdown in 44 pt condensed and two solid 44 pt keys side by side. The composer below is separated by a 1 pt border and sits on canvas with its three stepper cells as equal surface blocks, the numbers large and centred, minus and plus as plain glyphs in the cell's left and right thirds. The Log key is the single largest accent object on the screen.

Visible copy:
- 18:42
- UPPER A
- FINISH
- NEXT · SET 2 OF 3 · 3 x 8-10 · 70 KG · RPE 8 · REST 120 S
- RACK HEIGHT 9 · FEET UNDER KNEES
- BENCH PRESS (BARBELL)
- 3 WORKING SETS · LAST TIME 67.5 x 10 / 9 / 8
- SET 1 · 70 KG x 9 · RPE 8
- LAST TIME 67.5 x 10
- UNDO
- RESTING
- 01:15
- +15
- SKIP
- BENCH PRESS (BARBELL)
- WORKING
- KG
- 70
- 25 / SIDE
- REPS
- 8
- RPE
- 8
- RIR 2
- LOG SET 2 · 70 x 8
- 01:15

**Progress**

Tab five with a large title. The calendar is a grid of 40 pt solid squares with 4 pt gaps, filled ink for trained days and surface for untrained, weekday initials in 11 pt heavy uppercase across the top, and a caption line in condensed numerals beneath. Each chart lives in its own surface block with 16 pt padding, an 11 pt uppercase heading at the top left and a unit label at the top right, and a 140 pt Charts plot with flat accent bars and no gridlines except a single baseline. The muscle list is a block of horizontal bars, each a solid accent bar on a surface track with the muscle name overlaid at the left in 15 pt semibold and the count right-aligned in condensed numerals. The exercise record page, pushed from the list below, opens with a three-figure scoreboard row in the same idiom as the Today block.

Visible copy:
- PROGRESS
- OCTOBER
- M T W T F S S
- 12 DAYS TRAINED
- Tap a day to see its sessions
- WEEKLY CONSISTENCY
- SESSIONS
- WEEKLY EXTERNAL LOAD
- KG
- WORKING SETS BY PRIMARY MUSCLE
- LAST 4 WEEKS
- CHEST 24
- BACK 31
- SHOULDERS 16
- QUADS 18
- EXERCISES
- Bench Press (Barbell)
- HEAVIEST 72.5 KG · EST. MAX 92 KG
- Seated Row (Machine) · Machine A
- HEAVIEST 52.5 KG

### Strength, tradeoff and effort

**Strength:** The logging motion is identical everywhere and never moves. Three cells and one key occupy the same 190 points for every set of every exercise, for supersets, for interval rounds and for adding a measurement, so the gesture becomes automatic and can be done without reading. Because the tape is the record, the workout screen and the session history screen are the same screen, which removes a whole class of mismatch between what you saw while training and what you see afterwards, and the plan strip's 15-segment rail answers how much is left in one glance.

**Tradeoff:** The plan is deliberately secondary. You cannot see all fifteen sets laid out without expanding the strip, so surveying the session, editing the plan mid-workout and logging out of order are all one deliberate step rather than something you can do by scrolling. The tape also grows long in a high-volume session, so finding something from forty minutes ago means scrolling or using the plan sheet. And the scoreboard character, condensed heavy type and a crimson accent on near-black, is loud; it will read as energetic to one person and as shouting to another.

**Implementation effort:** high. The workout moves from a sheet into a tab, which rewrites presentation coordination including the Lock Screen and Live Activity open paths. The tape is a new rendering model and the composer is a new state machine that has to drive supersets, set types, corrections, timers and measurement entry from one component. Important for storage: tape entries are derived at render time from the logged sets, the rest state and the notes that are already stored. Nothing new is written. Where a per-set wall-clock timestamp is not already stored, entries are ordered by set order and labelled against the session elapsed clock rather than a time of day; adding true timestamps would be an optional additive field and is not required for this design. No migration and no schemaVersion bump.

### Accessibility

Stepper halves are 44 by 72 pt, tape buttons 44 pt, the Log key 62 pt and full width, tab bar items standard. State is carried by the leading rail colour and by an explicit glyph and word in every entry: a tick plus the word LOGGED, a clock plus REST, a dash plus SKIPPED, a star plus PR, an arrow plus NEXT, so colour is never the only signal and the rails are also distinguishable by position in the tape. Crimson accent on white gives about 6.5:1 and the dark pink accent on near-black about 8:1; white on crimson clears 4.5:1 at the 18 pt heavy weight used on keys. The condensed width is dropped at AX3 and above, and the composer stacks into three full-width rows as described. VoiceOver reads the composer as a group, Composer, Bench Press, working set, kilograms 70, adjustable; reps 8, adjustable; RPE 8, adjustable, with each cell an adjustable element so swipe up and down change the value by the exercise's weight jump or by one, and the Log key announces Log set 2, 70 kilograms by 8 reps. The tape is a list where each entry is a single element with custom actions for Undo and Edit. The live rest block posts an accessibility announcement at 30 seconds and at zero rather than relying on the bar. Reduce Motion removes the tape's insert animation and the auto-scroll, replacing them with an immediate jump, and renders the draining bar as a numeric countdown. Reduce Transparency has nothing to disable; the design uses flat fills only.

### Preserved features

- **1. Starting and resuming:** Today's accent start block, Plan's routine rows, and the Workout tab's start screen; the Workout tab is itself the persistent active-workout route and indicator; competing Start controls raise an Upper A is in progress dialog with Go to Upper A.
- **2. Strength logging:** Composer for kg, reps, RPE and RIR with steppers and select-all decimal pad entry with a Next chain; set type chip in the composer; previous-set comparison on the secondary line of each tape entry and on the handover entry; add, delete, reorder and replace from the ellipsis menu with the removed-sets warning; workout, exercise and set notes appear as tape entries.
- **3. Equipment setup:** Pinned setup note block above the composer for the exercise being logged, editable there and mirrored on the exercise page; brand and model in the composer's exercise row and library rows; default weight jump in Settings and per exercise, driving the composer's stepper increment and seeding new prescriptions only; archive and restore on the exercise page.
- **4. Supersets:** Two chips in the composer's exercise row with the active one filled, automatic flip to the partner on log with a NEXT handover entry in the tape, manual override by tapping the other chip, group membership and order editable in the routine editor's SUPERSET container.
- **5. Rest:** Live rest block as the last tape entry with +15 and SKIP, persisted deadline, countdown mirrored in the Workout tab label so it is visible from any tab, Live Activity and Dynamic Island with the same two buttons, local notification fallback, and logging allowed during rest.
- **6. Finishing:** FINISH in the nav bar, a summary sheet stating logged and skipped counts, two-step discard, and a completion summary block built only from stored values with an Apple Health key.
- **7. Routines and programs:** Plan tab: programs as ordered routine chips with a next marker and a plain sentence about advancing on completion, routines with create, edit, duplicate, reorder, delete and start, a routine editor using the same composer position for ADD EXERCISE, and a reviewable text import that blocks saving on unmatched lines.
- **8. Progression:** The plan strip's prescription and a recommendation line in the handover entry at the start of each exercise; the composer is pre-filled from the recommendation, so recommendations seed entry and never rewrite stored prescriptions or past sessions.
- **9. History:** History tab list of session blocks; opening one shows the same tape read-only with a summary in the composer position; draft editing with SAVE and DISCARD CHANGES; exercise history and records on the exercise page; PR chips on tape entries at the moment of logging.
- **10. Progress:** Progress tab: month calendar counting days trained with tap-through to that day's sessions, consistency and volume charts, muscle working-set bars, and per-exercise scoreboards, Epley tables, rep records and charts.
- **11. Library:** Reached from Plan's search and LIBRARY row and from Add exercise; alias search, muscle and equipment filter chips, recents, select mode with an ADD n EXERCISES key in the composer position, custom exercise create, edit and delete when unused, archive and restore, and the guide page with the full-width drawing and muscle figures.
- **12. Plate calculator:** A 25 / SIDE line under the composer's KG cell for barbell exercises, tappable to a sheet showing the per-side breakdown and the closest achievable load when the inventory cannot match; bar weight and inventory in Settings.
- **13. Other activities:** The Workout tab start screen's Timer and Log an activity blocks; a run or mobility session uses the same tape with a form-style composer for distance and duration with computed pace, or duration and effort; interval, EMOM and AMRAP run as a tape where the composer becomes START and PAUSE, each round and partial round appends an entry, sequence notes are entries, clocks recover from wall time after backgrounding and phase cues sound in the foreground only.
- **14. Data and measurements:** Settings sheet from Today: export and import with validation, snapshot restore, pre-import recovery copies, Hevy CSV with mapping review and duplicate reporting, Measurements with sparklines, swipe to remove and an ADD ENTRY key in the composer position, Apple Health export of type and duration and bodyweight read with permission requested on the action and stable sync identifiers.
- **15. Sample and recovery:** Settings Sample database section marked temporary and never merged; read-only recovery takes over all five tabs with one explanatory page offering restore and import; Artwork credits in Settings and linked from the recovery page.

## Review notes from Codex

These notes identify proposal copy or feasibility details to resolve before implementation; they do not replace Claude's direction.

- Directions are concept proposals, not implemented or verified native layouts; their point coordinates are design intent, not a tested fit.
- Claude's sample progression copy says 8 or more reps on all sets to progress, but 8–10 double progression requires meeting the upper target. Comp prompts omit this unverified recommendation.
- Deck's running-rest alternative refers to Log set 3 now while the shared fixture has set 2 ready. Comp prompt retains fixture set 2.
- Session Tape proposes historical rest entries, but the current model stores completed-set timestamps and only the active rest deadline. A faithful UI-only implementation can reconstruct logged sets, notes and current rest; a complete past rest timeline would need separately designed stored event state.
- Claude's Progress sample says 12 days trained in October while Today is 1 October. Keep this as proposal copy, not a real progress claim; later mockups should use a compatible month/date.
