Wie ein vollständiges Desktop-Zeiterfassungs-Tool entsteht, wenn man die Aufgabe konsequent in spezialisierte Agenten aufteilt — und was dabei zu lernen ist.
Memtime ist ein macOS/Windows-Tool, das automatisch aufzeichnet, in welcher App und welchem Dokument man wann gearbeitet hat — ohne manuelles Starten. Dieses Projekt baut genau das nach: open source, plattformübergreifend, mit KI-Analyse.
Pollt im Hintergrund aktive App und Fenstertitel. Schreibt Zeitblöcke in SQLite — lückenlos, ohne Useraktion.
Macht alle 10 Sekunden einen Screenshot und schickt ihn an ein lokales Ollama-Modell. Das KI-Modell beschreibt in 1–2 Sätzen, womit man gerade beschäftigt war.
24-Stunden-Tagesansicht wie in Memtime, Aktivitätsliste, Projektpanel, CSV/JSON-Export — vollständige PyQt6-UI.
Native Plattformadapter: macOS via pyobjc/Quartz, Linux via python-xlib/ewmh. Ein Codebase, zwei Plattformen.
Keine Cloud, kein Server, keine Subscription. SQLite-Datenbank im Home-Verzeichnis. KI via lokalem Ollama.
Ein Bash-Script clont das Repo, erstellt die virtuelle Umgebung und installiert alle Abhängigkeiten — auf Mac und Linux gleich.
Statt einen einzigen KI-Agenten alles bauen zu lassen, wurde das Projekt konsequent in 5 spezialisierte Agenten aufgeteilt. Jeder Agent hat einen klaren Scope, klar definierte Schnittstellen zu den anderen — und arbeitet unabhängig.
Das Prinzip: Kein Agent kennt die Implementierungsdetails der anderen. Er kennt nur die Schnittstellen (Funktionsnamen, Datenmodelle, DB-Schema). Das erzwingt saubere Modularität — genauso wie bei echten Teams. Der Architekt-Agent schreibt das Pflichtenheft, alle anderen halten sich daran.
5 Module definiert: tracker/, database/, ai/, ui/, utils/ — mit klaren Verantwortlichkeiten und keinerlei Querabhängigkeiten außer über database/.
Tabellen: activities, projects, screenshots, analysis_queue, blocklist, settings. Mit Indizes, WAL-Mode und Thread-Safety-Lock (DB_LOCK).
Platform-Abstraktionsschicht: tracker/platform/__init__.py wählt zur Laufzeit mac- oder Linux-Implementierung. Kein plattformspezifischer Code außerhalb dieser Schicht.
Phase 1: Headless-Tracker. Phase 2: Timeline-UI. Phase 3: Projekte, Reports, Export. Phase 4: KI-Analyse. Jede Phase lieferbar ohne die nächste.
ActivityTracker läuft in einem Daemon-Thread. Konfigurierbare Polling-Frequenz (Standard: 1 Sekunde). Stop-Event statt forcess Kill.
NSWorkspace für App-Namen, AXUIElement für Fenstertitel, AppleScript-Bridge für Browser-URLs. Idle-Zeit via CGEventSource.
Aktives Fenster über _NET_ACTIVE_WINDOW, WM_CLASS für App-Namen, XScreenSaver für Idle-Zeit. Browser-URL-Tracking nicht unterstützt.
Beim Start werden alle Aktivitäten mit NULL end_time geschlossen — robust gegen harte Abstürze ohne Datenverlust.
Eine globale Verbindung pro Prozess (thread-safe via check_same_thread=False + DB_LOCK). WAL-Mode für bessere Nebenläufigkeit.
macOS: ~/Library/Application Support/TimeTracker/. Linux: ~/.local/share/TimeTracker/. Automatisch erstellt bei erstem Start.
Key/Value-Tabelle für alle Konfigurationen (poll_interval_ms, screenshot_interval_sec, idle_threshold_minutes, ai_analysis_enabled etc.) mit Defaults.
export_csv() und export_json() mit Datumsbereich-Filter. JSON: verschachtelt nach Tag. CSV: flach mit allen Feldern inkl. ai_hint.
Der Tracker-Thread ruft on_activity_update() auf → emit _refresh_signal → UI-Thread refresht Timeline. Kein direktes UI-Update aus Background-Threads.
24h-Achse, farbkodierte App-Blöcke, Zoom-Stufen, Hover-Tooltips, Click-to-select. Kein Framework — reines QPainter-Canvas.
App bleibt beim Schließen im Tray. QApplication.setQuitOnLastWindowClosed(False). Tray-Icon wechselt Farbe bei Pause.
Tracking, Screenshots, KI-Analyse, Datenschutz/Blocklist, Interface, Daten & Export — alle Einstellungen über die DB-Settings-Tabelle persistiert.
Eigener Background-Thread pollt analysis_queue alle 10 Sekunden. Sendet Screenshot als Base64 an lokales Ollama (Standard: gemma3:4b). Speichert ai_hint zurück in die DB.
ai_analysis_delay_sec (Standard: 30s) verhindert CPU-Spitzen direkt nach Screenshot. Modell, Server-URL und Delay per Settings konfigurierbar.
KI-Analyse ist optional (Standard: deaktiviert). Wenn Ollama nicht läuft, bleibt ai_hint leer. App funktioniert vollständig ohne KI.
Erkennt macOS vs. Linux, installiert korrekte requirements, erstellt start.sh, führt Headless-Test durch und gibt Accessibility-Hinweis auf macOS.
Nicht ein Agent für alles — sondern ein klarer Prozess, bei dem jeder Agent auf dem Ergebnis des vorherigen aufbaut.
Jedes Modul hat genau eine Verantwortung. Abhängigkeiten fließen nur in eine Richtung: alle Module → database/, nie untereinander.
💾 Daten-Speicherort:
macOS: ~/Library/Application Support/TimeTracker/
Linux: ~/.local/share/TimeTracker/
Ein Script, zwei Plattformen. Läuft auf macOS und Linux ohne manuelle Konfiguration.
Optional: KI-Analyse via Ollama
Nur nötig wenn du die Screenshot-Analyse aktivieren möchtest (Standard: deaktiviert).
Was funktioniert, was nicht — und was jeder mitnehmen kann, der diesen Ansatz für eigene Projekte nutzen möchte.
Der Architekt-Agent als erste Instanz verhindert das größte Problem: Agenten, die in verschiedene Richtungen bauen. DB-Schema und Interfaces zuerst — dann erst Implementierung.
Jeder Agent kennt nur die Funktionssignaturen der anderen, nicht deren Code. Das erzwingt saubere Modularität — genau wie echte Teams, die nicht gegenseitig in den Code schauen.
Phase 1 (Headless-Tracker) lief ohne UI. Phase 2 (Timeline) lief ohne Projekte. Additives Vorgehen macht jeden Schritt testbar und verhindert Blockaden.
main.py --headless ist der Smoke Test: Startet alles, trackt 30 Sekunden, schreibt in die DB. Schlägt das fehl, gibt es ein Integrationsproblem — bevor die UI es versteckt.
Der KI-Agent hat kein einziges bestehendes File verändert. Neue Tabelle (analysis_queue), neues Feld (ai_hint), neues Modul (ai/). Alles opt-in. App läuft ohne Ollama.
Alles Plattformspezifische liegt in tracker/platform/. Ein __init__.py wählt zur Laufzeit. Kein #if darwin außerhalb. Das macht Tests und neue Plattformen (Windows) einfach.
Das Repo ist offen. Nutze es als Vorlage, als Inspiration oder als Basis für deinen eigenen Zeiterfassungs-Klon — mit deinen eigenen 5 Agenten.