Ich habe einen selbst gehosteten Gleitzeit Tracker gebaut – ein Web-Dashboard zur persönlichen Arbeitszeiterfassung, das sich per iPhone Kurzbefehl vollautomatisch bedienen lässt. Das Projekt ist auf GitHub verfügbar: rinkelzz/gleitzeit
Was kann der Gleitzeit Tracker?
Das Tool deckt alles ab, was man für eine saubere Zeiterfassung braucht:
- Check-in / Check-out per iPhone Kurzbefehl – automatisch beim Betreten oder Verlassen des Büros
- Zwei getrennte Zeitkonten – Gleitzeit-Konto (blau) und Überstunden-Konto (gelb)
- Automatische Feiertage für alle 16 Bundesländer – kein manuelles Eintragen nötig
- Abwesenheitsverwaltung für Urlaub, Krank, Bildungsurlaub, Gleittage und mehr
- Jahreskalender mit Drag-Auswahl zum schnellen Eintragen von Abwesenheiten
- Export als CSV (Excel-kompatibel) und PDF-Druckansicht
- Import aus CSV mit Vorschau
iPhone Kurzbefehle – Check-in auf Knopfdruck
Das Herzstück ist die API-Integration. Über drei einfache Endpunkte lässt sich alles vom iPhone aus steuern:
POST /api/checkin.php → Check-in starten
POST /api/checkout.php → Check-out speichern
GET /api/status.php → Aktuellen Status abfragen
In der Shortcuts-App legt man zwei Kurzbefehle an – „Arbeit Start“ und „Arbeit Ende“ – jeweils mit einer einfachen HTTP-Anfrage an den eigenen Server. Mit einer Geo-basierten Automatisierung läuft das sogar vollautomatisch: Check-in beim Ankommen, Check-out beim Verlassen.
Zwei Zeitkonten – Gleitzeit und Überstunden
Das System unterscheidet klar zwischen regulärer Gleitzeit und echten Überstunden:
- Gleitzeit-Konto: Alle normalen Arbeitstage fließen hier automatisch ein
- Überstunden-Konto: Nur Tage, die in der Monatsansicht explizit als Überstundentag markiert werden
Einen Gleittag nehmen ist einfach: In der Abwesenheitsverwaltung den Typ „Gleittag (Gleitzeit entnehmen)“ eintragen – das Tagessoll wird automatisch vom Konto abgezogen.
Installation
Der Stack ist schlank: PHP 8.1+, MySQL/MariaDB und Apache mit mod_rewrite. Wer lieber Docker nutzt, ist in zwei Befehlen startklar:
docker compose up -d
curl http://localhost:8081/setup.php
Für Produktivbetrieb einfach das Repo klonen, config.php aus der Beispieldatei erstellen, Datenbank anlegen und setup.php einmal aufrufen – danach löschen.
Sicherheit
Ein paar Dinge waren mir wichtig:
config.phpist in.gitignoreund landet nie im Repository- API-Key mit mindestens 32 zufälligen Bytes
- Login über
password_hash()/password_verify() - CSRF-Schutz auf allen Formularen
- Rate Limiting: max. 10 API-Calls pro Minute pro IP
Das Projekt auf GitHub
Der komplette Quellcode ist unter github.com/rinkelzz/gleitzeit verfügbar. Feedback und Pull Requests sind willkommen!