Skip to content

JOURNAL // ARCHIVE_ENTRY

Why I Built BurrowTime

I've used Watson to track my time since at least 2020. That is the oldest report I can still pull from this system, and the habit may go back even further.

Watson has lasted because it stays out of the way. I start a project, add a couple tags, stop it later, and run a report when I need one. My data lives in ordinary files on my computer. There is no account, subscription, browser tab, or service deciding whether I can see my own history.

I still love that simplicity, but my old setup is tied to Python 2, and Watson's latest published release dates to 2022. I started worrying about how long I could keep the exact environment alive. Replacing Watson with a different time tracker would be easy; replacing it without abandoning years of data and muscle memory was the real problem.

Compatibility came first

I built BurrowTime in Go, but I did not want a clean-room replacement that merely looked similar. It targets Watson 2.1.0 behavior and preserves the same core files: config, frames, state, and last_sync. The command set, common output, JSON, CSV, exit codes, date filters, tags, projects, sync behavior, and shell completions all follow Watson's workflow.

That data compatibility makes the move deliberately boring. On first launch, BurrowTime can find a Watson directory and offer to copy it. Manual migration commands move a snapshot in either direction, confirm before replacing anything, and create a timestamped backup. Watson's original files are never changed during import.

The release also builds a separate watson executable. It uses Watson's own directory and keeps the original non-interactive behavior, which makes it useful as a direct Go-based replacement. I can adopt the new interface without creating a one-way door.

One binary instead of an old runtime

Go gives BurrowTime a small standalone binary for Linux, macOS, and Windows. I no longer need to preserve an aging Python environment just to answer a basic question about where my week went. The data stays local and readable, writes are atomic, and Watson-style backup files remain part of the workflow.

Compatibility is tested against Python Watson as a black-box reference. The suite runs the same operations through both tools and compares their behavior, including reports, editors, configuration changes, Unicode, sync payloads, and alternating writes to the same data.

A TUI that uses the same engine

Running burrowtime by itself opens a Bubble Tea dashboard. It shows active timers and recent activity, with interactive logs, reports, charts, date ranges, and filters. I can still use direct commands in scripts or from muscle memory, but I now have a useful overview when I want one.

The TUI is not a second, limited version of the application. Its actions pass through the same commands, storage, and reporting code as the CLI. A timer started from the dashboard appears in burrowtime status; a frame edited from the command line appears immediately in the TUI.

Concurrent timers without a surprise

The other feature I wanted was concurrent timers. Most of the time, one active timer is correct. Sometimes I need to track a background task while I work on something else, or keep a long-running operation separate from the meeting happening around it.

If I start a new timer while another one is running, BurrowTime opens a chooser. I can stop the active timers and replace them, start the new timer concurrently, or cancel and leave everything alone. Scripts never get stuck waiting for that prompt; they must choose --stop or --concurrent explicitly.

The primary timer still lives in Watson's compatible state file. Additional timers use an additive active_timers file, and completed timers are written as normal Watson frames. Reports count overlapping time independently, which is what I expect when I intentionally run timers together.

Where it landed

BurrowTime keeps the part of Watson I cared about: a fast command, plain local data, and reports I can trust. It adds the parts I wanted without forcing a migration to a new format or hosted service.

The code is MIT licensed and available on GitHub. You can build it from source or install the main command with:

go install github.com/fabean/BurrowTime/cmd/burrowtime@latest

My old Watson history now has a path forward, and the workflow still feels like the tool I've used for years.