The problem
Agentic development changes what a working day looks like. One main project is running, agents are working, and in the gaps you pick up side work — a review here, a support thread there. Classic time tracking with exactly one running timer lies in both directions here: either the side work disappears entirely, or you start and stop so often that tracking becomes the task.
Conan is our answer. A menu-bar tracker that runs one main project and any number of side projects at the same time — and stays honest about it.
How Conan counts
- Main project 1:1. One hour worked, one hour tracked. Exactly as before.
- Side projects proportionally. Each side project accrues a percentage of the main project's time — additively, so the main project keeps its full hour. 10% means every hour on the main project adds 6 minutes to the side project.
- Forward-only. A side project only accrues from the moment you start it. No retroactive redistribution.
- Stop however it fits. Stopping the main project ends everything; a single side project can be closed on its own.
- Traceable. Side-project frames are tagged
+conan, so a report immediately shows which time was accrued proportionally.
watson stays the database
Conan isn't a new data silo, it's a layer on top of watson. Completed intervals are written straight into watson's frames file — in the same JSON format watson uses itself.
watson report --daykeeps working unchanged, including for time created through Conan.- No watson binary and no Python required. If you have the CLI, you share the data; if you don't, you lose nothing.
- Tags attached to a project — main or side — pass through into the frames untouched and show up in the daily summary, broken down per tag.
- No external dependencies. The app reads and writes files, and that's the entire integration.
Terminal-aware instead of terminal-hostile
This is the part comparable tools usually get wrong: Conan keeps watson's running frame in sync via its state file. A watson start in the terminal shows up in the menu bar — marked started in terminal — and a watson stop ends the session there too.
The running frame is closed exactly once, by whoever stops first: app or CLI. Time is never double-counted. While a session is running the frame is taken, so a second watson start in the terminal is refused rather than quietly written alongside.
Details that make the difference
- Live report in the popover, switchable between Today and Week: tracked time, broken down by project and tag. The week view pages back through past weeks — built for transferring weekly hours into external systems.
- Resume. After a stop, one click restores exactly the setup that was last running — the main project with its tags plus every side project with its percentages, on fresh timestamps. Works even when the session ended via
watson stopin the terminal or through a crash. - Idle reminder. If you've been active at the Mac for five minutes with nothing tracked, you get a nudge — once per active stretch, not once a minute.
- Start at login via
SMAppService, as a regular macOS login item. - Crash-resilient. The running session lives in its own state file and is replayed on launch, including the time up to the last 30-second heartbeat.
- Auto-update via Sparkle, EdDSA-signed with Developer ID verification, switchable via toggle.
Stack and delivery
- Swift and SwiftUI,
MenuBarExtraas the entry point, macOS 13+. No dock icon, menu bar only. - Core separated from UI. The tracking logic sits in its own module with unit tests — accrual maths, watson's file format, tag parsing and state recovery are all testable without any UI.
- Release pipeline as shell scripts. A universal build (arm64 + x86_64), Developer-ID-signed, notarised and stapled, shipped as a DMG. A second script stamps the version, builds the DMG, tags, pushes and creates the GitHub release including the Sparkle appcast.
- Homebrew, too.
brew install --cask schnaq/tap/conaninstalls the same signed DMG from our own tap. Updates keep coming through Sparkle — the cask is markedauto_updates, sobrew upgradestays out of the way.
Why we build this
Time tracking is our invoicing basis, not an end in itself — and it has to match the way we actually work. Since agents took over part of the execution, working in parallel has become the normal case. A tool that can't represent that produces either under-reporting or fantasy numbers.
Conan is the version we use ourselves every day: honest in its counting, unobtrusive in operation, and free of lock-in because the data stays in watson's open format. The name is a nod to watson — Arthur Conan Doyle is the one who gave Sherlock Holmes his chronicler.
The code is public on GitHub, and notarised builds ship as a DMG with the latest release — or straight via brew install --cask schnaq/tap/conan.