Das Problem
Agentische Entwicklung verschiebt, wie ein Arbeitstag aussieht. Ein Hauptprojekt läuft, Agenten arbeiten, und in den Lücken dazwischen greift man Nebenaufgaben auf — ein Review hier, ein Support-Thema dort. Klassische Zeiterfassung mit genau einem laufenden Timer lügt in dieser Situation in beide Richtungen: Entweder verschwindet die Nebenarbeit komplett, oder man startet und stoppt so oft, dass die Erfassung selbst zur Aufgabe wird.
Conan ist unsere Antwort darauf. Ein Menüleisten-Tracker, der ein Hauptprojekt und beliebig viele Nebenprojekte gleichzeitig führt — und dabei ehrlich bleibt.
Wie Conan zählt
- Hauptprojekt 1:1. Eine Stunde gearbeitet, eine Stunde erfasst. Genau wie bisher.
- Nebenprojekte anteilig. Jedes Nebenprojekt bekommt einen Prozentsatz der Hauptzeit — additiv, das Hauptprojekt behält seine volle Stunde. 10 % bedeutet: pro Stunde Hauptprojekt kommen 6 Minuten auf das Nebenprojekt.
- Forward-only. Ein Nebenprojekt sammelt erst ab dem Moment, in dem du es startest. Keine rückwirkende Umverteilung.
- Stoppen, wie es passt. Das Hauptprojekt stoppen beendet alles; ein einzelnes Nebenprojekt lässt sich separat schließen.
- Nachvollziehbar. Nebenprojekt-Frames werden mit
+conangetaggt, damit im Report sofort sichtbar ist, welche Zeit anteilig entstanden ist.
watson bleibt die Datenbank
Conan ist kein neuer Datensilo, sondern eine Ebene über watson. Abgeschlossene Intervalle schreibt die App direkt in watsons frames-Datei — im gleichen JSON-Format, das watson selbst nutzt.
watson report --dayfunktioniert unverändert weiter, auch für Zeit, die über Conan entstanden ist.- Es braucht kein installiertes watson-Binary und kein Python. Wer die CLI hat, teilt sich die Daten; wer sie nicht hat, verliert nichts.
- Tags, die an einem Projekt hängen — Haupt- oder Nebenprojekt — landen unverändert in den Frames und tauchen in der Tagesauswertung pro Tag aufgeschlüsselt auf.
- Keine externen Dependencies. Die App liest und schreibt Dateien, das ist die ganze Integration.
Terminal-aware statt Terminal-feindlich
Der Teil, an dem vergleichbare Tools üblicherweise scheitern: Conan hält watsons laufenden Frame im state synchron. Ein watson start im Terminal erscheint in der Menüleiste — markiert als started in terminal —, ein watson stop beendet die Session auch dort.
Der laufende Frame wird dabei genau einmal geschlossen, von wem auch immer zuerst stoppt: App oder CLI. Zeit wird nie doppelt gezählt. Solange eine Session läuft, ist der Frame belegt, und ein zweites watson start im Terminal wird abgelehnt statt still danebengeschrieben.
Details, die den Unterschied machen
- Live-Report im Popover, umschaltbar zwischen Heute und Woche: erfasste Zeit, aufgeschlüsselt nach Projekt und Tag. Die Wochenübersicht blättert in vergangene Wochen zurück. Gebaut, um Wochenstunden in externe Systeme zu übertragen.
- Resume. Nach einem Stop stellt ein Klick das zuletzt gelaufene Setup exakt wieder her — Hauptprojekt samt Tags plus alle Nebenprojekte mit ihren Prozentsätzen, mit frischen Zeitstempeln. Funktioniert auch, wenn die Session per
watson stopim Terminal oder durch einen Absturz endete. - Idle-Reminder. Wer fünf Minuten am Mac aktiv war, ohne dass ein Projekt läuft, bekommt einen Hinweis — genau einmal pro aktiver Phase, nicht im Minutentakt.
- Start bei Login über
SMAppService, als regulärer macOS-Login-Item. - Crash-resistent. Die laufende Session liegt in einer eigenen State-Datei und wird beim Start wieder eingespielt — inklusive der Zeit bis zum letzten 30-Sekunden-Heartbeat.
- Auto-Update über Sparkle, EdDSA-signiert und mit Developer-ID-Prüfung, abschaltbar per Toggle.
Stack und Auslieferung
- Swift und SwiftUI,
MenuBarExtraals Einstiegspunkt, macOS 13+. Kein Dock-Icon, nur Menüleiste. - Kern von UI getrennt. Die Tracking-Logik liegt in einem eigenen Modul mit Unit-Tests — Accrual-Rechnung, watson-Dateiformat, Tag-Parsing und State-Recovery sind ohne UI testbar.
- Release-Pipeline als Shell-Skripte. Ein Universal-Build (arm64 + x86_64), Developer-ID-signiert, notarisiert und gestapelt, ausgeliefert als DMG. Ein weiteres Skript stempelt die Version, baut das DMG, taggt, pusht und legt das GitHub-Release samt Sparkle-Appcast an.
- Auch per Homebrew.
brew install --cask schnaq/tap/conaninstalliert dasselbe signierte DMG über den eigenen Tap. Updates übernimmt weiterhin Sparkle — der Cask ist alsauto_updatesmarkiert,brew upgradefunkt nicht dazwischen.
Warum wir das bauen
Zeiterfassung ist bei uns Abrechnungsgrundlage, kein Selbstzweck — und sie muss zu der Art passen, wie wir tatsächlich arbeiten. Seit Agenten einen Teil der Ausführung übernehmen, ist paralleles Arbeiten der Normalfall geworden. Ein Tool, das das nicht abbilden kann, produziert entweder Untererfassung oder Fantasiezahlen.
Conan ist die Version, die wir selbst täglich nutzen: ehrlich in der Zählung, unauffällig im Betrieb, und ohne Lock-in, weil die Daten im offenen watson-Format bleiben. Der Name ist ein Wink zu watson — Arthur Conan Doyle hat Sherlock Holmes' Chronisten in die Welt gesetzt.
Der Code liegt offen auf GitHub, notarisierte Builds gibt es als DMG im aktuellen Release — oder direkt per brew install --cask schnaq/tap/conan.