Stopwatch and Timer

Two Property kinds that capture elapsed time as it happens — Start, Pause, Resume, Stop. 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 → Stop 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.

When you log an Entry, the card shows the live controls right there, on their own full-width row:

🪴 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 and the per-session editor live on the entry page and full-screen view, one tap away — deliberately kept off the quick card row so you can't wipe a session by accident.

You can Start / Pause / Resume as many times as you want on the same Entry. Each Start opens a new Interval; each Pause or Stop closes one. The total on the card is the sum of every closed Interval.

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 | Larger, with a progress ring around the numbers. For a Timer the ring empties as the target approaches; for a Stopwatch it sweeps once a minute, like a second hand. | | Full screen | Tap the expand icon (⤢) | A distraction-free, full-page view with a soft animated background. Big ring, big numbers, big controls — 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

  • 🧘 Meditationsession (Stopwatch). Start at the beginning of a sit, Stop at the end.
  • 🎯 Deep workduration (Stopwatch) · project (Tag) · note (Markdown).
  • 🪴 Gardeningduration (Stopwatch). Phone in pocket, Start when you go out, Stop when you come back.
  • 🎸 Practicetime (Stopwatch) · piece (Text) · tempo_bpm (Number).
  • 🧹 House cleaningtime (Stopwatch). Realise it takes less than you think.
  • 📞 Sales callduration (Stopwatch) · account (Relation) · outcome (Tag).

Example Collections using Timer

  • 🍅 Pomodorofocus (Timer, target 25). The classic 25-min work block.
  • 🌬 Breathworksession (Timer, target 10).
  • 🧘 Meditation (timed)sit (Timer, target 15). Same Collection, different style.
  • 📚 Study sprintblock (Timer, target 50).
  • 🏃 Cardio targetrun (Timer, target 30).
  • 🗣 Language drillpractice (Timer, target 20).

What gets recorded

Every Stopwatch/Timer Entry stores two things together:

  1. The list of Intervals[{start, end}, {start, end}, …]. Every Start/Pause/Stop transition appends or closes one Interval.
  2. 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 → Stop 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 Stop, or stopped accidentally, you can edit Intervals manually. The pencil (✎) on the entry page and the full-screen view — or simply tapping the readout of a finished card — opens a clean editor:

  • One day, set once. Sessions almost always happen on a single day, so you pick the day once at the top — every Interval lives on it. No more retyping the date on each row.
  • Just the times. Each Interval is a start → end pair you edit as a time of day. If an end time is earlier than its start, Kaizendex reads it as crossing midnight and lands the end on the next day — so a late session that runs past 12 still works.
  • Each session's length, front and centre. Every row shows its own duration in bold, down to the second (9s, 1m 17s, 1h 5m) — that's the number you're usually checking.
  • Add or delete. Backfill a session you forgot ("I actually worked from 2:00 to 3:30"), or delete one that shouldn't be there.

There's no Save button — every edit saves automatically, and the running total and per-row durations update as you go. When an edit doesn't add up yet (an end before its start on the same day, two sessions overlapping), the change holds locally and a note explains why until you fix it. Close the editor with the , by clicking outside it, or with Esc.

Undo a Finish. If a session is finished but still recent, the editor 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). 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.

The 24-hour cap

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.
  • 24 hours covers any single legitimate session.

If the auto-close caught you mid-real-session, edit the Interval manually to the real end time afterwards.

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 Duration vs Number

These three kinds all store time, but they're for different moments:

| Kind | When you write the value | |------|-------------------------| | Number | You type any number — could be reps, kg, or minutes. No live behaviour. | | Duration | You type a time amount after the fact (e.g. "I ran for 45 min"). Static. | | Stopwatch | You press Start at the beginning and Stop at the end. Live, captures every Interval. | | Timer | Same as Stopwatch, plus a target you set on the Property. |

Pick Number for "I'll guess at the time later". Pick Duration for "I knew exactly how long it was after I finished". 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/Stop 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 10 min)
  • Stretch (Stopwatch)
  • Gratitude journal (Markdown)
  • Water (Number, default 2 glasses)

Log a Morning ritual → it's born with those four child entries, defaults filled in. Start the Meditation timer, sit for 10 min, Stop. Then Start the Stretch stopwatch, do a few stretches, Stop. Type the journal entry. Done.

Next