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 Type is the same as adding any other kind — pick the kind in the Type 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 ⏸ ↻ ✎ ⤢
While it's running, the button shows Pause (⏸) — tap it to take a break, Resume to keep going. The circular arrow (↻) resets, the pencil (✎) edits the recorded sessions, and the expand icon (⤢) opens the full-screen view (more below).
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.
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 Type, 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. 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 Types using Stopwatch
- 🧘 Meditation —
session(Stopwatch). Start at the beginning of a sit, Stop at the end. - 🎯 Deep work —
duration(Stopwatch) ·project(Tag) ·note(Markdown). - 🪴 Gardening —
duration(Stopwatch). Phone in pocket, Start when you go out, Stop 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 Types using Timer
- 🍅 Pomodoro —
focus(Timer, target25). The classic 25-min work block. - 🌬 Breathwork —
session(Timer, target10). - 🧘 Meditation (timed) —
sit(Timer, target15). Same Type, 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/Stop transition 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 → 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 card has an "Edit intervals" control (the pencil) that 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 → endpair 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.
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.
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.
Using Stopwatch/Timer in Routines
A Stopwatch or Timer Property works inside a Routine like any other Property kind. The Routine log card renders the Start/Pause/Stop controls right inside the row.
A useful example: a Morning ritual Routine that bundles:
- Meditation (Timer, target
10min) - Stretch (Stopwatch)
- Gratitude journal (Markdown)
- Water (Number, default
2glasses)
Tap the Routine → all four Entries write at once with 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
- Properties and the Title — the full catalogue of all 17 Property kinds
- Creating a Type — design a Type with a Stopwatch Property
- Logging a Routine — bundle a Timer alongside other Types