schnaq Labs[app]

status: open-source

Conan — Time Tracking for Projects That Run in Parallel

A macOS menu-bar tracker built for working alongside AI agents: the main project 1:1, side projects proportionally. Everything lands in watson, and the terminal stays in sync.

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 --day keeps 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 stop in 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, MenuBarExtra as 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/conan installs the same signed DMG from our own tap. Updates keep coming through Sparkle — the cask is marked auto_updates, so brew upgrade stays 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.

// Status

status: open-source

// Stack

SwiftSwiftUImacOS Native

// Live since

2026-06

// Head Maintainer

Talk about this project