Guide βΊ Modules
Workouts
Your watch's workouts land as habits on their own. Every workout belongs to a family β cardio, strength or mobility β and when you do something other than the workout you were ordered, your Handler's temperament decides what it was worth. Let the Handler pick today's workout, or keep picking it yourself.
ποΈ Workouts is training that runs off your watch. A ride, a walk, a yoga class, a lifting session β whatever Apple Health or Garmin recorded β lands in Handlr as a bout of one of your habits, with its minutes and its distance. An order for that habit completes itself the moment the watch reports it.
It is built on orders, standing days and Mischief. It adds three things: families, credit by temperament, and a Handler who picks the workout. Find it under Workouts in the menu.
From the watch
Handlr never reaches out for your workouts β something you run pushes them in, the same way
Health readings arrive: one POST
/api/v1/training/workouts with each workout's source, id, type, start, length and distance
(API). On the reference setup an hourly script reads Apple Health and Garmin out
of the database they already sync to.
Each workout's type decides the habit it becomes:
| The watch says | Habit | Family |
|---|---|---|
| walking, indoor/outdoor walk | πΆ Walk | cardio |
| running, treadmill, trail | π Run | cardio |
| cycling, indoor/outdoor cycling, road/mountain biking | π΄ Bike | cardio |
| hiking | π₯Ύ Hike | cardio |
| swimming | π Swim | cardio |
| mixed cardio, elliptical, rowing, stairs, HIIT, danceβ¦ | π« Cardio | cardio |
| strength training, functional strength, core | ποΈ Lift | strength |
| yoga, pilates, flexibility, mind & body, cooldown | π§ Yoga & stretch | mobility |
The first time a type arrives and you have no habit by that name, Handlr makes it β timed,
three a week, in its family. Rename it, recolour it, change its rhythm: it's yours. A type Handlr
doesn't know is not guessed at: it logs nothing, and the Workouts page names it so you can map
it. Your own map goes in Settings β Workouts, over the built-in one, separated by ;:
indoor walk = walking_pad; other = -
- ignores a type. Switch the import off there too.
One ride is one ride. Garmin syncs into Apple Health, so the same ride often arrives twice β and Health Auto Export sometimes sends one workout under two ids. A workout that starts within five minutes of one already logged in the same family is the same bout and is skipped (Garmin's copy wins when both arrive together; it fills in a distance the other lacked). A bout you undid stays undone β its twin from the other source will not bring it back.
A workout counts like any late log: more than two days old, it lands with no XP.
Families
Every workout habit belongs to exactly one family: cardio, strength or mobility. The watch's habits come with one; give any other habit a family in Settings β Standing days. A habit with no family is not a workout β guitar stays guitar.
Credit by temperament
An order for a workout completes itself when you log it β that never changed. What's new is what happens when it runs out and you did something else. Your Handler's temperament (How strict they are, on the Handler) decides, by the temperament the order was issued under β a Handler turned strict tonight does not rewrite this morning's deal:
| ordered | same family instead | other workout instead | under target (β₯ Β½) | nothing | |
|---|---|---|---|---|---|
| warm | β full | β full | Β½ | Β½ | π» |
| firm | β full | Β½ | π 2 | Β½ | π» |
| strict | β full | π 2 | π 3 | β | π» |
- Same family instead β told to ride, you walked. Other workout instead β told to ride, you lifted. Either must carry the ordered minutes between them (the ordered workout's own minutes count too): a 10-minute stroll is not a 30-minute ride.
- Under target β you rode, but 15 of 30 minutes. At least half counts; less is nothing.
- Β½ β the order closes done, at half the XP and half the reward, marked Β½ in History.
- π 2 / π 3 β Zoomies, at that weight.
- β β failed: no XP, no reward, and no mark. You showed up for the right thing.
- π» β nothing at all: Ghosted, as always.
When two columns apply, the better one stands β doing more never costs more. Doing a habit that isn't a workout instead (guitar for the bike) is the old Zoomies, weighed warm 1 Β· firm 2 Β· strict 3. An order that waits for a photo is judged the old way: no half credit without the photo.
The watch syncs late. A ride that ended at 23:40 reaches the box at the next sync. So an unmet workout order waits out a grace (two hours, in Settings) before it is judged β on the evidence of its own window only, stamped at its deadline.
Distance orders
An order can ask for a distance: ride 8 miles (the distance column of the training library, or on a standing day; your AI Handler may name one in metres). The watch's measured distance completes it, ride by ride: 6 miles this morning and 2Β½ tonight is 8. A bout with no distance measured brings none, so log the ride with its distance (the log form takes one) or let the watch do it. With minutes as well, both must be reached.
When a distance order runs out unmet, the credit table above judges it like any other:
- Under target β the ordered habit at half the distance or more (and half the minutes, if it named any).
- Another workout instead must carry the distance as time: how long the ordered distance takes you at your own pace for that habit, from the last 90 days of bouts with both a time and a distance (3 km of them at least). Until you have that, a starter's typical speed stands in (walk 5 km/h, run 9.5, bike 18, hike 4, swim 2.5). A habit with neither β no pace β has no stand-in: only the distance itself meets it, and anything else is the old Zoomies.
So 8 miles on the bike at your 20 km/h is about 39 minutes. A 45-minute yoga class in its place is other workout: Β½ when your Handler is warm, π 2 when firm. A 30-minute walk doesn't carry it. The order card in Training says the minutes a stand-in must carry.
The Handler's own picks (suggest, command) ask for minutes, not a distance.
Who picks today's workout
Settings β Workouts β Who picks today's workout:
- me β you do: standing days, and whatever you log. Nothing new happens. (The default.)
- suggest β at the hour you set (8:00), your Handler proposes one: on the dashboard, on
the Workouts page, and in the chat bot (
!acceptΒ·!decline). Accept and it becomes an order, due at midnight. Not today costs nothing. - command β your Handler orders it. No menu.
A standing order already issued today is today's workout; the Handler adds nothing.
What it may pick
The pick is rules first:
- A recovery day (your Health data says you slept badly or feel low) β mobility only. No mobility habit β a rest day.
- No cardio for two days β cardio.
- No strength for three days β strength.
- Otherwise, the family you've left longest.
Within that family, the habit you've left longest β or, if your AI Handler is on with Assign training, its choice among those habits, in its own words. It is shown the options and nothing else β never why (a recovery day is health, and health never leaves your box). It cannot order something the rules didn't allow: anything else it names is refused.
Sits in the pool
An order can name a trance sit as well as a habit β sit 45 minutes β and, in the library editor's sit column, one score: sit Descent, 45 minutes. Put one in your library and the wheel and random can draw it; a sit of that score completes it (a different score doesn't).
This page is docs/training.md in the repo. Spotted a mistake? Tell us how to report it β