From c79d91736cd348f003d4b00bce75505eac8787f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?=
Date: Thu, 21 May 2026 11:46:50 +0200
Subject: [PATCH] feat(privacy): public privacy policy page at /privacy with DE
+ EN content
Convert the English-only v1.4.26 privacy page to a bilingual document
that an Apple US App-Store reviewer and a German DPA inspector can both
read without locale switching. Each numbered section opens with the
German body (visible by default) and ships a collapsible English
translation directly underneath. The H1 and TOC carry both languages.
GDPR / DSGVO content additions on top of the v1.4.26 spine:
- HealthKit data flow disclosed explicitly: HK sample to iOS app to
POST /api/measurements over HTTPS, with no third-party transit.
- AI off-device transit boundary spelled out: TLS 1.3, off by default,
never includes raw HealthKit identifiers, per-provider opt-in.
- Consent receipt persistence linked to GET /api/account/consents with
the 5-year retention window.
- Encryption layer named explicitly: TLS 1.3, HSTS, certificate
pinning on iOS (Zertifikat-Pinning in the DE body).
- Server location framed as operator in Germany on Hetzner; no
third-party hosting beyond the AI providers listed in section 4.
- Retention defaults table: rolling 5-year measurement window, 90-day
audit logs, 14-day server access logs, 30-day failed APNs.
- GDPR Art. 17 deletion route named: Settings -> Daten -> Konto
loeschen with the User.delete + onDelete: Cascade contract.
- Operator contact via mbombeck@gmail.com with the GDPR subject-line
convention plus the GitHub-issue fallback channel.
- DSGVO legal-basis citations attached per data category (Art. 6 (1)
(b) and Art. 9 (2) (a) GDPR).
Bumped POLICY_VERSION to 1.4.40, LAST_UPDATED to 2026-05-18. Static
render kept (force-static, no revalidate) so the legal document does
not depend on JavaScript to display its non-default-locale text to a
reviewer.
---
src/app/privacy/page.tsx | 2356 ++++++++++++++++++++++++++------------
1 file changed, 1646 insertions(+), 710 deletions(-)
diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx
index c50bdcecd..511b9f588 100644
--- a/src/app/privacy/page.tsx
+++ b/src/app/privacy/page.tsx
@@ -2,91 +2,161 @@ import type { Metadata } from "next";
import Link from "next/link";
/**
- * v1.4.26 — Public privacy policy.
+ * v1.4.40 W-PRIVACY (SB-3) — Bilingual public privacy policy.
*
* Requirements driving this page:
*
* 1. **Apple App Store Connect** requires a publicly reachable Privacy-
* Policy URL before the iOS native app's first submission. The URL
* registered with ASC is `https://healthlog.bombeck.io/privacy`.
- * 2. **GDPR Art. 13 / 14 + Art. 15-22** — data-subject rights need to
- * be enumerated with concrete endpoints / routes the user can hit.
+ * 2. **GDPR / DSGVO Art. 13 / 14 + Art. 15-22** — data-subject rights
+ * enumerated with concrete in-app routes the user can hit.
* 3. **EU MDR 2017/745 + MDCG 2021-24** — the boundary "HealthLog is
* not a medical device" is stated next to the AI-Coach explanation,
* because that boundary is what keeps the Coach legally outside
* MDR scope. Mirrors GROUND RULES 9 + 15 in the Coach system prompt.
+ * 4. **DACH-Recht** — German content paired with English on the same
+ * page so the document is reviewable by both a German DPA and an
+ * Apple US reviewer without locale switching. Standard bilingual
+ * Datenschutzerklärung layout: each section opens with the German
+ * text and is followed by the English translation under a labelled
+ * `` so the German body reaches the fold first while the
+ * English version stays inline-reachable.
*
* Public route — listed in `src/proxy.ts` PUBLIC_PATHS and the
* `` PUBLIC_PATHS so an unauthenticated visitor (or App-Store
* reviewer) lands directly on the content without an auth redirect.
*
- * English-only body copy for this release. German + the four remaining
- * locales follow in a subsequent patch — pattern matches the W14c
- * native-Coach-prompts release where EN + DE shipped first. The
- * `auth.privacyPolicy` label in `` IS translated into all
- * six locales already so the discoverable link reads natively.
+ * Static-rendered (`force-static`, no `revalidate`). The bilingual body
+ * is inlined verbatim instead of routed through the i18n provider so the
+ * page works without a client-side context — a legal document should
+ * never depend on JavaScript to display its non-default-locale text to a
+ * reviewer.
*/
export const dynamic = "force-static";
export const revalidate = false;
-const POLICY_VERSION = "1.4.26";
-const LAST_UPDATED = "2026-05-15";
+const POLICY_VERSION = "1.4.40";
+const LAST_UPDATED = "2026-05-18";
export const metadata: Metadata = {
- title: "Privacy Policy — HealthLog",
+ title: "Datenschutzerklärung / Privacy Policy — HealthLog",
description:
- "How HealthLog handles personal-health data, sub-processors, GDPR rights, and the EU MDR medical-device boundary.",
+ "Wie HealthLog personenbezogene Gesundheitsdaten verarbeitet, Auftragsverarbeiter, DSGVO-Rechte und die EU-MDR-Medizinprodukte-Grenze. Bilingual DE/EN.",
robots: { index: true, follow: true },
};
interface SectionProps {
id: string;
- title: string;
- children: React.ReactNode;
+ numberLabel: string;
+ titleDe: string;
+ titleEn: string;
+ /** German body (rendered first, visible by default). */
+ bodyDe: React.ReactNode;
+ /** English translation (rendered inside a labelled ``). */
+ bodyEn: React.ReactNode;
}
-function Section({ id, title, children }: SectionProps) {
+function Section({
+ id,
+ numberLabel,
+ titleDe,
+ titleEn,
+ bodyDe,
+ bodyEn,
+}: SectionProps) {
return (
-
+
- {title}
+ {`${numberLabel}. ${titleEn}`}
-
- {children}
+
+
+ Deutsch — {titleDe}
+
+ {bodyDe}
+
+
+ English translation
+
+ ›
+
+
+
+ {bodyEn}
+
+
);
}
interface SubProcessorProps {
name: string;
- role: string;
- data: string;
- location: string;
+ roleDe: string;
+ roleEn: string;
+ dataDe: string;
+ dataEn: string;
+ locationDe: string;
+ locationEn: string;
policyUrl: string;
}
function SubProcessor({
name,
- role,
- data,
- location,
+ roleDe,
+ roleEn,
+ dataDe,
+ dataEn,
+ locationDe,
+ locationEn,
policyUrl,
}: SubProcessorProps) {
return (
-
+
{name}
-
- Role. {role}
-
-
- Data transferred.{" "}
- {data}
-
-
- Storage. {location}
-
+
+
+ Rolle. {roleDe}
+
+
+
+ Übermittelte Daten.
+ {" "}
+ {dataDe}
+
+
+ Speicherort.{" "}
+ {locationDe}
+
+
+
+
+ Role. {roleEn}
+
+
+ Data transferred.{" "}
+ {dataEn}
+
+
+ Storage.{" "}
+ {locationEn}
+
+
- Privacy policy
+ Privacy policy / Datenschutzerklärung
@@ -125,11 +195,11 @@ export default function PrivacyPage() {
{/*
- v1.4.33 IW9 — `max-w-3xl` (768 px) is intentional, not a stale
- token. The legal/long-form column reads better at 70-80 chars
- per line; widening to the app shell's `max-w-screen-xl` would
- push line lengths to ~120 chars on a 1440 px laptop and degrade
- legibility. The same exception applies to `/about`.
+ v1.4.33 IW9 — `max-w-3xl` (768 px) is intentional. The legal /
+ long-form column reads better at 70-80 chars per line; widening
+ to the app shell's `max-w-screen-xl` would push line lengths to
+ ~120 chars on a 1440 px laptop and degrade legibility. The same
+ exception applies to `/about`.
*/}
- Privacy Policy
+ Datenschutzerklärung / Privacy Policy
- Last updated: {LAST_UPDATED}
+ Last updated: {LAST_UPDATED} · Stand: {LAST_UPDATED}
+
+
+ Diese Erklärung ist deutsch-englisch geführt. Jeder Abschnitt
+ beginnt mit dem deutschen Text; die englische Übersetzung
+ steht eingeklappt direkt darunter.
- {/* v1.4.27 MB6 — collapsible TOC. Default-closed on every
- viewport so the policy's first paragraphs reach the fold
- on `
- Contents
+ Inhalt / Contents
- 1. Overview
+ 1. Overview / Überblick
@@ -182,12 +256,12 @@ export default function PrivacyPage() {
className="hover:text-foreground hover:underline"
href="#data-we-collect"
>
- 2. Data we collect
+ 2. Data we collect / Erhobene Daten
- 3. Why we collect each category
+ 3. Why we collect each category / Zwecke der Verarbeitung
@@ -195,17 +269,18 @@ export default function PrivacyPage() {
className="hover:text-foreground hover:underline"
href="#sub-processors"
>
- 4. Third-party sub-processors
+ 4. Third-party sub-processors / Auftragsverarbeiter
- 5. Data storage and retention
+ 5. Data storage and retention / Speicherung &
+ Speicherdauer
- 6. Your rights (GDPR Art. 15-22, DSGVO)
+ 6. Your rights (GDPR Art. 15-22, DSGVO) / Ihre Rechte
@@ -213,7 +288,8 @@ export default function PrivacyPage() {
className="hover:text-foreground hover:underline"
href="#medical-boundary"
>
- 7. Medical-device boundary (EU MDR 2017/745, MDCG 2021-24)
+ 7. Medical-device boundary (EU MDR 2017/745, MDCG 2021-24) /
+ Medizinprodukte-Grenze
@@ -221,7 +297,8 @@ export default function PrivacyPage() {
className="hover:text-foreground hover:underline"
href="#apple-categories"
>
- 8. Apple App Store privacy categories
+ 8. Apple App Store privacy categories / Apple-App-Store-
+ Datenschutzkategorien
@@ -229,687 +306,1546 @@ export default function PrivacyPage() {
className="hover:text-foreground hover:underline"
href="#children"
>
- 9. Children
+ 9. Children / Kinder
- 10. Changes to this policy
+ 10. Changes to this policy / Änderungen
- 11. Contact
+ 11. Contact / Kontakt
-
-
- HealthLog is an open-source, self-hostable personal-health-tracking
- application. Source code is published at{" "}
-
- github.com/MBombeck/HealthLog
- {" "}
- under the GNU Affero General Public License v3.0. This policy
- describes how the hosted instance at{" "}
-
- healthlog.bombeck.io
- {" "}
- and the companion iOS application{" "}
- HealthLog for iOS (bundle identifier{" "}
-
- io.bombeck.healthlog
-
- ) handle personal data.
-
-
- This document covers the web application version {POLICY_VERSION}{" "}
- and the iOS application version 0.3 and later. Self-hosted
- deployments controlled by a different operator are governed by the
- operator's own privacy policy; this document applies only to
- the instance reachable at the hostname above.
-
-
- For questions or data-subject requests, open a public issue at{" "}
-
- github.com/MBombeck/HealthLog/issues
- {" "}
- titled "GDPR — <Access | Erasure | Portability>
- request" without personal information in the title; a private
- channel for the actual exchange will be provided in the first
- response.
-
-
+
+
+ HealthLog ist eine quelloffene, selbst-hostbare Anwendung
+ zur persönlichen Gesundheitsprotokollierung. Der Quellcode
+ wird unter der GNU Affero General Public License v3.0 auf{" "}
+
+ github.com/MBombeck/HealthLog
+ {" "}
+ veröffentlicht. Diese Erklärung beschreibt, wie die unter{" "}
+
+ healthlog.bombeck.io
+ {" "}
+ betriebene Instanz und die zugehörige iOS-Anwendung{" "}
+ HealthLog for iOS (Bundle-ID{" "}
+
+ io.bombeck.healthlog
+
+ ) personenbezogene Daten verarbeiten.
+
+
+ Verantwortlicher im Sinne von Art. 4 Nr. 7 DSGVO ist der
+ Betreiber dieser Instanz (Privatperson mit Sitz in
+ Deutschland). Eigenständig betriebene, selbst-gehostete
+ Instanzen unterliegen der Datenschutzerklärung ihres
+ jeweiligen Betreibers; dieses Dokument gilt ausschließlich
+ für die genannte Domain.
+
+
+ Für Fragen oder Datenschutz-Anfragen siehe Abschnitt 11
+ (Kontakt).
+
+ >
+ }
+ bodyEn={
+ <>
+
+ HealthLog is an open-source, self-hostable personal-health-
+ tracking application. Source code is published at{" "}
+
+ github.com/MBombeck/HealthLog
+ {" "}
+ under the GNU Affero General Public License v3.0. This
+ policy describes how the hosted instance at{" "}
+
+ healthlog.bombeck.io
+ {" "}
+ and the companion iOS application{" "}
+ HealthLog for iOS (bundle identifier{" "}
+
+ io.bombeck.healthlog
+
+ ) handle personal data.
+
+
+ The controller under Art. 4 (7) GDPR is the operator of
+ this instance (an individual based in Germany). Self-
+ hosted deployments controlled by a different operator are
+ governed by that operator's own privacy policy; this
+ document applies only to the hostname above.
+
+
+ For questions or data-subject requests, see section 11
+ (Contact).
+
+ >
+ }
+ />
-
-
- HealthLog is designed to record observations the user enters
- themselves and to consume health signals the user has explicitly
- connected through a third-party integration. The categories below
- are exhaustive for the released feature set.
-
+
+
+ HealthLog speichert Beobachtungen, die der Nutzer selbst
+ erfasst, sowie Gesundheitssignale, die der Nutzer
+ ausdrücklich über eine Integration verbunden hat. Die
+ folgenden Kategorien sind für den veröffentlichten
+ Funktionsumfang abschließend.
+
+
+ 2.1 Konto und Authentifizierung
+
+
+ - E-Mail-Adresse und gewählter Benutzername.
+ -
+ Passwort-Hash (Argon2id; das Klartext-Passwort wird zu
+ keinem Zeitpunkt gespeichert oder protokolliert).
+
+ -
+ Optional: WebAuthn- / Passkey-Anmeldedaten (öffentlicher
+ Schlüssel, Credential-ID, Signaturzähler).
+
+ -
+ Sitzungskennungen (HTTP-only-Cookie im Web; opake API-
+ Token unter iOS, gespeichert im Geräte-Keychain).
+
+ -
+ Profil-Metadaten: Sprache, Zeitzone, Geburtsdatum
+ (optional), biologisches Geschlecht (optional), Körper-
+ größe (optional) — zur Berechnung altersgerechter
+ Zielbereiche und des BMI.
+
+
+
+ 2.2 Manuell erfasste Gesundheitsdaten
+
+
+ Jeder in den App-Formularen eingegebene Wert, einschließ-
+ lich Zeitstempel, optionaler Notiz und Metrik-Typ. Die
+ vollständige Aufzählung der unterstützten Metriken steht
+ im OpenAPI-Schema; die nutzerrelevante Teilmenge umfasst
+ Körpergewicht, Körperfett, Körpertemperatur, BMI
+ (abgeleitet), Blutdruck (systolisch / diastolisch) und
+ Puls (gepaarte Messung), Blutzucker mit Kontext (nüchtern /
+ postprandial / zufällig / vor dem Schlafengehen) und
+ wählbarer Einheit (mg/dL oder mmol/L), Ruhepuls, HRV
+ (SDNN), VO₂max, Sauerstoffsättigung, Schlafdauer inkl. Pro-
+ Stadien-Aufschlüsselung (Wach / REM / Core / Tief),
+ Schritte, gelaufene oder gerannte Distanz, Aktive-Energie,
+ gestiegene Stockwerke, Lärmpegel (Umgebung und Kopfhörer),
+ Tageslicht-Zeit, Stimmung (Skala 1–5) mit optionaler
+ Freitext-Notiz sowie Workouts (Sportart, Dauer, Distanz
+ und optional GPS-Route, ausschließlich wenn der Nutzer
+ eine Route anhängt).
+
+
+ 2.3 Apple Health (iOS-Anwendung) — Datenfluss
+
+
+ Wenn der Nutzer der iOS-Anwendung Lesezugriff auf Apple
+ HealthKit erteilt, liest HealthLog Stichproben der unten
+ aufgeführten Identifier. HealthKit-Daten verbleiben auf
+ dem Gerät des Nutzers und in dessen iCloud-gestütztem
+ Health-Speicher; die iOS-Anwendung überträgt die relevant-
+ en Stichproben über HTTPS (TLS 1.3, Zertifikat-Pinning) an
+ den HealthLog-Server (Endpunkt{" "}
+
+ POST /api/measurements
+
+ ), damit die Web-Oberfläche dieselben Verläufe darstellen
+ kann wie das iPhone. Es findet keine Übertragung an Dritte
+ statt; die Daten werden ausschließlich auf der unter
+ Abschnitt 5 beschriebenen Infrastruktur in Deutschland
+ gespeichert.
+
+ HKQuantityTypeIdentifier:
+
+ -
+
bodyMass
+
+ -
+
bodyFatPercentage
+
+ -
+
bodyTemperature
+
+ -
+
bloodPressureSystolic
+
+ -
+
bloodPressureDiastolic
+
+ -
+
bloodGlucose
+
+ -
+
oxygenSaturation
+
+ -
+
heartRate
+
+ -
+
restingHeartRate
+
+ -
+
heartRateVariabilitySDNN
+
+ -
+
vo2Max
+
+ -
+
stepCount
+
+ -
+
activeEnergyBurned
+
+ -
+
flightsClimbed
+
+ -
+
distanceWalkingRunning
+
+ -
+
environmentalAudioExposure
+
+ -
+
headphoneAudioExposure
+
+ -
+
timeInDaylight (iOS 17+)
+
+
+ HKCategoryTypeIdentifier:
+
+ -
+
sleepAnalysis —
+ mit voller Pro-Stadien-Granularität (Awake, REM, Core,
+ Deep). Die Stadien werden serverseitig als separate
+ Zeilen abgelegt, damit das Diagramm sie stapeln kann.
+
+
+
+ Schreibzugriff wird für eine Teilmenge angefordert
+ (Körpermasse, Blutdruck systolisch / diastolisch, Blut-
+ zucker), damit manuelle Einträge in der iOS-App zurück
+ nach HealthKit fließen können. Der Nutzer steuert beide
+ Richtungen über die Berechtigungsoberfläche der iOS-
+ Health-App und kann jederzeit widerrufen.
+
+
+ 2.4 Withings-Synchronisation (optional)
+
+
+ Verbindet der Nutzer ein Withings-Konto, speichert
+ HealthLog die OAuth-Refresh- und -Access-Token (spalten-
+ weise verschlüsselt) sowie die Withings-Nutzerkennung.
+ Webhook-getriebene Folgesynchronisierungen ziehen Körper-
+ gewicht, Fettanteil, fettfreie Masse, Muskelmasse,
+ Knochenmasse, Wassergehalt, Magermasse, Hydration,
+ Blutdruck (systolisch / diastolisch) und Puls, Blut-
+ zucker, Körpertemperatur (Basal- und Hauttemperatur),
+ Aktivitätssummen (Schritte, Distanz, aktive Kalorien),
+ Schlafsitzungen mit Pro-Stadien-Segmenten (Awake / Light /
+ Deep / REM) sowie SpO₂ und Herzfrequenzvariabilität,
+ soweit vorhanden.
+
+
+ 2.5 Medikamente
+
+
+ -
+ Aktive Verordnungen: Wirkstoffname, Stärke, Verabreich-
+ ungsweg, Einnahmeplan, Behandlungsklasse (Standard oder
+ GLP-1).
+
+ -
+ Einnahme-Ereignisse: geplante Zeit, tatsächliche Zeit,
+ Status (eingenommen, ausgelassen, verpasst).
+
+ -
+ Bei GLP-1-Therapien: Dosis-Änderungs-Historie, Injektions-
+ Ereignisse mit optionaler Injektionsstelle und Pen-
+ Kennung, Nebenwirkungs-Protokolle entlang einer fixen
+ Taxonomie, Pen-und-Ampullen-Inventar mit 30-Tage-In-
+ Use-Uhr.
+
+
+
+ 2.6 KI-Coach und Insights — Off-Device-Transit
+
+
+ Aktiviert der Nutzer die KI-Coach-Oberfläche und
+ konfiguriert einen Sprachmodell-Anbieter, übermittelt
+ HealthLog auf Anforderung ein Snapshot-Bündel an diesen
+ Anbieter. Das Bündel enthält Gesundheitskontext aus den
+ oben genannten Daten (Aggregate, jüngste Beobachtungen,
+ Zielbereiche, optionaler Medikamentenkontext) und{" "}
+
+ niemals rohe HealthKit-Identifier oder rohe Sample-IDs
+
+ ; der Server normalisiert HK-Stichproben vorab in die
+ interne Metrik-Taxonomie. Die Übertragung erfolgt
+ verschlüsselt (TLS 1.3); standardmäßig ist die KI-Coach-
+ Funktion deaktiviert und wird nur nach ausdrücklicher
+ Nutzereinwilligung pro Anbieter aktiviert (siehe Einwilli-
+ gungsnachweis unter Abschnitt 2.7). HealthLog speichert
+ keinen langlebigen Gesprächszustand über den letzten
+ Thread hinaus. Abschnitt 4 listet die in Frage kommenden
+ Anbieter (Anthropic, OpenAI) auf.
+
+
+ 2.7 Einwilligungsnachweis (Consent Receipt)
+
+
+ Jede Einwilligung in die KI-Übermittlung — sowohl die
+ Aktivierung pro Anbieter als auch Änderungen am
+ Datentiefe-Schalter — wird mit Zeitstempel, Anbieter,
+ Versionskennung des Einwilligungstextes und Hash des
+ Snapshot-Schemas als „Consent Receipt“ persistiert. Der
+ Endpunkt zum Abruf ist{" "}
+
+ GET /api/account/consents
+
+ ; die Speicherdauer der Belege beträgt fünf Jahre, danach
+ werden sie automatisch gelöscht. Ein Widerruf wird als
+ eigenes Receipt mit umgekehrter Polarität abgelegt; der
+ Anbieter erhält ab diesem Zeitpunkt keine Snapshot-Bündel
+ mehr.
+
+
+ 2.8 Geräte- und Integrations-Metadaten, Push
+
+
+ -
+ Geräte-Kennung (zufällige UUID, clientseitig erzeugt
+ und im iOS-Keychain gespeichert), übermittelt als{" "}
+
+ X-Device-Id
+ {" "}
+ -Header — für Mehrgeräte-Synchronisation und Miss-
+ brauchsschutz.
+
+ -
+ Apple-Push-Notification-Service-(APNs)-Geräte-Token und
+ Umgebung (sandbox / production), ausschließlich bei
+ aktivierten Push-Benachrichtigungen.
+
+ -
+ Telegram-Chat-Kennung — nur, wenn der Nutzer die
+ optionale Telegram-Bot-Benachrichtigung verbunden hat.
+
+
+
+ 2.9 Sicherheits- und Audit-Logs
+
+
+ -
+ Authentifizierungs-Ereignisse (Login-Erfolg/-Fehlschlag,
+ Passkey-Registrierung, Passwort-Wechsel, Sitzungs-
+ Widerruf) — 90 Tage zur forensischen Aufklärung.
+
+ -
+ Server-Zugriffsprotokolle (Zeit, Pfad, Statuscode, User-
+ Agent, IP) — 14 Tage zur Missbrauchsbekämpfung und
+ Fehlersuche.
+
+ -
+ Fehlgeschlagene APNs-Zustellungen — 30 Tage zur
+ Wartung des Push-Pfads, danach automatische Löschung.
+
+
+
+ 2.10 Nicht erhobene Daten
+
+
+ -
+ Keine Werbe-Identifier, Fingerprints oder anwendungs-
+ übergreifenden Tracker.
+
+ - Keine Zahlungsdaten (es gibt keinen Bezahltarif).
+ -
+ Keine fortlaufende Hintergrund-Standortermittlung —
+ GPS-Routen nur, wenn der Nutzer sie einem Workout
+ ausdrücklich beifügt.
+
+ -
+ Keine Social-Network-Kennungen und kein Kontaktlisten-
+ Abgleich.
+
+ -
+ Keine clientseitigen Produkt-Analytics; die Instanz
+ liefert kein Analytics-SDK aus.
+
+
+ >
+ }
+ bodyEn={
+ <>
+
+ HealthLog is designed to record observations the user
+ enters themselves and to consume health signals the user
+ has explicitly connected through a third-party
+ integration. The categories below are exhaustive for the
+ released feature set.
+
+
+ 2.1 Account and authentication
+
+
+ - Email address and chosen username.
+ -
+ Password hash (Argon2id; the plain-text password is
+ never stored or logged).
+
+ -
+ Optional WebAuthn / passkey credentials (public key,
+ credential ID, sign counter).
+
+ -
+ Session identifiers (HTTP-only cookie on the web;
+ opaque API tokens on iOS, stored in the device
+ Keychain).
+
+ -
+ Profile metadata: locale, timezone, date of birth
+ (optional), biological sex (optional), height
+ (optional) — used to compute age-adjusted target
+ ranges and BMI.
+
+
+
+ 2.2 Manually entered health data
+
+
+ Any value entered through the in-app forms, including
+ timestamp, optional note, and metric type: body weight,
+ body-fat percentage, body temperature, BMI (derived),
+ blood pressure (systolic / diastolic) and pulse rate as
+ paired readings, blood glucose with context (fasting,
+ postprandial, random, bedtime) and configurable unit
+ (mg/dL or mmol/L), resting heart rate, heart-rate
+ variability (SDNN), VO₂ max, oxygen saturation, sleep
+ duration with per-stage breakdown (Awake / REM / Core /
+ Deep), step count, distance walked or run, active-energy
+ burned, flights climbed, environmental and headphone
+ audio-exposure levels, time in daylight, mood (1-5
+ scale) with optional free-text note, and workout
+ sessions (activity type, duration, distance, and an
+ optional GPS route attached manually by the user).
+
+
+ 2.3 Apple Health (iOS application) — data flow
+
+
+ When the user grants the iOS application read access to
+ Apple HealthKit, HealthLog reads samples for the
+ identifiers listed below. HealthKit data remains on the
+ user's device and the user's iCloud-backed Health store;
+ the iOS application copies relevant samples to the
+ HealthLog server over HTTPS (TLS 1.3, certificate
+ pinning) via{" "}
+
+ POST /api/measurements
+ {" "}
+ so the web surface can render the same trends as the
+ iPhone. No third-party transit; data lives on the
+ German-located infrastructure described in section 5.
+
+ HKQuantityTypeIdentifier:
+
+ -
+
bodyMass
+
+ -
+
bodyFatPercentage
+
+ -
+
bodyTemperature
+
+ -
+
bloodPressureSystolic
+
+ -
+
bloodPressureDiastolic
+
+ -
+
bloodGlucose
+
+ -
+
oxygenSaturation
+
+ -
+
heartRate
+
+ -
+
restingHeartRate
+
+ -
+
heartRateVariabilitySDNN
+
+ -
+
vo2Max
+
+ -
+
stepCount
+
+ -
+
activeEnergyBurned
+
+ -
+
flightsClimbed
+
+ -
+
distanceWalkingRunning
+
+ -
+
environmentalAudioExposure
+
+ -
+
headphoneAudioExposure
+
+ -
+
timeInDaylight (iOS 17+)
+
+
+ HKCategoryTypeIdentifier:
+
+ -
+
sleepAnalysis —
+ with full per-stage granularity (Awake, REM, Core,
+ Deep). Stages are stored server-side as separate rows
+ so the chart can stack them.
+
+
+
+ Write access is requested for a subset (body mass, blood-
+ pressure systolic / diastolic, blood glucose) so that
+ manual entries made inside the iOS app can flow back
+ into HealthKit. The user controls both directions in
+ the iOS Health app's permission surface and may revoke
+ at any time.
+
+
+ 2.4 Withings sync (optional)
+
+
+ When the user connects a Withings account, HealthLog
+ stores the OAuth refresh and access tokens (encrypted
+ at the column level) and the user's Withings
+ identifier. Subsequent webhook-driven syncs pull body
+ weight, fat ratio, fat-free mass, muscle mass, bone
+ mass, water mass, lean mass, hydration, blood pressure
+ (systolic / diastolic) and pulse, blood glucose
+ readings, body temperature (basal and skin), activity
+ totals (steps, distance, active calories), sleep
+ sessions with per-stage segments (Awake / Light / Deep /
+ REM), and SpO₂ + HRV where available.
+
+
+ 2.5 Medications
+
+
+ -
+ Active prescriptions: drug name, strength, route,
+ schedule, treatment-class flag (standard or GLP-1).
+
+ -
+ Intake events: scheduled time, actual time, status
+ (taken, skipped, missed).
+
+ -
+ For GLP-1 treatments: dose-change history, injection
+ events with optional injection site and pen
+ identifier, side-effect logs against a fixed taxonomy,
+ pen-and-vial inventory with a 30-day in-use clock.
+
+
+
+ 2.6 AI Coach and Insights — off-device transit
+
+
+ When the user enables the AI Coach surface and
+ configures a language-model provider, HealthLog sends a
+ snapshot bundle to that provider on demand. The bundle
+ contains health context derived from the data above
+ (aggregates, recent observations, target ranges,
+ optional medication context) and{" "}
+
+ never includes raw HealthKit identifiers or raw sample
+ IDs
+
+ ; the server normalises HK samples into the internal
+ metric taxonomy first. Transit is encrypted (TLS 1.3).
+ The AI Coach is off by default and is enabled per-
+ provider only after explicit user consent (see consent
+ receipt in section 2.7). HealthLog does not retain
+ long-term conversation state beyond the most recent
+ thread. Section 4 enumerates the eligible providers
+ (Anthropic, OpenAI).
+
+
+ 2.7 Consent receipt persistence
+
+
+ Every consent to AI transit — both per-provider
+ activation and changes to the data-depth toggle — is
+ persisted as a “consent receipt” with timestamp,
+ provider, consent-text version, and a hash of the
+ snapshot schema. The retrieval endpoint is{" "}
+
+ GET /api/account/consents
+
+ ; receipts are retained for five years and then deleted
+ automatically. A withdrawal is recorded as a separate
+ reverse-polarity receipt; from that moment the provider
+ receives no further snapshot bundles.
+
+
+ 2.8 Device and integration metadata, push
+
+
+ -
+ A device identifier (random UUID generated client-
+ side, stored in the iOS Keychain) sent as the{" "}
+
+ X-Device-Id
+ {" "}
+ request header — used for multi-device sync and abuse
+ prevention.
+
+ -
+ Apple Push Notification service (APNs) device token
+ and environment flag (sandbox / production), recorded
+ only when the user enables push notifications.
+
+ -
+ Telegram chat identifier — only when the user has
+ explicitly connected the optional Telegram-bot
+ notifier.
+
+
+
+ 2.9 Security and audit
+
+
+ -
+ Authentication events (login success / failure,
+ passkey registration, password change, session
+ revocation) — retained for 90 days for security
+ forensics.
+
+ -
+ Server access logs (timestamp, request path, status
+ code, user-agent, IP address) — 14 days for abuse-
+ rate-limiting and debugging.
+
+ -
+ Failed APNs deliveries — 30 days to support push-
+ pipeline maintenance, then auto-deleted.
+
+
+
+ 2.10 Data we do not collect
+
+
+ -
+ No third-party advertising identifiers, fingerprints,
+ or cross-app tracking.
+
+ -
+ No payment information (the application has no paid
+ tier).
+
+ -
+ No precise background location (workouts only carry
+ GPS when the user attaches a route).
+
+ -
+ No social-network identifiers or contact-list scrapes.
+
+ -
+ No third-party product analytics. The instance does
+ not ship a client-side analytics SDK.
+
+
+ >
+ }
+ />
-
- 2.1 Account and authentication
-
-
- - Email address and chosen username.
- -
- Password hash (Argon2id; the plain-text password is never stored
- or logged).
-
- -
- Optional WebAuthn / passkey credentials (public key, credential
- ID, sign counter).
-
- -
- Session identifiers (HTTP-only cookie on the web; opaque API
- tokens on iOS, stored in the device Keychain).
-
- -
- Profile metadata: locale, timezone, date of birth (optional),
- biological sex (optional), height (optional). Used to compute
- age-adjusted target ranges and BMI.
-
-
+
+
+
+ Authentifizierungsdaten
+ {" "}
+ — Identifikation des Nutzers und Sicherung der Sitzung.
+ Rechtsgrundlage: Art. 6 Abs. 1 lit. b DSGVO (Vertrags-
+ erfüllung).
+
+
+
+ Gesundheitsdaten
+ {" "}
+ — Darstellung von Verläufen, Berechnung der Zielwerte-
+ Treue, Erzeugung des Coach-Snapshots auf Abruf. Rechts-
+ grundlage: Art. 9 Abs. 2 lit. a DSGVO (ausdrückliche
+ Einwilligung für Daten besonderer Kategorien).
+
+
+
+ Coach-Snapshots
+ {" "}
+ — Erzeugung personalisierter schriftlicher Rückmeldungen.
+ Das Bündel wird nur für die Dauer der Anfrage an den
+ konfigurierten KI-Anbieter übertragen.
+
+
+
+ Geräte-Daten
+ {" "}
+ — Push-Benachrichtigungen, Missbrauchsschutz, Mehrgeräte-
+ Sitzungshygiene.
+
+
+
+ Audit-Logs
+ {" "}
+ — Sicherheits-Forensik und Rate-Limit. Rechtsgrundlage:
+ Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse am
+ sicheren Betrieb).
+
+
+
+ Produkt-Analytics
+ {" "}
+ — werden nicht erhoben.
+
+
+ }
+ bodyEn={
+
+ -
+
+ Authentication data
+ {" "}
+ — identifying the user and securing the session. Legal
+ basis: GDPR Art. 6 (1) (b) performance of contract.
+
+ -
+
+ Health data
+ {" "}
+ — displaying trends, computing target adherence,
+ generating the Coach context bundle when the user
+ invokes it. Legal basis: GDPR Art. 9 (2) (a) explicit
+ consent for special-category data.
+
+ -
+
+ Coach context bundles
+ {" "}
+ — generating personalised written feedback. The bundle
+ is transmitted to the configured AI provider for the
+ duration of the request only.
+
+ -
+
+ Device data
+ {" "}
+ — push notifications, abuse prevention, multi-device
+ session hygiene.
+
+ -
+
+ Audit logs
+ {" "}
+ — security-event tracing and rate-limiting. Legal
+ basis: GDPR Art. 6 (1) (f) legitimate interest in
+ operating the service securely.
+
+ -
+
+ Product analytics
+ {" "}
+ — none collected.
+
+
+ }
+ />
-
- 2.2 Manually entered health data
-
-
- Any value entered through the in-app forms, including timestamp,
- optional note, and the metric type. The full enumeration of
- supported metrics is published in the OpenAPI schema; the
- user-relevant subset includes:
-
-
- -
- Body weight, body-fat percentage, body temperature, BMI (derived).
-
- -
- Blood pressure (systolic, diastolic) and pulse rate, recorded as
- paired readings.
-
- -
- Blood glucose with measurement context (fasting, postprandial,
- random, bedtime) and a configurable unit (mg/dL or mmol/L).
-
- -
- Resting heart rate, heart-rate variability (SDNN), VO₂ max,
- oxygen saturation.
-
- -
- Sleep duration including per-stage breakdown (Awake / REM / Core
- / Deep).
-
- -
- Step count, distance walked or run, active-energy burned, flights
- climbed.
-
- - Environmental and headphone audio-exposure levels.
- - Time in daylight.
- - Mood (1-5 scale) with optional free-text note.
- -
- Workout sessions: activity type, duration, distance, and an
- optional GPS route (only uploaded when the user attaches a route
- explicitly; HealthLog does not run continuous location services).
-
- -
- Personal records derived automatically from the data above
- (metric type, value, achievement timestamp, optional workout
- link).
-
-
+
+
+ Folgende Anbieter können personenbezogene Daten im Auftrag
+ des Betreibers verarbeiten. Die Liste ist für den
+ veröffentlichten Funktionsumfang abschließend. Anbieter
+ werden nur für die Funktionen eingebunden, die der Nutzer
+ ausdrücklich aktiviert hat. Für jede Übertragung in
+ Drittländer (insbesondere USA) bestehen Standardvertrags-
+ klauseln nach Art. 46 Abs. 2 lit. c DSGVO mit dem
+ jeweiligen Anbieter.
+
+
+ Die englische Übersetzung enthält die detaillierte
+ Auflistung pro Anbieter mit Rolle, übermittelten Daten,
+ Speicherort und Link zur Datenschutzerklärung.
+
+ >
+ }
+ bodyEn={
+ <>
+
+ The following providers may process personal data on
+ behalf of the HealthLog operator. The list is exhaustive
+ for the released feature set; sub-processors are only
+ engaged for the features the user has explicitly enabled.
+ Each transfer to a third country (notably the United
+ States) is covered by Standard Contractual Clauses under
+ Art. 46 (2) (c) GDPR with the respective provider.
+
+
+ >
+ }
+ />
-
- 2.3 Apple Health (iOS application)
-
-
- When the user grants the iOS application read access to Apple
- HealthKit, HealthLog reads samples for the identifiers listed
- below. HealthKit data remains on the user's device and the
- user's iCloud-backed Health store; the iOS application copies
- relevant samples to the user's HealthLog account so that the
- web surface can render the same trends as the iPhone.
-
- HKQuantityTypeIdentifier:
-
- -
-
bodyMass
-
- -
-
bodyFatPercentage
-
- -
-
bodyTemperature
-
- -
-
bloodPressureSystolic
-
- -
-
bloodPressureDiastolic
-
- -
-
bloodGlucose
-
- -
-
oxygenSaturation
-
- -
-
heartRate
-
- -
-
restingHeartRate
-
- -
-
heartRateVariabilitySDNN
-
- -
-
vo2Max
-
- -
-
stepCount
-
- -
-
activeEnergyBurned
-
- -
-
flightsClimbed
-
- -
-
distanceWalkingRunning
-
- -
-
environmentalAudioExposure
-
- -
-
headphoneAudioExposure
-
- -
-
timeInDaylight (iOS 17 and later)
-
-
- HKCategoryTypeIdentifier:
-
- -
-
sleepAnalysis — read with full
- per-stage granularity (Awake, REM, Core, Deep). Stages are stored
- server-side as separate rows so the chart can stack them.
-
-
-
- Write access is requested for a subset (body mass, blood-pressure
- systolic / diastolic, blood glucose) so that manual entries made
- inside the iOS app can flow back into HealthKit. The user controls
- both directions in the iOS Health app's permission surface and
- may revoke at any time.
-
+
+
+
+ Serverstandort
+ {" "}
+ — primäre Datenhaltung in einer PostgreSQL-Datenbank auf
+ Hetzner-Infrastruktur in Deutschland; die Anwendung wird
+ vom Betreiber als Privatperson in Deutschland verant-
+ wortet. Außer den unter Abschnitt 4 genannten Anbietern
+ ist keine weitere Drittspeicherung beteiligt.
+
+
+
+ Verschlüsselung im Transit
+ {" "}
+ — TLS 1.3 mit HSTS auf allen öffentlichen Endpunkten; die
+ iOS-Anwendung pinnt zusätzlich das TLS-Zertifikat.
+
+
+
+ Verschlüsselung im Ruhezustand
+ {" "}
+ — verschlüsselte Festplatten; sensible Spalten (Auth-
+ Token, Integrations-Secrets) zusätzlich auf Spaltenebene
+ mit einem separaten Schlüssel verschlüsselt.
+
+
+
+ Backups
+ {" "}
+ — täglich, verschlüsselt, 30 Tage Aufbewahrung auf einem
+ S3-kompatiblen Objektspeicher mit eigener
+ Verschlüsselungsschicht.
+
+
+
+ Standard-Speicherdauern
+ {" "}
+ — Messungen: gleitendes 5-Jahres-Fenster (Roh-Stichproben
+ älter als 5 Jahre werden automatisch verdichtet bzw.
+ gelöscht; aggregierte Verläufe bleiben). Audit-Logs:
+ 90 Tage. Server-Zugriffsprotokolle: 14 Tage. Fehl-
+ geschlagene APNs-Zustellungen: 30 Tage. Einwilligungs-
+ belege: 5 Jahre.
+
+
+
+ Löschung
+ {" "}
+ — der Endpunkt zur Konto-Löschung läuft kaskadiert durch
+ jede nutzer-skopierte Tabelle: Gesundheitsmessungen,
+ Sitzungen, Audit-Log, Integrations-Token, Push-
+ Abonnements, Erfolge, hochgeladene Dateien. Die Löschung
+ erfolgt sofort; Backups laufen innerhalb des 30-Tage-
+ Fensters aus.
+
+
+ }
+ bodyEn={
+
+ -
+
+ Server location
+ {" "}
+ — primary store is PostgreSQL on Hetzner-hosted
+ hardware in Germany; the application is operated by the
+ controller as an individual based in Germany. No third-
+ party hosting beyond the providers listed in section 4.
+
+ -
+
+ Encryption in transit
+ {" "}
+ — TLS 1.3 with HSTS on every public endpoint; the iOS
+ application additionally pins the TLS certificate.
+
+ -
+
+ Encryption at rest
+ {" "}
+ — disk-level encryption plus column-level encryption
+ with a separate key for sensitive columns (auth tokens,
+ integration secrets).
+
+ -
+ Backups{" "}
+ — daily, encrypted, retained for 30 days on an S3-
+ compatible object store with its own encryption-at-
+ rest layer.
+
+ -
+
+ Default retention windows
+ {" "}
+ — measurements: rolling 5-year window (raw samples
+ older than 5 years are aggregated or removed; long-arc
+ aggregates persist). Audit logs: 90 days. Server
+ access logs: 14 days. Failed APNs deliveries: 30 days.
+ Consent receipts: 5 years.
+
+ -
+
+ Deletion
+ {" "}
+ — the account-deletion endpoint cascades through every
+ user-scoped table: health observations, sessions, audit
+ log, integration tokens, push subscriptions,
+ achievements, uploaded files. Deletion is immediate;
+ backups age out under the 30-day window.
+
+
+ }
+ />
-
- 2.4 Withings sync (optional)
-
-
- When the user connects a Withings account, HealthLog stores the
- OAuth refresh and access tokens (encrypted at the column level) and
- the user's Withings identifier. Subsequent webhook-driven
- syncs pull the following measurement families:
-
-
- - Body weight, fat ratio, fat-free mass, muscle mass.
- - Bone mass, water mass, lean mass, hydration.
- - Blood pressure (systolic, diastolic) and pulse.
- - Blood glucose readings.
- - Body temperature, basal temperature, skin temperature.
- - Activity totals: steps, distance, active calories.
- -
- Sleep sessions with per-stage segments (Awake / Light / Deep /
- REM).
-
- - SpO₂ and heart-rate variability where available.
-
-
-
- 2.5 Medications
-
-
- -
- Active prescriptions: drug name, strength, route, schedule,
- treatment-class flag (standard or GLP-1).
-
- -
- Intake events: scheduled time, actual time, status (taken,
- skipped, missed).
-
- -
- For GLP-1 treatments: dose-change history, injection events with
- optional injection site and pen identifier, side-effect logs
- against a fixed taxonomy, pen-and-vial inventory with a 30-day
- in-use clock.
-
-
-
-
- 2.6 AI Coach and Insights
-
-
- When the user enables the AI Coach surface and configures a
- language-model provider, HealthLog sends a snapshot bundle to that
- provider on demand. The bundle contains health context derived
- from the data above (aggregates, recent observations, target
- ranges, optional medication context). The bundle is generated per
- request; HealthLog does not retain long-term conversation state
- beyond the most recent thread. See section 4 for what each
- provider does with the data.
-
-
-
- 2.7 Device and integration metadata
-
-
- -
- A device identifier (random UUID generated client-side, stored
- in the iOS Keychain) sent as the{" "}
-
- X-Device-Id
- {" "}
- request header. Used for multi-device sync and abuse prevention.
-
- -
- Apple Push Notification service (APNs) device token and
- environment flag (sandbox / production), recorded only when the
- user enables push notifications.
-
- -
- Telegram chat identifier — only when the user has explicitly
- connected the optional Telegram-bot notifier.
-
-
-
-
- 2.8 Security and audit
-
-
- -
- Authentication events: login success / failure, passkey
- registration, password change, session revocation. Retained for
- security forensics.
-
- -
- Server access logs: timestamp, request path, status code, user-
- agent, IP address. Retained for 14 days for abuse-rate-limiting
- and debugging.
-
-
-
-
- 2.9 Data we do not collect
-
-
- -
- No third-party advertising identifiers, fingerprints, or
- cross-app tracking.
-
- -
- No payment information (the application has no paid tier).
-
- -
- No precise background location (workouts only carry GPS when the
- user attaches a route).
-
- - No social-network identifiers or contact-list scrapes.
- -
- No third-party product analytics. The instance does not ship a
- client-side analytics SDK.
-
-
-
-
-
-
- -
-
- Authentication data
- {" "}
- — identifying the user and securing the session. Legal basis: GDPR
- Art. 6 (1) (b) performance of contract.
-
- -
- Health data{" "}
- — displaying trends, computing target adherence, generating the
- Coach context bundle when the user invokes it. Legal basis: GDPR
- Art. 9 (2) (a) explicit consent for special-category data.
-
- -
-
- Coach context bundles
- {" "}
- — generating personalised written feedback. The bundle is
- transmitted to the configured AI provider for the duration of the
- request only.
-
- -
- Device data{" "}
- — push notifications, abuse prevention, and multi-device session
- hygiene.
-
- -
- Audit logs{" "}
- — security-event tracing and rate-limiting. Legal basis: GDPR
- Art. 6 (1) (f) legitimate interest in operating the service
- securely.
-
- -
-
- Product analytics
- {" "}
- — none collected.
-
-
-
-
-
-
- The following providers may process personal data on behalf of the
- HealthLog operator. The list is exhaustive for the released
- feature set; sub-processors are only engaged for the features the
- user has explicitly enabled.
-
-
-
-
-
-
- -
- Primary data store: PostgreSQL on a Hetzner-hosted server in
- Germany. Disk encrypted at rest. Sensitive columns
- (authentication tokens, integration secrets) are individually
- encrypted with a key separate from the database key.
-
- -
- Backups: daily, encrypted, retained for 30 days on an
- S3-compatible object store with its own encryption-at-rest layer.
-
- -
- Retention: account data is retained until the user requests
- erasure (see section 6) or the account is administratively
- closed. Audit logs are retained for 90 days; server access logs
- for 14 days.
-
- -
- Deletion: the account-deletion endpoint cascades through every
- user-scoped table — health observations, sessions, audit log,
- integration tokens, notification subscriptions, achievements,
- uploaded files. The deletion is immediate; backups age out under
- the 30-day window above.
-
-
-
-
-
-
- -
-
- Right of access (Art. 15)
- {" "}
- — every value the application has stored is reachable through the
- in-app history surfaces. A consolidated JSON export is offered
- under Settings → Data & export.
-
- -
-
- Right to rectification (Art. 16)
- {" "}
- — every record carries an in-app edit and delete action.
-
- -
-
- Right to erasure (Art. 17)
- {" "}
- — Settings → Account → Delete account. The action
- cascades immediately through user-scoped tables; backups age out
- within the 30-day window described in section 5.
-
- -
-
- Right to restriction of processing (Art. 18)
- {" "}
- — request an administrative suspension by opening a GDPR issue
- (see section 9).
-
- -
-
- Right to data portability (Art. 20)
- {" "}
- — the JSON export under Settings → Data & export{" "}
- returns the full record set in a structured, machine-readable
- format.
-
- -
-
- Right to object to automated decision-making (Art. 22)
- {" "}
- — the AI Coach does not make automated decisions in the Art. 22
- sense. It generates written suggestions for the user to read; no
- action is taken on the user's behalf without explicit
- confirmation. See section 7 for the medical-device boundary.
-
- -
-
- Right to lodge a complaint
- {" "}
- — with the Federal Commissioner for Data Protection and Freedom
- of Information (BfDI) for the German federal level, or with the
- data-protection authority of the user's habitual residence.
-
-
-
+
+
+
+ Auskunftsrecht (Art. 15)
+ {" "}
+ — jeder gespeicherte Wert ist über die Historie in der
+ App erreichbar. Ein konsolidierter JSON-Export liegt
+ unter Einstellungen → Daten & Export.
+
+
+
+ Recht auf Berichtigung (Art. 16)
+ {" "}
+ — jeder Eintrag bietet eine Bearbeiten- und Löschen-
+ Aktion in der App.
+
+
+
+ Recht auf Löschung (Art. 17)
+ {" "}
+ — Einstellungen → Daten → Konto löschen. Die
+ Aktion kaskadiert sofort über alle nutzer-skopierten
+ Tabellen via{" "}
+
+ User.delete
+ {" "}
+ +{" "}
+
+ onDelete: Cascade
+
+ ; Backups laufen innerhalb des 30-Tage-Fensters aus.
+
+
+
+ Recht auf Einschränkung (Art. 18)
+ {" "}
+ — administrative Sperre per Datenschutz-Anfrage (siehe
+ Abschnitt 11).
+
+
+
+ Recht auf Datenübertragbarkeit (Art. 20)
+ {" "}
+ — der JSON-Export unter{" "}
+ Einstellungen → Daten & Export liefert den
+ vollständigen Datensatz in maschinenlesbarem Format.
+
+
+
+ Widerspruch und automatisierte Entscheidungen
+ (Art. 21–22)
+ {" "}
+ — der KI-Coach trifft keine automatisierten Entscheid-
+ ungen im Sinne von Art. 22 DSGVO. Er erzeugt Texte zum
+ Nachlesen; ohne ausdrückliche Bestätigung wird keine
+ Aktion ausgeführt. Siehe Abschnitt 7 zur Medizinpro-
+ dukte-Grenze.
+
+
+
+ Beschwerderecht
+ {" "}
+ — beim Bundesbeauftragten für den Datenschutz und die
+ Informationsfreiheit (BfDI) oder bei der für den
+ gewöhnlichen Aufenthaltsort der betroffenen Person
+ zuständigen Aufsichtsbehörde.
+
+
+ }
+ bodyEn={
+
+ -
+
+ Right of access (Art. 15)
+ {" "}
+ — every stored value is reachable through the in-app
+ history surfaces. A consolidated JSON export is offered
+ under Settings → Data & export.
+
+ -
+
+ Right to rectification (Art. 16)
+ {" "}
+ — every record carries an in-app edit and delete
+ action.
+
+ -
+
+ Right to erasure (Art. 17)
+ {" "}
+ — Settings → Data → Delete account. The action
+ cascades immediately through every user-scoped table
+ via{" "}
+
+ User.delete
+ {" "}
+ +{" "}
+
+ onDelete: Cascade
+
+ ; backups age out within the 30-day window.
+
+ -
+
+ Right to restriction of processing (Art. 18)
+ {" "}
+ — request an administrative suspension via the contact
+ channel in section 11.
+
+ -
+
+ Right to data portability (Art. 20)
+ {" "}
+ — the JSON export under{" "}
+ Settings → Data & export returns the full
+ record set in a structured, machine-readable format.
+
+ -
+
+ Right to object / automated decision-making (Art. 21-
+ 22)
+ {" "}
+ — the AI Coach does not make automated decisions in the
+ Art. 22 sense. It generates written suggestions for the
+ user to read; no action is taken without explicit
+ confirmation. See section 7 for the medical-device
+ boundary.
+
+ -
+
+ Right to lodge a complaint
+ {" "}
+ — with the Federal Commissioner for Data Protection and
+ Freedom of Information (BfDI) for the German federal
+ level, or with the data-protection authority of the
+ user's habitual residence.
+
+
+ }
+ />
-
- HealthLog is not a medical device within the
- meaning of EU Regulation 2017/745 (MDR). The application records
- and displays observations the user has entered; it does not
- diagnose, treat, prescribe, or monitor a specific medical
- condition.
-
-
- The AI Coach surface is constrained by two explicit ground rules
- in its system prompt: it does not recommend GLP-1 doses (GROUND
- RULE 9), and it does not produce drug-level estimates (GROUND
- RULE 15). The GLP-1 Research Mode chart is a display-only
- visualisation gated behind a versioned acknowledgment that cites
- the MDR boundary to the user before unlocking. None of these
- surfaces issue clinical recommendations.
-
-
- For medical advice the user must consult a licensed clinician.
- HealthLog is intended to support that conversation by surfacing
- self-tracked data — not to replace it.
-
-
+ numberLabel="7"
+ titleDe="Medizinprodukte-Grenze (EU-MDR 2017/745, MDCG 2021-24)"
+ titleEn="Medical-device boundary (EU MDR 2017/745, MDCG 2021-24)"
+ bodyDe={
+ <>
+
+ HealthLog ist kein Medizinprodukt im
+ Sinne der EU-Verordnung 2017/745 (MDR). Die Anwendung
+ erfasst und visualisiert Beobachtungen, die der Nutzer
+ selbst eingegeben hat; sie diagnostiziert, behandelt,
+ verordnet oder überwacht keine spezifische medizinische
+ Erkrankung.
+
+
+ Die KI-Coach-Oberfläche ist durch zwei ausdrückliche
+ Grundregeln im System-Prompt eingegrenzt: sie empfiehlt
+ keine GLP-1-Dosen (GROUND RULE 9) und erzeugt keine
+ wirkstoff-bezogenen Schätzungen (GROUND RULE 15). Der
+ GLP-1-Research-Mode ist eine reine Visualisierung, die
+ erst nach einer versionierten Bestätigung freigeschaltet
+ wird, die dem Nutzer die MDR-Grenze ausdrücklich nennt.
+ Keine dieser Oberflächen gibt klinische Empfehlungen aus.
+
+
+ Für medizinische Beratung muss eine approbierte ärztliche
+ Fachkraft konsultiert werden. HealthLog soll diese
+ Beratung unterstützen, indem es selbst erfasste Daten
+ aufbereitet — nicht ersetzen.
+
+ >
+ }
+ bodyEn={
+ <>
+
+ HealthLog is not a medical device{" "}
+ within the meaning of EU Regulation 2017/745 (MDR). The
+ application records and displays observations the user
+ has entered; it does not diagnose, treat, prescribe, or
+ monitor a specific medical condition.
+
+
+ The AI Coach surface is constrained by two explicit
+ ground rules in its system prompt: it does not
+ recommend GLP-1 doses (GROUND RULE 9), and it does not
+ produce drug-level estimates (GROUND RULE 15). The GLP-1
+ Research Mode chart is a display-only visualisation
+ gated behind a versioned acknowledgment that cites the
+ MDR boundary to the user before unlocking. None of
+ these surfaces issue clinical recommendations.
+
+
+ For medical advice the user must consult a licensed
+ clinician. HealthLog is intended to support that
+ conversation by surfacing self-tracked data — not to
+ replace it.
+
+ >
+ }
+ />
-
- The iOS application's Privacy Nutrition Labels in App Store
- Connect map to the following categories:
-
-
- -
-
- Health & Fitness
- {" "}
- — linked to the user; used for app functionality.
-
- -
-
- Sensitive Info
- {" "}
- (blood pressure, glucose, medications) — linked to the user; used
- for app functionality.
-
- -
- Contact Info{" "}
- (email address) — linked to the user; used for app functionality
- and account management.
-
- -
- User Content{" "}
- (notes attached to measurements, mood notes, bug-report text) —
- linked to the user; used for app functionality.
-
- -
- Identifiers{" "}
- (device identifier, user identifier) — linked to the user; used
- for app functionality.
-
- -
- Diagnostics{" "}
- — not collected.
-
- -
- Usage Data{" "}
- — not collected.
-
- -
- Location{" "}
- — not collected, except for an optional GPS route the user
- attaches manually to a workout.
-
- -
-
- Browsing History
- {" "}
- — not collected.
-
- -
-
- Search History
- {" "}
- — not collected.
-
- -
- Other Data{" "}
- — not collected.
-
-
-
+ numberLabel="8"
+ titleDe="Apple-App-Store-Datenschutzkategorien"
+ titleEn="Apple App Store privacy categories"
+ bodyDe={
+ <>
+
+ Die Privacy-Nutrition-Labels der iOS-Anwendung in App
+ Store Connect ordnen sich folgenden Kategorien zu (jeweils{" "}
+ linked to the user, ausschließlich zur App-
+ Funktion verwendet):
+
+
+ -
+
+ Gesundheit & Fitness
+
+ .
+
+ -
+
+ Sensible Informationen
+ {" "}
+ (Blutdruck, Blutzucker, Medikamente).
+
+ -
+
+ Kontakt-Informationen
+ {" "}
+ (E-Mail-Adresse) — Konto-Verwaltung.
+
+ -
+
+ Nutzer-Inhalte
+ {" "}
+ (Notizen zu Messungen, Stimmungsnotizen, Bug-Reports).
+
+ -
+
+ Kennungen
+ {" "}
+ (Geräte- und Nutzer-Kennung).
+
+ -
+
+ Diagnose, Nutzung, Browsing, Suche, Andere
+ {" "}
+ — nicht erhoben.
+
+ -
+
+ Standort
+ {" "}
+ — nicht erhoben, außer bei einer optional vom Nutzer
+ angehängten GPS-Workout-Route.
+
+
+ >
+ }
+ bodyEn={
+ <>
+
+ The iOS application's Privacy Nutrition Labels in App
+ Store Connect map to the following categories (each
+ linked to the user, used only for app
+ functionality):
+
+
+ -
+
+ Health & Fitness
+
+ .
+
+ -
+
+ Sensitive Info
+ {" "}
+ (blood pressure, glucose, medications).
+
+ -
+
+ Contact Info
+ {" "}
+ (email address) — account management.
+
+ -
+
+ User Content
+ {" "}
+ (notes attached to measurements, mood notes, bug-
+ report text).
+
+ -
+
+ Identifiers
+ {" "}
+ (device identifier, user identifier).
+
+ -
+
+ Diagnostics, Usage Data, Browsing History, Search
+ History, Other Data
+ {" "}
+ — not collected.
+
+ -
+
+ Location
+ {" "}
+ — not collected, except for an optional GPS route the
+ user attaches manually to a workout.
+
+
+ >
+ }
+ />
-
-
- HealthLog is not directed at children under the age of 16. The
- application should not be used by anyone under 16 without
- verifiable parental supervision. The operator does not knowingly
- collect personal data from children under 16; if such data is
- discovered, it will be deleted on detection.
-
-
+
+ HealthLog richtet sich nicht an Kinder unter 16 Jahren. Die
+ Anwendung sollte nicht ohne nachweisbare elterliche Aufsicht
+ von Personen unter 16 Jahren verwendet werden. Der Betreiber
+ erhebt wissentlich keine personenbezogenen Daten von Kindern
+ unter 16 Jahren; sollte dies auffallen, werden die Daten
+ umgehend gelöscht.
+
+ }
+ bodyEn={
+
+ HealthLog is not directed at children under the age of 16.
+ The application should not be used by anyone under 16
+ without verifiable parental supervision. The operator
+ does not knowingly collect personal data from children
+ under 16; if such data is discovered, it will be deleted
+ on detection.
+
+ }
+ />
-
-
- This document is version-stamped at the top. Material changes will
- be summarised in the in-app release notes and on the open-source
- changelog. The published policy version is bound to the
- application release version that introduced it.
-
-
+
+ Diese Erklärung trägt oben einen Versionsstempel. Materielle
+ Änderungen werden in den In-App-Versionshinweisen und im
+ Open-Source-Changelog zusammengefasst. Die veröffentlichte
+ Policy-Version ist an die Anwendungsversion gebunden, mit
+ der sie eingeführt wurde.
+
+ }
+ bodyEn={
+
+ This document is version-stamped at the top. Material
+ changes will be summarised in the in-app release notes
+ and on the open-source changelog. The published policy
+ version is bound to the application release version that
+ introduced it.
+
+ }
+ />
-
+