Time tracking

The Time spent column fills itself. There is no timer to start, no timer to forget, and no worklog to reconstruct on Friday.

What counts as activity

Five signals beat a worktree's clock. Each one is something you were doing anyway.

SignalFires when
Terminal inputAny keystroke you send to a session in that worktree.
Agent statusAn agent reports working, waiting, or idle.
Agent outputAn agent produces output while its status is working.
File savesA file changes on disk anywhere in the worktree.
Focused viewsA worktree-scoped view is open and the window has focus.

Three of these deserve a note.

Agent output exists because a single agent turn can outlast the idle gap. Status reports only bracket a turn, so a long one would look like silence in the middle. It is deliberately narrow: it is ignored for plain shells, ignored unless that agent is actually in the working state, and throttled to one beat every 30 seconds — so a dev server left tailing, or a TUI repainting itself, cannot inflate anything.

File saves are watched, not read. The watcher ignores .git, node_modules, dist, build, coverage and Strado's own upload directory, so a build or a branch switch cannot manufacture time.

Focused views cover reading. While a terminal, diff, or embedded editor view for a worktree is on screen and the window has focus, it beats every 30 seconds. Focus inside the embedded editor still counts as focus, so reviewing code there is measured.

How beats become hours

Note

Two beats less than 15 minutes apart accrue the real time between them. A longer gap accrues nothing at all — the clock does not fill in the silence, and it does not round it up either.

That is session-based tracking without sessions to start. Work for forty minutes and you get forty minutes. Walk away for an hour and come back, and the hour is not there.

The first beat after a silence starts a new stretch rather than closing the old one, so an interruption costs you nothing except the interruption.

The total lands in the board row's Time spent column. Where the worktree's ticket carries an estimate, the row shows the two together — measured time over the estimate someone wrote down — which is the comparison worth having, right next to the work rather than in a report.

Where the data lives

~/.strado/activity.json, one entry per worktree path, holding the accumulated seconds and the timestamp of the last beat. It is written 30 seconds after activity settles, through a temp file and a rename.

Deleting a worktree drops its entry. A worktree's total can also be reset to zero on its own, from its settings — useful when a worktree gets reused for different work than the one it was created for. That reset asks first and cannot be undone.

This is measurement, not surveillance

Worth being explicit, because "activity tracking" usually means something worse.

  • Nothing leaves your machine. The tracker is a local file written by the local server; there is no upload path for it and no dashboard elsewhere that sees it.
  • No content is recorded. The file watcher reports that something changed, never what or in which file. Terminal input is counted, never captured — the keystroke beat carries a worktree path and nothing else.
  • The numbers are per worktree, not per person. There is no notion of who did the work, because the whole thing runs as you, on your machine.
  • Only paths a registered repo owns can be beaten at all. A stray request naming some other directory is refused.

Where to go next