Datenschutzerklärung

Stand: Mai 2026

English version

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 WochenstundenBis zur Kontolöschung, plus bis zu 30 Tage in unveränderlichen Backups
Fehlerberichte90 Tage, dann automatisch gelöscht. Sofortige Löschung bei Kontolöschung.
Veröffentlichte aggregierte Statistiken aus Ihren BeiträgenUnbegrenzt — 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-Tokens30 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üsselungTLS 1.2+ für gesamten Client-Server-Verkehrdocker-compose.yml (Caddy Reverse-Proxy mit Auto-TLS)
Verschlüsselung im RuhezustandVon Hetzner verwaltete Festplattenverschlüsselung + unveränderliche Backups (COMPLIANCE-Mode Object Lock)data-retention-policy.md
PseudonymisierungZufällige UUID-Nutzer-IDs; E-Mails nur als HMAC-SHA256-Hashes mit serverseitigem geheimen Schlüssel gespeichertsecurity.py Z. 25-28
K-Anonymität in veröffentlichten StatistikenZellen mit weniger als 5 Beitragenden werden nicht veröffentlicht; Dominanzregel verhindert, dass eine einzelne Person mehr als 30 % zum Gruppenbeitrag stelltdp_group_stats/config.py
Differential PrivacyLaplace-Rauschen auf veröffentlichte Werte; jährliches ε-Budget pro Nutzer:in von 150mechanisms.py · accounting.py
Authentifizierungs-TokensJWT mit 30-Tage-Ablauf; im hardwaregesicherten Gerätespeicher (iOS Keychain / Android Keystore)AuthStorage.ts
Rate-Limiting5 Auth-Anfragen pro Minute pro IP; 10 Feedback-Einreichungen pro Minute pro IPrate_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 Hondrich
Karl-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