The Rundown is the day’s list of what to log and when: Waketime first thing, Weight in the morning, a Workout at 17:30 on a training day, Bedtime last thing. It is walked through in the order of the day, one question at a time, and answered by logging. The plan is kept apart from the trackables it asks, so a weekday and a weekend, a training day and a rest day, or every other Wednesday can each have their own without any trackable knowing.
The page is /rundown, its editor /rundown/edit. The model is packages/core/src/rundown.ts, the order of the day and which place an entry answers are packages/core/src/check-in.ts, and the page’s rows are apps/renderer/src/components/capture/check-in.ts. The layers are stored in rundown_layer and synced. The Rundown is second in the sidebar, after Home, and second in the phone’s bottom bar (Home, Rundown, Trackables, Visualizations, Settings): on a phone, logging comes before browsing.
Layers
The Rundown is made of layers, each with a name, a rule saying which dates it applies to, and the items it sets. Layers are ordered by how specific they are, with Every day at the bottom. Each layer stores only what it changes:
- Add an item: a layer for every other Wednesday adds Therapy at 17:00.
- Move an item, naming it by its id and setting its fields: the Weekend moves Breakfast to 9:30.
- Take an item away: a Day off removes Lunch and Focus.
A date’s Rundown is every layer whose rule holds for it, applied from the bottom up (resolveRundown). Each item says which layer added it and which last set it, so an item that looks wrong can be traced to its layer. Nothing resolved is stored: a change to a layer below reaches every day above it at once. Editing a layer changes which rows a date asks and where, never an entry. This is the cascade of configuration that Vodler and Sims Toolkit use.
Rules (RundownRule):
- every day;
- days of the week;
- every N days from a date (every other day);
- every N weeks on chosen weekdays from a date (every other Wednesday), the weeks starting where the person’s do (from Monday, every other weekend is a Saturday and the Sunday after it);
- particular dates;
- the day after a day with an entry of a trackable, or without one, so rest follows a workout rather than the calendar;
- picked: applied on a day it is chosen for (a Day off picked in the morning). Which picked layers are chosen for which days is the
rundown:pickedsetting.
Even and odd dates of the month are not offered, since the 31st and the 1st are both odd.
Items
An item is a trackable at a place in the day (CheckInPlace):
- First thing or Last thing, before or after everything else, with a usual time;
- a time;
- any time;
- a label, for a trackable asked more than once (Breakfast, Lunch);
- for an interval, which end the item asks: Sleep’s Waketime item asks for its end and its Bedtime item for its start (Sleep).
A Routine’s item starts that routine, so a Rundown is made of routines as much as of single questions: Morning hygiene, Breakfast, Workout (Events). Any trackable you log can be an item, whatever its value, since the card is the entry panel with the food and exercise forms in it. A derived trackable is computed and a tag holds no value of its own, so neither is ever asked.
The order of the day
Items run First thing, then timed places through the day, then any time, then Last thing: nothing is logged before waking or after going to bed. There is no priority number and no dragging rows into place: First thing and Last thing pin the two ends, and every row between sorts by its time, so no row has to be placed by hand. The day starts at the earliest First thing time, or at 04:00 when none has one, so a day that begins at 15:00 sorts as one and a 00:30 place is the end of the day rather than its start. The page groups the rows as First thing, Morning (from 04:00), Afternoon (from 12:00), Evening (from 17:00, running past midnight), Any time and Last thing.
Only a declared place orders anything. A list walked every morning has to hold still, and a time read off history (the median of recent entries) moves as you log, so history’s time is only ever offered (Place by usual time, below), never applied on its own.
Answering
An item is answered by an entry of its trackable that day. Where a trackable is asked at several places, an entry answers the nearest one to its time; nothing on the entry says which it was for (placeFor). Logging is the same as anywhere else, through the entry panel (Entry Panel), the one Home’s cards and the command palette use, at the app’s moment (The Moment). The one exception is a row of a trackable asked at several places that is answered when the time is nearer another of its places, a Lunch caught up on in the evening: it logs at the row’s own time on the moment’s day (rowTime), so it answers the row it was picked for.
Any entry answers a row, a Nothing included, and it reads Nothing there. A row whose trackable can truly have had none offers it beside Skip for now (noneAnswer): Nothing today for one read by Count, Sum or Any (Diet, Water), or the value meaning none for one that has it (0 h for Focus, None for a headache scale), as an entry at the row’s time with Undo. A state that is always there (Weight, Mood) offers Skip alone, and so does a row asking one end of an interval. The moment’s day decides the words, so yesterday’s Rundown fills in a forgotten day (“Nothing yesterday”).
What is pending is worked out, not tracked. A row is pending while its trackable has no entry for it on the day (checkInQueue), so logging one makes it fall out of the list with no completion callback, cursor or “done” set that could disagree with what is stored. Progress counts every row, “5 of 7”, so the count keeps its denominator as the list drains.
The page
The page is the Rundown of the moment’s day: set the moment to yesterday and it is yesterday’s Rundown, its rows, progress and answers together. Its header names the layers that make the day, offers each picked layer as a button to choose or unchoose it for the day, and links to the editor.
- The current question is one card: the entry panel for the first pending row, in the order of the day, with Skip for now. A skipped row stays put aside for its day, after the page closes too, in the synced setting
rundown:skipped(the last 14 days kept). It says nothing about what happened: it answers no row and no Reading reads it. A picked or a reopened row is held only while the page is open. Once only skipped rows are left, Revisit skipped brings them back. - The whole day is listed below by section. A pending row can be picked to answer it out of order. An answered row is ticked with its answer: Nothing, the times of a moment, the value, or for several entries of a number the day’s value read the trackable’s own way, and otherwise how many there are. Picking it reopens it: its entries are listed, each with its time to move, its value to open and change, and a way to remove it, with the panel below to log another, and Done puts it away. Removing one there deletes it at once, without the question and the Undo that deleting an entry has everywhere else, and without noting the deletion of an entry logged for you (Logged for You), so a schedule’s entry removed there is logged again.
- Schedules that ask rather than log themselves take their place in the day’s order by their start, listed in their section and shown as the card in their turn, with Log and Not today (Schedules).
A day the Rundown asked a trackable and nobody answered can be an issue, where the trackable asks for that (Issues). Until the Rundown is read, no day is one, rather than a guess from the trackable’s own places that is taken back a moment later.
Where items come from
- Every day is made the first time a profile opens with no layers, from each trackable’s default places (
itemsFromPlaces), under the fixed idevery-day, so two devices make the same row. - A trackable’s default places are its
capture.check_in, which a module sets: Sleep puts Waketime first thing and Bedtime last thing; Emotions, Weight, Focus, Diet and Daily habits’ trackables are asked once, any time; Weather, Disruption and routines are not asked. With none set, a yes/no, a choice or a list is asked once, any time, and anything else is not asked (checkInPlaces). - A module added later joins Every day with its trackables’ default places (
joinRundown). - A trackable made in its form joins no layer. The Rundown is configured only in its editor: the form’s Cadence section shows, read-only, each layer that adds, moves or takes the trackable away, and links to the editor (
InRundown). - The editor lists the layers most specific first, reorders them, edits each one’s rule and items (adding, moving or taking away what a layer below set), and shows any date’s Rundown with where each item came from. Its rule picker is shared with Schedules.
- Place by usual time, offered over the Any time section, gives each of those trackables asked once the median time it was logged at over its last 30 entries, to the five minutes, once it has three (Time of Day); it is offered only when one of them has such a time. It writes each time into the layer that last set the item on that day (
placedAt), so the row moves on the days that layer holds and on no other: an item from Every day moves every day, and one a Weekend layer set moves on weekends.
In the demo profiles
Chad’s Rundown has Every day, with his morning hygiene, his meals and his evening between Waketime and Bedtime; Training days, the day after a day with no Workout, with a Workout at 17:30; Weekend, with Breakfast at 9:30 and no Focus; Every other Wednesday, with Therapy at 17:00; and Day off, picked, with Brunch at 10:00 and no Lunch or Focus.
Related
Events · Schedules · Issues · Entry Panel · The Moment · Sleep · Capture Model