Datenschutzerklärung
Stand: Mai 2026
Diese Erklärung gilt für Nutzer:innen der Open Working Hours App. Jede konkrete Aussage verlinkt zur Codezeile, die sie umsetzt — der vollständige Quellcode ist öffentlich unter github.com/lukashondrich/open_workinghours.
1. Auf einen Blick
Erfasst — mit einem Namen, den Sie gewählt haben
- Ihre Krankenhauszugehörigkeit — nur wenn Sie ein Krankenhaus aus der Liste von ~1.220 deutschen Krankenhäusern wählen. Mit „Lieber nicht angeben" können Sie sich abmelden — Ihre Stunden fließen dann in keine veröffentlichte Statistik mehr.
- Die Kategorien, die Sie gewählt haben (Fachgebiet, Rolle, Seniorität, Bundesland, Beruf)
→ Details und Code: §2
Erfasst — pseudonym (kein Name daran)
- Eine zufällige Nutzer-ID (UUID)
- Ein Hash Ihrer E-Mail (bei E-Mail-Anmeldung) — mit einem geheimen Schlüssel berechnet
- Ihre Apple- oder Google-Kennung (nur bei Social Login)
- Bestätigte Wochenstunden: nur geplante + tatsächliche Summen (keine Tagesdetails)
- Optional: Gerätemodell, OS-Version, letzte Standortereignisse — nur wenn Sie „Problem melden" antippen
→ Details und Code: §2
Nicht erfasst
- Ihr Name oder Ihre Adresse
- Ihr Tagesplan (wir sehen nur Wochensummen)
- GPS-Koordinaten (Geofence läuft auf Ihrem Gerät; Koordinaten erreichen unser Backend nie)
- Krankheitstage (bleiben auf Ihrem Gerät)
- Frei eingegebene Arbeitgebernamen (Auswahl nur aus der Liste)
- Biometrische Daten (Face ID / Fingerabdruck bleiben im sicheren Speicher Ihres Geräts)
- Werbe- oder Analyse-IDs (haben wir nicht)
- IP-Adressen in unserer Anwendungsdatenbank (Hosting-Logs können sie kurz speichern — siehe §7)
- Krankenhauszugehörigkeit — wenn Sie „Lieber nicht angeben" wählten
Wie es geschützt wird
- K-Anonymität (Gruppen brauchen ≥ 5 Nutzer:innen) + Dominanzregel
- Differential Privacy (Laplace-Rauschen auf veröffentlichte Statistiken)
- Ausschließlich EU-Datenstandort (Server in Deutschland)
- Pseudonymisierung (zufällige Nutzer-IDs; E-Mails nur als gesalzener Hash mit serverseitigem geheimen Schlüssel)
- Verschlüsselung bei Übertragung (TLS) und im Ruhezustand
→ Code-Verweise: §2 und §8
2. Was wir erfassen und warum
2.1 Kontoidentität
Was wir erfassen:
- Eine zufällige Nutzer-ID (UUID) — interne Kennung, wird nie angezeigt
- Ein Hash Ihrer E-Mail-Adresse (HMAC-SHA256 mit einem serverseitigen geheimen Schlüssel) — nur bei Registrierung per E-Mail
- Die Apple- oder Google-Nutzerkennung für Sie — nur bei Social Login (Ihre tatsächliche E-Mail-Adresse wird verworfen)
Warum: Damit wir Sie sitzungsübergreifend erkennen und Ihre gespeicherten Daten Ihrem Konto zuordnen können. Der Hash erlaubt uns, Sie bei der Anmeldung wiederzufinden, ohne Ihre eigentliche E-Mail jemals zu speichern; die Apple-/Google-Kennung übernimmt diese Aufgabe bei Social Login.
Wann: Wird bei der Kontoerstellung angelegt, bleibt bis zur Löschung Ihres Kontos bestehen.
Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO — zur Erfüllung unseres Vertrags mit Ihnen erforderlich (Kontonutzung).
Im Code nachprüfen: models.py Z. 76-96 ·
security.py Z. 25-28
2.2 Profilkategorien
Was wir erfassen:
- Krankenhauszugehörigkeit — optional; mit „Lieber nicht angeben" wird nichts gespeichert
- Fachgebiet / Abteilungsgruppe
- Rolle / Seniorität
- Bundesland
- Beruf
Warum: Um Ihre Beiträge mit ähnlichen Nutzer:innen zu gruppieren, wenn wir K-anonyme Statistiken erstellen. Ohne diese Felder wären die veröffentlichten Statistiken nicht möglich.
Wann: Bei der Kontoerstellung; in Ihrem Profil später änderbar.
Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO für die Speicherung als Teil Ihres Kontos; Art. 6 Abs. 1 lit. a DSGVO (Einwilligung) für den Beitrag zu aggregierten Statistiken.
Im Code nachprüfen: models.py Z. 85-103
2.3 Bestätigte Wochenstunden
Was wir erfassen:
- Pro abgeschlossener Woche: geplante Gesamtstunden + tatsächliche Gesamtstunden (keine Tagesaufschlüsselung)
- Das Startdatum der Woche
- Ihr Land, Bundesland, Fachgebiet, Krankenhauszugehörigkeit (oder NULL bei Opt-out)
Warum: Um K-anonyme, differentially-private Statistiken über Arbeitsstunden nach Gruppen zu erstellen. Tagesdaten werden nie übertragen — nur Wochensummen nach Ihrer Bestätigung.
Wann: Wenn Sie alle 7 Tage einer Woche bestätigen und die Woche abgeschlossen wird.
Rechtsgrundlage: Art. 6 Abs. 1 lit. a DSGVO (Einwilligung speziell für den statistischen Beitrag).
Im Code nachprüfen: models.py Z. 147-185 ·
aggregation.py Z. 54-90
2.4 Optional — Kalenderexport
Was wir erfassen: Nichts. Der Kalenderexport schreibt in den Kalender Ihres Geräts; keine Schichtdaten erreichen unser Backend.
Was an den Kalender Ihres Geräts übergeben wird: Schichtname, Start-/Endzeit, Farbe, Abwesenheitsart (Urlaub/Krankheit).
Wohin es danach geht: Die Kalender-App Ihres Geräts. Wenn Ihr Kalender mit iCloud, Google Kalender oder anderen synchronisiert oder geteilt ist, erscheinen die Einträge auch dort. Sie steuern dies in den Einstellungen Ihres Geräts.
Wann: Nur wenn Sie den Schalter „In Kalender exportieren" in den Einstellungen aktivieren.
Rechtsgrundlage: Art. 6 Abs. 1 lit. a DSGVO (Einwilligung — von Ihnen aktiviert).
Im Code nachprüfen: CalendarExportManager.ts Z. 42
2.5 Optional — Fehlerberichte
Was wir erfassen (nur wenn Sie „Problem melden" und danach „Bericht senden" antippen):
- Ihre optionale Textbeschreibung des Problems
- Gerätemodell (z. B. „iPhone 15 Pro")
- Betriebssystem-Name und -Version
- App-Version und Build-Nummer
- Anzahl der gespeicherten Arbeitsorte und Arbeitsereignisse
- Die letzten ~100 Geofence-Ereignisse auf Ihrem Gerät — Zeitstempel, Ereignistyp, GPS-Genauigkeit in Metern, Ignoriert-Status/-Grund und aggregierte Genauigkeitswerte. Standardmäßig enthält dies keine Namen oder Koordinaten gespeicherter Arbeitsorte.
- Wenn Sie angemeldet sind: Ihre Nutzer-ID, damit wir den Bericht Ihrem Konto zuordnen und bei Kontolöschung ebenfalls löschen können. Krankenhauszugehörigkeit, Fachgebiet, Rolle und Bundesland speichern wir nicht mit Fehlerberichten.
Optionale Standortdiagnose: Der Bestätigungsdialog enthält ein nicht vorausgewähltes Kontrollkästchen „Standortdiagnose einschließen". Wenn Sie es aktivieren, enthält der Bericht zusätzlich Namen gespeicherter Arbeitsorte, ungefähre gespeicherte Koordinaten auf 3 Dezimalstellen gerundet (etwa 100 m Genauigkeit) und aktuelle Geofence-Ereignisse mit Namen der Arbeitsorte.
Was das Backend erzwingt: Wenn Standortdiagnosen nicht ausdrücklich aktiviert sind, entfernt das Backend gespeicherte Arbeitsortdetails und Geofence-Standortnamen auch dann, wenn eine ältere App-Version sie sendet.
Warum: Zur Diagnose technischer Probleme — besonders der Geofencing-Zuverlässigkeit auf Android, wo wir auf reale Telemetriedaten angewiesen sind, um Fehler zu finden und zu beheben.
Wann: Nur wenn Sie in den Einstellungen „Problem melden" antippen und die Übermittlung bestätigen.
Aufbewahrung: Fehlerberichte werden 90 Tage aufbewahrt und danach automatisch gelöscht. Fehlerberichte werden außerdem sofort gelöscht, wenn Sie Ihr Konto löschen.
Rechtsgrundlage: Art. 6 Abs. 1 lit. a DSGVO (Einwilligung — jedes Mal von Ihnen ausgelöst).
Im Code nachprüfen: reportIssue.ts ·
feedback.py Z. 19-81 ·
models.py Z. 342-367
2.6 Einwilligungsdokumentation
Was wir erfassen:
- Welche Version der Nutzungsbedingungen Sie akzeptiert haben
- Welche Version der Datenschutzerklärung Sie akzeptiert haben
- Den Zeitstempel Ihrer Zustimmung
Warum: Art. 7 DSGVO verpflichtet uns nachzuweisen, dass Sie eingewilligt haben. Diese drei Felder sind der rechtliche Nachweis dafür.
Wann: Bei der Kontoerstellung; erneut, wenn ein wesentliches Update der Richtlinien eine Neu-Zustimmung erfordert.
Rechtsgrundlage: Art. 6 Abs. 1 lit. c DSGVO — rechtliche Verpflichtung (Art. 7 schreibt die Dokumentation vor).
Im Code nachprüfen: models.py Z. 106-108
3. Was auf Ihrem Gerät bleibt
Diese Datenkategorien werden ausschließlich auf Ihrem Gerät verarbeitet und erreichen unser Backend nie.
| Was | Wo auf dem Gerät | Nachprüfen |
|---|---|---|
| GPS-Koordinaten | Geofence-Dienst (im Arbeitsspeicher) — Erkennung läuft lokal; übertragen werden nur die resultierenden Wochenstunden-Summen | GeofenceService.ts |
| Schichtvorlagen, geplante Schichten, Abwesenheiten | Lokale SQLite-Datenbank (calendar.db) | CalendarStorage.ts |
| Tracking-Datensätze (unbestätigte Sitzungen) | Lokale SQLite (tracking_records) — nach Ihrer Bestätigung werden nur Wochensummen übermittelt | CalendarStorage.ts |
| Krankheitstage | Lokale SQLite (absence_instances mit type='sick') — werden nie übertragen | CalendarStorage.ts Z. 139 |
| Biometrische Daten (Face ID / Fingerabdruck) | iOS Secure Enclave / Android Keystore — wird vom Betriebssystem verwaltet; wir sehen nichts davon | Verwaltet durch expo-local-authentication |
| Onboarding-Status, weggeklickte Hinweise | AsyncStorage — lokale UI-Einstellungen | – |
4. Datenempfänger
Wenn Sie Open Working Hours nutzen, können Ihre Daten diese Dienste durchlaufen. Die meisten sind immer beteiligt (Hosting, Geocoding); andere nur, wenn Sie bestimmte Funktionen wählen (Social Login, Kalenderexport). Jede Aussage verlinkt zur Codezeile, die sie umsetzt.
| Zweck | Immer oder optional | Empfänger | Standort | Ausgelöst durch | Quelle |
|---|---|---|---|---|---|
| Backend-Hosting, Datenbank, Backups | Immer | Hetzner Online GmbH | Deutschland | Jede App-Nutzung | Hetzner AVV (Standardbedingungen) · unterzeichnet 2026-01-13 |
| E-Mail-Verifizierungscodes | Nur bei E-Mail-Anmeldung | Brevo (Sendinblue) | EU | Registrierung / Anmeldung per E-Mail | Brevo AVV (Standardbedingungen) ·
email.py Z. 28 |
| Suche nach Ihrem Arbeitsplatz | Immer (nur bei Suche) | Komoot GmbH (Photon) | Deutschland | Suche eines Arbeitsplatzes im Setup | GeocodingService.ts Z. 105 |
| Identitätsprüfung (Apple) | Optional | Apple Inc. | USA (EU-US-Datenschutzrahmen) | Wahl von „Mit Apple anmelden" | social_auth.py Z. 24-25 |
| Identitätsprüfung (Google) | Optional | Google LLC | USA (EU-US-Datenschutzrahmen) | Wahl von „Mit Google anmelden" | social_auth.py Z. 26 |
| Kalenderexport | Optional | iOS Kalender (Apple) oder Google Kalender | Ihr Gerät + dem Sync-Dienst, den Sie selbst eingerichtet haben (z. B. iCloud, Google) | Aktivieren des Schalters „In Gerätekalender exportieren" | CalendarExportManager.ts Z. 42 |
Alle Quellverweise auf Stand Commit 49ea57b. Der vollständige Quellcode ist öffentlich unter
github.com/lukashondrich/open_workinghours.
5. Wie lange wir Ihre Daten speichern
| Daten | Aufbewahrung |
|---|---|
| Kontodaten (Nutzer-ID, E-Mail-Hash oder Social-Auth-Kennung, Profilfelder, Einwilligungsdaten) | Bis Sie Ihr Konto löschen |
| Bestätigte Wochenstunden | Bis zur Kontolöschung, plus bis zu 30 Tage in unveränderlichen Backups |
| Fehlerberichte | 90 Tage, dann automatisch gelöscht. Sofortige Löschung bei Kontolöschung. |
| Veröffentlichte aggregierte Statistiken aus Ihren Beiträgen | Unbegrenzt — diese sind anonym, keine personenbezogenen Daten |
| Anwendungs-Logs (Backend) | 7 Tage |
| Datenbank-Backups (Hetzner Object Storage, COMPLIANCE-Mode Object Lock) | 30 Tage, unveränderlich |
| Hosting-Logs (Hetzner, können IP-Adressen enthalten) | Gemäß Hetzner-Standardaufbewahrung; wir haben keinen Anwendungs-Zugriff darauf |
| Verifizierungscodes (E-Mail-Anmeldung) | Nach Verwendung oder Ablauf gelöscht (typischerweise Minuten) |
| Social-Registration-Tokens | 30 Minuten |
Bei Kontolöschung werden die zugehörigen Datensätze innerhalb von Sekunden entfernt. Das 30-Tage-Backup-Fenster bedeutet, dass Daten eines gelöschten Kontos in verschlüsselten Backups verbleiben können, bis das Backup ausrotiert — dokumentiert in
data-retention-policy.md.
6. Ihre Rechte nach DSGVO
| Recht | So nutzen Sie es |
|---|---|
| Auskunft (Art. 15) | In der App: Einstellungen → Daten & Datenschutz → Daten exportieren. Gibt JSON aller Ihrer Datensätze zurück. DataPrivacyScreen.tsx |
| Berichtigung (Art. 16) | In der App: Einstellungen → Profil. Alle Profilfelder sind editierbar. |
| Löschung (Art. 17) | In der App: Einstellungen → Daten & Datenschutz → Konto löschen. auth.py Z. 406-457 |
| Einschränkung (Art. 18) | Schreiben Sie uns per E-Mail (siehe unten). |
| Datenübertragbarkeit (Art. 20) | In der App: Einstellungen → Daten & Datenschutz → Daten exportieren. JSON-Format. |
| Widerspruch (Art. 21) | Wählen Sie „Lieber nicht angeben" als Krankenhauszugehörigkeit — Ihre Wochenstunden fließen in keine veröffentlichte Statistik mehr ein. Oder schreiben Sie uns für umfassenderen Widerspruch. |
| Beschwerderecht | Sie können jederzeit Beschwerde bei einer Aufsichtsbehörde einlegen. Für Berlin ist das die Berliner Beauftragte für Datenschutz und Informationsfreiheit (www.datenschutz-berlin.de). |
| Privacy-Budget-Transparenz (Art. 15) | Authentifizierter Endpoint zeigt Ihren ε-Verbrauch: GET /auth/me/privacy-budget. auth.py Z. 390-403 |
Wir treffen keine automatisierten Entscheidungen über Sie und führen kein Profiling durch (Art. 22 — nicht anwendbar).
7. Wohin Ihre Daten gehen
Ihr Konto, Ihre Stunden, unsere Analytik — alles in Deutschland. Backend, Datenbank und Backups laufen auf Hetzner-Servern in Deutschland. E-Mail-Codes laufen über Brevo (EU). Arbeitsplatzsuche nutzt Komoot (Deutschland). Siehe §4 für die vollständige Empfängermatrix.
Zwei Situationen beinhalten Übermittlungen in Länder außerhalb des EU/EWR — beide sind optional und durch Ihre Wahl ausgelöst:
- Wenn Sie Apple- oder Google-Anmeldung wählen: Die Identitätsprüfung beteiligt Apple Inc. (USA) oder Google LLC (USA). Diese Übermittlungen erfolgen unter dem EU-US-Datenschutzrahmen (Angemessenheitsbeschluss). Die bei der Anmeldung gesendeten Daten dienen Apple/Google zur Überprüfung des Identitäts-Tokens; wir erhalten im Gegenzug nur eine undurchsichtige Kennung. Ihre E-Mail wird bei Social Login von uns nicht gespeichert.
- Wenn Sie Kalenderexport aktivieren und Ihr Gerätekalender mit iCloud oder Google Calendar synchronisiert: Die Kalendereinträge folgen der Sync-Konfiguration Ihres Geräts, was US-Server einschließen kann. Das liegt zwischen Ihnen und Ihrem Kalender-Anbieter; wir sehen und steuern das nicht.
Zu Hosting-Logs / IP-Adressen: Wie bei jedem Webserver sieht die Infrastruktur von Hetzner Ihre IP-Adresse kurz, wenn Ihr Gerät eine Anfrage stellt, und protokolliert sie. Unsere Anwendungs-Datenbank speichert keine IPs. Hetzner sitzt in Deutschland; deren Infrastruktur-Logs bleiben in Deutschland.
8. Sicherheitsmaßnahmen
| Ebene | Was wir tun | Nachprüfen |
|---|---|---|
| Transportverschlüsselung | TLS 1.2+ für gesamten Client-Server-Verkehr | docker-compose.yml (Caddy Reverse-Proxy mit Auto-TLS) |
| Verschlüsselung im Ruhezustand | Von Hetzner verwaltete Festplattenverschlüsselung + unveränderliche Backups (COMPLIANCE-Mode Object Lock) | data-retention-policy.md |
| Pseudonymisierung | Zufällige UUID-Nutzer-IDs; E-Mails nur als HMAC-SHA256-Hashes mit serverseitigem geheimen Schlüssel gespeichert | security.py Z. 25-28 |
| K-Anonymität in veröffentlichten Statistiken | Zellen mit weniger als 5 Beitragenden werden nicht veröffentlicht; Dominanzregel verhindert, dass eine einzelne Person mehr als 30 % zum Gruppenbeitrag stellt | dp_group_stats/config.py |
| Differential Privacy | Laplace-Rauschen auf veröffentlichte Werte; jährliches ε-Budget pro Nutzer:in von 150 | mechanisms.py · accounting.py |
| Authentifizierungs-Tokens | JWT mit 30-Tage-Ablauf; im hardwaregesicherten Gerätespeicher (iOS Keychain / Android Keystore) | AuthStorage.ts |
| Rate-Limiting | 5 Auth-Anfragen pro Minute pro IP; 10 Feedback-Einreichungen pro Minute pro IP | rate_limit.py |
Ehrlich zu Grenzen: Pseudonymisierung reduziert das Re-Identifikationsrisiko, eliminiert es aber nicht. An kleineren Krankenhäusern könnte die Kombination der Profilfelder (Krankenhaus + Fachgebiet + Seniorität) grundsätzlich eine Identifikation durch jemanden ermöglichen, der bereits weiß, dass Sie dort arbeiten. Die oben beschriebene K-Anonymitätsschwelle und Differential Privacy verhindern dies in veröffentlichten Statistiken; die zugrundeliegenden operativen Daten bleiben jedoch pseudonyme personenbezogene Daten — nicht anonym — und unterliegen allen Schutzmaßnahmen dieser Erklärung. Diese Bewertung findet sich in unserer Datenschutz-Folgenabschätzung, Risiko R7.
9. Verantwortliche Person
Lukas HondrichKarl-Marx-Str. 182
12043 Berlin
Deutschland
E-Mail: lukashondrich@googlemail.com
Für die rechtliche Compliance in Deutschland muss dies dem Impressum auf der Website entsprechen. Aktualisieren Sie beide Seiten gemeinsam.
Datenschutzbeauftragter: Nicht erforderlich — Einzelunternehmer unterhalb der Schwellen aus Art. 37 Abs. 1 DSGVO.
Aufsichtsbehörde: Berliner Beauftragte für Datenschutz und Informationsfreiheit, Friedrichstraße 219, 10969 Berlin, www.datenschutz-berlin.de