Windows-Tray-App zur schnellen Zeiterfassung mit LogMyTime.
Ein Klick auf das Tray-Icon → Projekt wählen → Timer läuft. Kein Hauptfenster, kein Browser-Tab, kein Kontextwechsel — die Zeiterfassung wohnt im System-Tray.
- Timer starten & wechseln mit 2 Klicks — Projekt aus dem Tray-Menü wählen, Tätigkeit dazu, fertig. Ein laufender Timer wird beim Wechsel serverseitig automatisch beendet und als Zeiteintrag gespeichert.
- Recent-Projekte zuerst — das Menü zeigt die zuletzt genutzten Projekte oben (Anzahl konfigurierbar, Standard 10), der Rest liegt alphabetisch unter „Weitere Projekte".
- Lückenlose Zeiterfassung — beim Stoppen schließt die Startzeit automatisch an das Ende des vorherigen Eintrags desselben Tages an. Keine Minuten-Lücken durch Rundung.
- ⏸ Pause — unterbricht die Anschluss-Logik bewusst (Mittagspause etc.), ohne einen Server-Eintrag zu erzeugen.
- Kaufmännische Viertelstunden-Rundung — Start-/Endzeiten werden beim Stoppen auf die nächste Viertelstunde gerundet.
- Zeiteinträge verwalten — anzeigen (mit Tagesgruppierung und Summen), bearbeiten, löschen und manuell anlegen, direkt aus der App.
- Pflicht-Zusatzfelder — konfigurierte Custom-Felder (z. B. Auswahllisten) werden beim Start abgefragt und korrekt an die API weitergereicht.
- Kommentar beim Stoppen — optionaler Dialog mit Schnellauswahl der letzten 10 Kommentare.
- Mini-Ansicht — kleines, randloses Fenster, das immer oben bleibt: laufendes Projekt, Laufzeit und Tagessumme im Blick, mit Direkt-Buttons für Wechseln, Pause und Stopp. Halbtransparent (Deckkraft einstellbar), beim Überfahren mit der Maus voll sichtbar. Wahlweise frei verschiebbar oder fest in einer Bildschirmecke angedockt (einstellbar); je größer gezogen, desto mehr zeigt sie (bis hin zu allen Einträgen des Tages).
- Leiste — eine Leiste am Bildschirmrand (oben, unten, links oder rechts), die echten Platz reserviert: andere Fenster maximieren nur bis dorthin, nichts verdeckt sie. Zeigt Projekt, Tätigkeit, Laufzeit und die Direkt-Buttons für Wechseln, Pause und Stopp. Parallel zur Mini-Ansicht nutzbar.
- Toast-Benachrichtigungen — für Start, Wechsel, Stopp und Fehler; global abschaltbar. Beim ersten erfolgreichen Start erscheint ein Info-Hinweis zur Taskleisten-Integration (einmalig).
- Dark Mode — folgt automatisch der Windows-System-Einstellung (DevExpress WXI-Skin).
- Autostart mit Windows — per Checkbox in den Einstellungen.
- Sparsamer API-Umgang — hartes Budget von 500 Requests/24 h wird respektiert: kein Polling, Laufzeit wird lokal berechnet, Delta-Sync via
GetChangesDigest, lokaler Cache für Projekte/Tätigkeiten. - Sicherer API-Key — DPAPI-verschlüsselt (Windows-Benutzerkonto), nie im Klartext gespeichert oder geloggt.
- Windows 10/11 (x64)
- Ein LogMyTime-Konto mit API-Key (zu erzeugen in LogMyTime unter Verwaltung → Eigenes Profil)
Die veröffentlichte EXE ist self-contained — keine .NET-Installation nötig.
- Aktuelles Setup (
LogMyTimeTray-Setup-x.y.z.exe) von der Releases-Seite herunterladen und ausführen. - App starten — beim Erststart öffnet sich der Einstellungsdialog.
- API-Key eintragen, „Verbindung testen", speichern. Fertig.
Alternativ liegt jedem Release auch die portable Einzeldatei LogMyTimeTray.exe bei.
| Aktion | Weg |
|---|---|
| Timer starten | Links- oder Rechtsklick aufs Tray-Icon → Projekt → Tätigkeit |
| Timer wechseln | Einfach das nächste Projekt anklicken — der alte Timer wird automatisch beendet |
| Timer stoppen | Menüpunkt „Stopp" (fragt optional nach einem Kommentar) |
| Pause machen | Menüpunkt „⏸ Pause" — stoppt ggf. den Timer und verhindert den lückenlosen Anschluss des nächsten Eintrags |
| Laufzeit sehen | Mauszeiger über das Tray-Icon (Tooltip mit Projekt und Laufzeit) |
| Mini-Ansicht ein-/ausblenden | Menüpunkt „Mini-Ansicht" |
| Leiste ein-/ausblenden | Menüpunkt „Leiste anzeigen/ausblenden" — reserviert Platz am Bildschirmrand |
| Einträge verwalten | Menüpunkt „Zeiteinträge…" |
| Projekte aktualisieren | Menüpunkt „Aktualisieren" (lädt Projekte/Tätigkeiten neu, budgetschonend per Delta-Sync) |
Das Icon signalisiert den Zustand: grau = kein Timer, farbig = Timer läuft, rot = Fehler.
Hinweis: Das Projekt verwendet DevExpress 25.1 WinForms-Controls. Zum Bauen wird eine gültige DevExpress-Lizenz und der Zugriff auf den DevExpress-NuGet-Feed benötigt (
nuget.configerwartet eine entsprechend konfigurierte Quelle).
# Bauen
dotnet build LogMyTimeTray.sln
# Tests ausführen
dotnet test
# Self-contained Single-File-EXE erzeugen
dotnet publish src/LogMyTimeTray -c Release -r win-x64 --self-contained -p:PublishSingleFile=true
# oder bequemer:
./publish.ps1Der Installer wird mit Inno Setup aus installer.iss gebaut.
src/LogMyTimeTray/
├── Program.cs # Single-Instance-Mutex, ApplicationContext, Skin
├── TrayApplicationContext.cs # Tray-Icon, Menüaufbau, Icon-Zustand
├── Api/ # LogMyTime-API-Client (OData V2, MERGE-Updates)
├── Core/ # TimerService, CacheService, Settings, Rundung,
│ # Request-Zähler, Toasts, Logging, OverlayState
└── UI/ # Einstellungen, Kommentar-/Custom-Fields-Dialoge,
# Zeiteinträge-Grid, Icon-Factory, OverlayForm
tests/LogMyTimeTray.Tests/ # xUnit — API-Client gegen gemockten HttpMessageHandler
Zentrale Designentscheidungen:
- Kein Polling. Der einzige Timer in der App aktualisiert sekündlich den Tooltip — rein lokal. Alle API-Requests laufen sequenziell durch eine Queue und werden über einen rollierenden 24-h-Zähler protokolliert.
- Updates nur per HTTP-
MERGE, nie PUT — PUT würde nicht übergebene Felder serverseitig auf Defaults zurücksetzen. - 404 bei
CurrentStopWatchist kein Fehler, sondern der Zustand „kein Timer läuft". - Die vollständige Spezifikation steht in
DESIGN.md.
| Datei | Ort | Inhalt |
|---|---|---|
settings.json |
%APPDATA%\LogMyTimeTray |
Einstellungen, API-Key (DPAPI-verschlüsselt) |
cache.json |
%APPDATA%\LogMyTimeTray |
Projekte, Tätigkeiten, letzte Einträge, Sync-Zeitstempel |
requests.json |
%APPDATA%\LogMyTimeTray |
Rollierender 24-h-Request-Zähler |
debug.log |
neben der EXE | Datei-Log, rolliert bei 1 MB |
Privates Projekt. Die verwendeten DevExpress-Komponenten unterliegen der DevExpress-Lizenz — zum Bauen ist eine eigene Lizenz erforderlich.
Dieses Projekt steht in keiner Verbindung zur LogMyTime GmbH; LogMyTime ist eine Marke der jeweiligen Rechteinhaber.