The question you open a time tracker with
If you track your time with Watson, you know the pattern: watson report, watson log, watson aggregate — every question its own command, every answer another wall of text. Yet the question is almost always the same: what does my week look like?
watson-tui answers exactly that on launch. The summary view shows one block per day, the projects worked on that day and, under each, its tags — days and projects with a bar measuring them against the strongest day of the week. A quiet day looks quiet, and a gap in the week is visible rather than merely absent: days without a recorded frame appear dimmed with – instead of silently disappearing.
The individual sessions are one key away: f switches to the frame list and back.
Everything by key
The controls follow vi conventions: j/k moves, / filters by project, tag or ID, ←/→ pages through periods, t/w/m/a switches between day, week, month and the entire history. Starting and stopping timers (s), creating, editing and deleting frames (n, enter, d) — all without leaving the TUI. The frame editor comes with tab completion for projects and tags.
The header always shows what you are looking at: the period, its total, a comparison against the previous period and the next larger one, the number of frames and projects, and any running timer. And it doesn't lie: its total always matches exactly what stands below it.
Report and billing
The report (r) sums the selected period per project, with tag totals below each one. The overview (o) is the billing view: totals per project across this week, last week, this month, last month and everything.
Because invoices come out of this, the attribution is precisely defined: a frame counts in full towards the period it starts in — exactly like Watson itself. A running timer counts up to now and is called out below the table. No duration is ever cut off.
A terminal UI that takes its medium seriously
The interface uses your terminal theme's ANSI colours and adapts to the window size in defined steps: as it gets narrow, tags shrink first, then project names — columns like the frame ID drop out entirely rather than by half. Watson resolves IDs by their prefix; a shortened ID would match several frames, or the wrong one. The same principle applies to the bar: below ten columns it can no longer tell a tenth from a half, so it disappears instead of showing wrong proportions.
Behind this sits one simple rule: a display that claims something false is worse than none.
Watson stays the database
As with Conan before it: no new data silo. watson-tui reads and writes Watson's data format directly — frames, state, config, same files, same JSON. It needs no Watson install and no Python. If you have the CLI, you share the data; if you don't, you lose nothing. The week start comes from Watson's config, and R reloads the data when another tool — Conan, say — writes alongside.
Stack and delivery
- Go, one static binary, no runtime dependencies.
- Homebrew cask from our own tap:
brew tap schnaq/tap && brew install --cask watson-tui. Updates viabrew upgrade. - Linux through the release archives (
linux_amd64,linux_arm64) — put the binary on yourPATH, done. - Release pipeline: push a
v*tag and GitHub Actions builds with GoReleaser and updates the cask automatically.
Why we build this
Watson is our time-tracking backbone — Conan writes into it, invoices come out of it. What was missing was the fast answer to the daily question about the week, without typing commands and parsing output. watson-tui is that answer: a tool that shows the right thing on launch, keeps everything else one key away, and leaves the data where it belongs — in Watson's open format.
The code is public on GitHub, builds ship with the latest release — or straight via brew install --cask schnaq/tap/watson-tui.