Stopwatch and Timer
Two Property kinds that capture elapsed time as it happens — Start, Pause, Resume, Finish. Timer is a Stopwatch with a target duration.
Most Property kinds answer the question "what did you log?" with a number, a piece of text, or a yes/no. Stopwatch and Timer answer it with elapsed time — captured as it happens, not typed in after.
If you've been writing 45 into a "duration" field after every focus session, Stopwatch is the upgrade. If you've been using a separate Pomodoro app to count down 25 minutes, Timer is the upgrade.
Stopwatch vs Timer at a glance
| Stopwatch | Timer | |
|---|---|---|
| Counts | Up from zero | Up from zero, with a goal in mind |
| Target | None | Required — set on the Property (e.g. 25 min) |
| When the goal is hit | n/a | Visual cue + keeps counting (25m+) — no auto-stop |
| Good for | Gardening, deep work, workouts | Pomodoro, breathing, meditation, language study |
Underneath, they're identical: both store a list of Intervals (each interval is a Start → Pause slice) and a running total in minutes. The only difference is whether the Property carries a target duration.
How it works in the app
Adding a Stopwatch or Timer Property to a Collection is the same as adding any other kind — pick the kind in the Collection builder, give it a name, and if it's a Timer, set the target duration.
By default a new Entry starts paused — you tap Start yourself. If you'd rather have it start ticking the instant you log it, turn on auto-start (see below).
When you log an Entry, the card shows the live controls right there, on their own full-width row — the same controls in the browser and in the phone app, on the card, on the Entry's own page, and on a sub-entry row inside a bigger log:
🪴 Gardening
0.00 ▶ ⤢
Tap Start (▶) and the counter starts ticking — live, every second. A Stopwatch counts up from zero; a Timer counts down the time remaining (e.g. 25:00 → 0:00).
🪴 Gardening
3:42 12m ⏸ ✓ ⤢
While it's running, the button shows Pause (⏸) — tap it to take a break, Resume to keep going. The check (✓) finishes the session (more below), and the expand icon (⤢) opens the full-screen view. Reset lives in the full-screen view, one tap away — deliberately kept off the quick row so you can't wipe a session by accident. Tapping the small session count opens the per-session editor.
You can Start / Pause / Resume as many times as you want on the same Entry. Each Start opens a new Interval; each Pause or Finish closes one. The total on the card is the sum of every closed Interval.
Starting automatically when you log it
If you always tap Start the moment you log an Entry anyway, skip the tap: turn on auto-start and the Entry is born already ticking.
Go to Collections → your Collection → Properties, open the Stopwatch or Timer Property's settings, and find Behavior. Turn on Start when an entry is created. From then on, logging a new Entry for that Collection starts the clock in the same instant the Entry appears — no extra tap.
A couple of things to know:
- It only applies to an Entry you're logging right now. Backfilling a session from earlier, or scheduling one on the calendar for later, never auto-starts — those aren't "I'm doing this right now" moments.
- A Timer needs a target duration set before it can auto-start; without one there's nothing to count down to.
The header chip — never lose a running timer
While anything is timing, a small chip appears in the chat log header, next to "Your log": a pulsing dot, the Entry's emoji and name, and a live clock — 🧹 Tidying 23:31. A Timer counts down on the chip exactly as it does on the card. The chip simply mirrors the Entry: pause on the card and the chip freezes (the dot stops pulsing), resume and it ticks again, and it disappears the moment you finish the session or delete the Entry. Tap it and the log scrolls straight to the running Entry's card, so you're never more than one tap from your live session — all the controls (pause, finish) live on the card itself.
Timing more than one thing at once? Every running Stopwatch or Timer gets its own chip, side by side in the header — so if you're mid-workout and mid-meditation, you'll see both clocks ticking at a glance, not just the most recent one.
Finishing a session
When you're done, tap Finish (✓). It stops the clock and freezes the session: the card collapses to a tidy summary — the total time and how many sittings it took. No buttons clutter the row; to make a correction, just tap the time or the session count and the editor opens.
🪴 Gardening
20m 3 sessions
Finishing is the safe way to say "this one's done." A finished session can't be reset, restarted, or continued — the data is locked in, so a stray tap won't wipe it. The summary shows the real total (down to the second for short sessions — 27s, not a rounded 0m) and how many sittings it took, and the whole readout is tappable to open the editor. If you tap Finish by mistake, an Undo pops up right away, and you can always reopen it later from the editor (see Editing after the fact).
Three ways it shows up
The same Stopwatch or Timer follows you across three views — pick whichever fits the moment:
| View | Where | What it looks like |
|---|---|---|
| On the card | Your log, or any feed | A compact full-width row: live numbers and small tap-target icon controls. Quick glance, quick Start. |
| On the entry page | Open the Entry | The same compact row, sitting in the Properties list like any other Property — numbers plus the small controls. |
| Full screen | Tap the expand icon (⤢) | A distraction-free, full-page view with a soft animated background. A big progress ring around big numbers, big controls — for a Timer the ring empties as the target approaches; for a Stopwatch it sweeps once a minute, like a second hand. Ideal for a focus session you keep on screen. Great on a phone. |
Timer specifics
A Timer is a Stopwatch with a target_minutes value. When you create the Collection, the target sits on the Property itself (e.g. "Focus session, target 25 min"). When you create an Entry, that target is snapshotted onto the Entry so you can override just this session if you want (e.g. "this one was a 50-min deep block").
While it's running, a Timer shows the time remaining, counting down from the target (25:00, 24:59, …), and the progress ring empties to match. Next to the countdown, a small muted number shows the total time elapsed so far — so a session of 10 minutes, a pause, then 10 more reads as 20m at a glance, no mental arithmetic. The target is a cue, not a hard stop: at zero the Timer rolls into overtime (+0:30) instead of stopping, so a session that runs long is captured, not cut off.
What gets recorded is the elapsed time — this is what the card total and your Dashboard read:
| Elapsed | Recorded display |
|---|---|
0 | 0m |
8m 30s | 8m |
25m | 25m (you hit the target) |
42m | 25m+ (you went past — no auto-stop) |
The Timer is happy to overflow. Most focus sessions don't end on the dot.
Why overtime is a feature, not a bug
A kitchen timer hits zero and screams at you. Kaizendex is a logger, not an alarm clock — so when a Timer reaches its target it doesn't stop, it rolls into overtime (+0:30). That means:
- Going past the target is a useful data point, not a "the alarm went off, what now?" moment.
- What you keep is the time you actually spent — even if it's more (or less) than you planned.
- The same controls work for a Stopwatch (no target, counts up) and a Timer (counts down to the target, then over).
If you need an audible alarm, your phone's clock app is one tap away. Kaizendex stays focused on capturing the data.
Example Collections using Stopwatch
- 🧘 Meditation —
session(Stopwatch). Start at the beginning of a sit, Finish at the end. - 🎯 Deep work —
duration(Stopwatch) ·project(Tag) ·note(Markdown). - 🪴 Gardening —
duration(Stopwatch). Phone in pocket, Start when you go out, Finish when you come back. - 🎸 Practice —
time(Stopwatch) ·piece(Text) ·tempo_bpm(Number). - 🧹 House cleaning —
time(Stopwatch). Realise it takes less than you think. - 📞 Sales call —
duration(Stopwatch) ·account(Relation) ·outcome(Tag).
Example Collections using Timer
- 🍅 Pomodoro —
focus(Timer, target25). The classic 25-min work block. - 🌬 Breathwork —
session(Timer, target10). - 🧘 Meditation (timed) —
sit(Timer, target15). Same Collection, different style. - 📚 Study sprint —
block(Timer, target50). - 🏃 Cardio target —
run(Timer, target30). - 🗣 Language drill —
practice(Timer, target20).
What gets recorded
Every Stopwatch/Timer Entry stores two things together:
- The list of Intervals —
[{start, end}, {start, end}, …]. Every Start/Pause/Resume/Finish appends or closes one Interval. - The total in minutes — automatically summed from every closed Interval. This is what your Dashboard charts.
So if your focus session was Start at 9:00 → Pause at 9:25 → Resume at 9:40 → Finish at 10:05, the Entry records:
intervals: [
{ start: 9:00, end: 9:25 }, // 25 min
{ start: 9:40, end: 10:05 }, // 25 min
]
total: 50m
The Dashboard sees 50. The card shows 50m.
Editing after the fact
If you forgot to Pause or Finish, or paused by accident, you can edit Intervals manually. The pencil (✎) in the full-screen view — or simply tapping the readout (the session count) on the card or entry page — opens a clean editor:
- One row per session: day · start → end · length. Click a box and type a time (
930,9:30, even9:30:15for the seconds) — it saves as you type. A time box also opens a list of times; a day box opens a calendar. Fixing the start never moves the end. - Overnight just works. A sleep that starts Saturday at 22:50 and ends Sunday at 07:06 shows exactly that: the end names its day whenever it isn't the same day as the start. Type an end time earlier than the start and Kaizendex moves it to the next morning for you.
- Any shape you need. A session can start after midnight, or run longer than a day — when the end falls on another day, it gets its own day box.
There's no Save button — every edit saves automatically, and the total at the bottom and each row's length update as you go. Hover a row and click ✕ to delete it (an Undo pops up); + Add session adds one. When an edit doesn't add up yet (an end that is not after its start, two sessions overlapping), the change holds locally and a note explains why until you fix it. Close the editor by clicking outside it or with Esc.
Undo a Finish. If a session is finished but still recent, the editor's ⋯ menu (next to the total) offers two extra actions: Reopen (un-finish and keep the recorded time, so you can add another sitting) and Reset & start over (clear it back to empty and begin fresh, with an Undo). Once a session has frozen on its own from age (below), these go away — you can still correct the recorded times, but not continue it.
Forgotten running sessions
If you accidentally leave a Stopwatch running overnight or forget about it for a week, Kaizendex auto-closes the Interval after 24 hours — clamping the end to start + 24h. The cap exists because:
- A forgotten-running stopwatch is almost never useful data.
- Mobile devices suspend background apps, so a "ping the server every minute to keep alive" approach doesn't work reliably.
If the auto-close caught you mid-real-session, edit the Interval manually to the real end time afterwards.
Saved durations and totals across multiple sessions can exceed 24 hours. For example, a 25-hour audiobook can be recorded in full; the automatic limit only protects forgotten running sessions.
Old sessions freeze on their own
Beyond that 24-hour cap, a Stopwatch or Timer you started a while ago and never finished freezes automatically after about two days of no activity — it shows as Finished, just as if you'd tapped Finish. You can't restart or continue it, and that's on purpose: picking up a session from days ago would pin today's time onto an old date and skew your totals and Dashboard.
You can still fix the recorded times on a frozen-from-age session (correct an end, delete a stray Interval) — that never moves it to today. What's locked is continuing it. If you meant to keep tracking, just log a fresh Entry. (For a session you finished only recently, the editor still lets you Reopen or Reset — see above.)
Stopwatch vs Number
These two kinds both end up storing a time, but they're for different moments:
| Kind | When you write the value |
|---|---|
| Number | You type any number — could be reps, kg, or minutes, including a time amount you already know (e.g. "I ran for 45 min"). No live behaviour. |
| Stopwatch | You press Start at the beginning and Finish at the end. Live, captures every Interval. |
| Timer | Same as Stopwatch, plus a target you set on the Property. |
Pick Number for "I already know how long it took, I'll just type it in". Pick Stopwatch for "I want to time it as I do it". Pick Timer when you have a target in mind.
Stopwatch/Timer inside Sub-entries
A Stopwatch or Timer Property works inside a Sub-entries child like any other Property kind — the Start/Pause/Finish controls render right inside the child's row.
A useful example: a Morning ritual Collection with a Sub-entries property whose default children are:
- Meditation (Timer, target
10min) - Stretch (Stopwatch)
- Gratitude journal (Markdown)
- Water (Number, default
2glasses)
Log a Morning ritual → it's born with those four child entries, defaults filled in. Start the Meditation timer, sit for 10 min, Finish. Then Start the Stretch stopwatch, do a few stretches, Finish. Type the journal entry. Done.
Next
- Every property type — the full catalogue of all Property kinds
- Creating a Collection — design a Collection with a Stopwatch Property
- Sub-entries — bundle a Timer alongside other child entries