From b3c71f37e8545cb76e15e9a3d6ff5fe7267feb90 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Jul 2026 09:03:48 +0000 Subject: [PATCH 01/10] Initial plan From 3619c6cbef8b5c819900aa761b32672d545b1a5d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Jul 2026 09:06:46 +0000 Subject: [PATCH 02/10] docs: add hosted privacy policy page --- docs/AppStoreMetadata.md | 5 +- docs/BuildAndDeploy.md | 2 +- privacy/index.html | 175 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 privacy/index.html diff --git a/docs/AppStoreMetadata.md b/docs/AppStoreMetadata.md index 1037bb4..86c4cfc 100644 --- a/docs/AppStoreMetadata.md +++ b/docs/AppStoreMetadata.md @@ -37,8 +37,9 @@ Your data remains in Apple Health. LogWeight does not run its own weight databas ## Privacy URL -- Canonical policy source: `Docs/Privacy.md` -- App Store Connect requires a public HTTPS URL (host this text before submission). +- Canonical policy source: `docs/Privacy.md` +- Static page for hosting: `privacy/index.html` +- App Store Connect requires a public HTTPS URL (publish this page before submission). ## Support URL diff --git a/docs/BuildAndDeploy.md b/docs/BuildAndDeploy.md index 47e1409..58793cf 100644 --- a/docs/BuildAndDeploy.md +++ b/docs/BuildAndDeploy.md @@ -120,7 +120,7 @@ For a **major** semver bump, use one of: 3. When ready for a new user-facing version, merge the **Release PR** from release-please on `main` (updates `MARKETING_VERSION` and `CHANGELOG.md`; creates `vX.Y.Z` on GitHub). 4. Pull `main`, run `xcodegen generate`, archive in Xcode (_Product → Archive_). 5. Upload to App Store Connect. -6. Add a privacy policy URL in App Store Connect — see `docs/Privacy.md` for the canonical statement. +6. Add a privacy policy URL in App Store Connect — publish `privacy/index.html` as a public HTTPS page, using `docs/Privacy.md` as the canonical statement. 7. Fill App Store listing fields from `docs/AppStoreMetadata.md`. 8. Use localized listing variants from `docs/AppStoreMetadata.localized.md`. diff --git a/privacy/index.html b/privacy/index.html new file mode 100644 index 0000000..5632f32 --- /dev/null +++ b/privacy/index.html @@ -0,0 +1,175 @@ + + + + + + LogWeight Privacy Policy + + + +
+
+

Privacy

+

Canonical source: docs/Privacy.md

+

LogWeight handles body weight, which is GDPR Art. 9 special-category personal data. The privacy posture is documented here so reviewers, auditors, and future contributors share the same understanding.

+ +

Data flow

+
    +
  1. The user enters a weight in the app.
  2. +
  3. The value is held in memory (@State) only for the lifetime of the entry surface.
  4. +
  5. On Save, the value is written to HKHealthStore via HKQuantityTypeIdentifier.bodyMass.
  6. +
  7. The local copy is discarded; subsequent reads go back through HealthKit.
  8. +
+ +

The app:

+ + +

Cross-device synchronisation, when the user has more than one device, is handled by Apple Health itself.

+ +

Lawful basis

+

The lawful basis for processing under GDPR is explicit consent, gathered through the standard HealthKit authorisation sheet. The user can revoke consent at any time in Settings → Health → Data Access & Devices → LogWeight. Once revoked, future writes will fail and the app surfaces a calm prompt to re-enable.

+ +

Data subject rights

+

Because the app holds no copy of the user's data:

+ + +

Apple Privacy Manifest

+

App/iOS/Resources/PrivacyInfo.xcprivacy declares:

+ + +

On-screen redaction

+

The app implements two layers of on-screen redaction:

+
    +
  1. .privacySensitive() — the SwiftUI modifier that asks the OS to redact content in system-generated screenshots (app switcher, Siri suggestions, Lock-Screen previews).
  2. +
  3. PrivacyRedactionModifier — a custom modifier that overlays an opaque view when the app is backgrounded OR when UIScreen.main.isCaptured reports an active screen recording.
  4. +
+ +

Known limitations of UIScreen.isCaptured

+

UIScreen.isCaptured is documented by Apple to not fire reliably in every capture scenario. We acknowledge:

+ + +

These are Apple-framework limitations, not defects in LogWeight. The .privacySensitive() modifier handles every system-generated capture scenario regardless of these gaps.

+ +

Data export and deletion (operational)

+

If a user requests their data:

+ + +

If a user requests deletion:

+ + +

Logging

+

SecurityLog (in LogWeightCore) is the only logging facade. It exposes event(_: StaticString) and error(_: StaticString, code: Int) — and nothing else. There is no API path through which a weight value, a user identifier, a sample identifier, or a date can be logged.

+
+
+ + From aee856ee045a71f6678f35f0741a6f2d9aa214d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Jul 2026 09:07:19 +0000 Subject: [PATCH 03/10] docs: clarify privacy page hosting --- docs/AppStoreMetadata.md | 2 +- docs/BuildAndDeploy.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/AppStoreMetadata.md b/docs/AppStoreMetadata.md index 86c4cfc..e461dc0 100644 --- a/docs/AppStoreMetadata.md +++ b/docs/AppStoreMetadata.md @@ -38,7 +38,7 @@ Your data remains in Apple Health. LogWeight does not run its own weight databas ## Privacy URL - Canonical policy source: `docs/Privacy.md` -- Static page for hosting: `privacy/index.html` +- Static page for hosting: `privacy/index.html` (serve it from Vercel or another static HTTPS host, ideally at `/privacy/`) - App Store Connect requires a public HTTPS URL (publish this page before submission). ## Support URL diff --git a/docs/BuildAndDeploy.md b/docs/BuildAndDeploy.md index 58793cf..183729e 100644 --- a/docs/BuildAndDeploy.md +++ b/docs/BuildAndDeploy.md @@ -120,7 +120,7 @@ For a **major** semver bump, use one of: 3. When ready for a new user-facing version, merge the **Release PR** from release-please on `main` (updates `MARKETING_VERSION` and `CHANGELOG.md`; creates `vX.Y.Z` on GitHub). 4. Pull `main`, run `xcodegen generate`, archive in Xcode (_Product → Archive_). 5. Upload to App Store Connect. -6. Add a privacy policy URL in App Store Connect — publish `privacy/index.html` as a public HTTPS page, using `docs/Privacy.md` as the canonical statement. +6. Add a privacy policy URL in App Store Connect — publish `privacy/index.html` on Vercel (or another static HTTPS host) as `/privacy/`, using `docs/Privacy.md` as the canonical statement. 7. Fill App Store listing fields from `docs/AppStoreMetadata.md`. 8. Use localized listing variants from `docs/AppStoreMetadata.localized.md`. From 45a233771fb90f97671c86e01028d8ee36cc0905 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 10 Jul 2026 09:07:47 +0000 Subject: [PATCH 04/10] docs: note privacy page sync date --- privacy/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privacy/index.html b/privacy/index.html index 5632f32..8abd064 100644 --- a/privacy/index.html +++ b/privacy/index.html @@ -94,7 +94,7 @@

Privacy

-

Canonical source: docs/Privacy.md

+

Last updated: 2026-07-10 · Canonical source: docs/Privacy.md

LogWeight handles body weight, which is GDPR Art. 9 special-category personal data. The privacy posture is documented here so reviewers, auditors, and future contributors share the same understanding.

Data flow

From a06c95aa3dd72f467682b93af3ea3031afc3c3ad Mon Sep 17 00:00:00 2001 From: Sebastian Engel Date: Tue, 21 Jul 2026 20:58:12 +0200 Subject: [PATCH 05/10] feat(privacy): add privacy policy webpage with detailed data handling information --- {privacy => support/privacy}/index.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {privacy => support/privacy}/index.html (100%) diff --git a/privacy/index.html b/support/privacy/index.html similarity index 100% rename from privacy/index.html rename to support/privacy/index.html From 1fd737bf114f6d78c2f8b11e6793a8691d76a79e Mon Sep 17 00:00:00 2001 From: Sebastian Engel Date: Tue, 21 Jul 2026 21:02:41 +0200 Subject: [PATCH 06/10] feat(support-pages): Add initial CSS styles for light and dark themes, including layout and typography --- docs/AppStoreMetadata.md | 3 +- support/assets/logo.png | Bin 0 -> 14952 bytes support/assets/style.css | 256 ++++++++++++++++++++++++++++++++ support/index.html | 165 +++++++++----------- support/instructions/index.html | 49 +++--- support/privacy/index.html | 105 +++---------- 6 files changed, 372 insertions(+), 206 deletions(-) create mode 100644 support/assets/logo.png create mode 100644 support/assets/style.css diff --git a/docs/AppStoreMetadata.md b/docs/AppStoreMetadata.md index 5480bf0..9bd16a6 100644 --- a/docs/AppStoreMetadata.md +++ b/docs/AppStoreMetadata.md @@ -38,7 +38,8 @@ Your data remains in Apple Health. LogWeight does not run its own weight databas ## Privacy URL - Canonical policy source: `docs/Privacy.md` -- Static page for hosting: `privacy/index.html` (serve it from Vercel or another static HTTPS host, ideally at `/privacy/`) +- Static page for hosting: `support/privacy/index.html`, served at `https://juuronina.de/LogWeight/support/privacy/` +- Linked from the support page (no external GitHub link) — keep in sync with `docs/Privacy.md`. - App Store Connect requires a public HTTPS URL (publish this page before submission). ## Support URL diff --git a/support/assets/logo.png b/support/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20b4dc2bb2d95edff9c958d52125e5d5ec3a1bc2 GIT binary patch literal 14952 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 T`ltVHdA?KDQfgAL`SgDP+ENVH literal 0 HcmV?d00001 diff --git a/support/assets/style.css b/support/assets/style.css new file mode 100644 index 0000000..c1db217 --- /dev/null +++ b/support/assets/style.css @@ -0,0 +1,256 @@ +:root { + color-scheme: light dark; + --teal: #275561; + --teal-strong: #1d424c; + --header-grad-a: #1e434c; + --header-grad-b: #2f6672; + --white-glyph: #f5f5f5; + --paper: #faf9f6; + --surface: #ffffff; + --ink: #1b1f1e; + --muted: #5c6663; + --accent: var(--teal); + --border: rgba(27, 31, 30, 0.14); + --font-body: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", sans-serif; + --font-mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; +} + +@media (prefers-color-scheme: dark) { + :root { + --header-grad-a: #234c56; + --header-grad-b: #3c7986; + --paper: #0e2126; + --surface: #163138; + --ink: #f1f4f3; + --muted: #9fb4b1; + --accent: #7fb8c4; + --border: rgba(255, 255, 255, 0.14); + } +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--paper); + color: var(--ink); + font: 16px/1.6 var(--font-body); + -webkit-font-smoothing: antialiased; +} + +a { + color: var(--accent); + text-decoration-color: var(--border); + text-underline-offset: 2px; +} + +a:hover { + text-decoration-thickness: 2px; +} + +a:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 3px; + border-radius: 2px; +} + +/* letterhead bar */ +.site-header { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + gap: 0.6rem 1.25rem; + max-width: 44rem; + margin: 1.5rem auto 0; + padding: 0.85rem 1.1rem; + background: linear-gradient(135deg, var(--header-grad-a), var(--header-grad-b)); + border-radius: 10px; +} + +.wordmark { + display: inline-flex; + align-items: center; + font-size: 1.05rem; + font-weight: 700; + letter-spacing: -0.01em; + color: var(--white-glyph); + text-decoration: none; +} + +.mark { + display: inline-block; + width: 26px; + height: 26px; + margin-right: 9px; + border-radius: 7px; + border: 1px solid rgba(245, 245, 245, 0.2); + vertical-align: middle; +} + +.site-nav { + display: flex; + gap: 1.1rem; + font-size: 0.88rem; +} + +.site-nav a { + color: rgba(245, 245, 245, 0.72); + text-decoration: none; + padding-bottom: 2px; + border-bottom: 1px solid transparent; +} + +.site-nav a:hover { + color: var(--white-glyph); +} + +.site-nav a.active { + color: var(--white-glyph); + border-bottom-color: var(--white-glyph); +} + +.site-nav a:focus-visible { + outline-color: var(--white-glyph); +} + +main { + max-width: 44rem; + margin: 0 auto; + padding: 2rem 1.25rem 4rem; +} + +.eyebrow { + display: block; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--accent); + margin-bottom: 0.5rem; +} + +h1 { + font-size: 1.9rem; + font-weight: 700; + line-height: 1.2; + letter-spacing: -0.01em; + margin: 0 0 0.75rem; +} + +h2 { + font-size: 1.15rem; + font-weight: 700; + line-height: 1.3; + margin: 2rem 0 0.75rem; + padding-top: 1.25rem; + border-top: 1px solid var(--border); +} + +.card h2 { + border-top: none; + padding-top: 0; + margin-top: 0; +} + +h3 { + font-size: 0.98rem; + font-weight: 700; + margin: 1.5rem 0 0.5rem; +} + +p, +li { + margin: 0.75rem 0; + color: var(--ink); +} + +.updated, +.intro { + color: var(--muted); +} + +.updated { + font-size: 0.9rem; +} + +ul, +ol { + padding-left: 1.3rem; +} + +li::marker { + color: var(--muted); +} + +code { + font-family: var(--font-mono); + font-size: 0.9em; + background: var(--border); + padding: 0.1em 0.35em; + border-radius: 4px; +} + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 1.5rem 1.5rem 1.75rem; + margin: 1.5rem 0; +} + +.card-head { + display: flex; + align-items: center; + gap: 0.6rem; + margin-bottom: 0.25rem; +} + +.card-head h2 { + margin: 0; +} + +.chip { + font-family: var(--font-mono); + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.04em; + color: var(--white-glyph); + background: var(--teal); + border-radius: 4px; + padding: 0.15rem 0.4rem; +} + +article.doc { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 1.75rem 1.75rem 2rem; +} + +.page-footer { + max-width: 44rem; + margin: 0 auto; + padding: 0 1.25rem 3rem; + color: var(--muted); + font-size: 0.85rem; +} + +@media (max-width: 30rem) { + article.doc, + .card { + padding: 1.25rem; + } + + h1 { + font-size: 1.6rem; + } +} + +@media (prefers-reduced-motion: reduce) { + * { + transition: none !important; + } +} diff --git a/support/index.html b/support/index.html index c512798..2a979a6 100644 --- a/support/index.html +++ b/support/index.html @@ -4,102 +4,81 @@ LogWeight Support | Hilfe - + -

LogWeight Support

-

Deutsch / English

+ + +
+ Support +

LogWeight Support

+

Deutsch / English — choose your language below.

+ +
+
DE

Deutsch

+

+ Du brauchst Hilfe mit LogWeight? Kontaktiere den Support direkt per + E-Mail: + support@juuronina.de +

+ +
-
-

Deutsch

-

- Du brauchst Hilfe mit LogWeight? Kontaktiere den Support direkt per - E-Mail: - support@juuronina.de -

- -
+
+
EN

English

+

+ Need help with LogWeight? Contact support directly by email: + support@juuronina.de +

+ +
+
-
-

English

-

- Need help with LogWeight? Contact support directly by email: - support@juuronina.de -

- -
+ diff --git a/support/instructions/index.html b/support/instructions/index.html index d98a9de..2bdf344 100644 --- a/support/instructions/index.html +++ b/support/instructions/index.html @@ -4,31 +4,32 @@ LogWeight Support Instructions - + -

LogWeight Support Instructions

-
    -
  1. Open the Health app on your device.
  2. -
  3. For export, tap your profile photo, then tap Export All Health Data (this exports all Health data, not only LogWeight entries).
  4. -
  5. For deletion, delete values in Health and revoke LogWeight access in Settings → Health.
  6. -
-

Return to LogWeight Support

+ + +
+ Instructions +

Export & Delete Your Data

+

LogWeight keeps no copy of your data — everything lives in Apple Health.

+ +
+
    +
  1. Open the Health app on your device.
  2. +
  3. For export, tap your profile photo, then tap Export All Health Data (this exports all Health data, not only LogWeight entries).
  4. +
  5. For deletion, delete values in Health and revoke LogWeight access in Settings → Health.
  6. +
+
+
+ + diff --git a/support/privacy/index.html b/support/privacy/index.html index 8abd064..11a6535 100644 --- a/support/privacy/index.html +++ b/support/privacy/index.html @@ -4,97 +4,24 @@ LogWeight Privacy Policy - + + +
-
-

Privacy

-

Last updated: 2026-07-10 · Canonical source: docs/Privacy.md

+ Privacy policy +

Privacy

+

Last updated: 2026-07-10 · Canonical source: docs/Privacy.md

+ +

LogWeight handles body weight, which is GDPR Art. 9 special-category personal data. The privacy posture is documented here so reviewers, auditors, and future contributors share the same understanding.

Data flow

@@ -171,5 +98,7 @@

Logging

SecurityLog (in LogWeightCore) is the only logging facade. It exposes event(_: StaticString) and error(_: StaticString, code: Int) — and nothing else. There is no API path through which a weight value, a user identifier, a sample identifier, or a date can be logged.

+ + From f07db75674ee9c5f2d25c72192882eded4a1a2fe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Jul 2026 19:47:23 +0000 Subject: [PATCH 07/10] fix(support-pages): set support page root language --- support/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/index.html b/support/index.html index 48361aa..c3919ba 100644 --- a/support/index.html +++ b/support/index.html @@ -1,5 +1,5 @@ - + From 219061a33d542619582945bd837b73d94b897339 Mon Sep 17 00:00:00 2001 From: Sebastian Engel Date: Thu, 17 Sep 2026 15:11:53 +0200 Subject: [PATCH 08/10] chore: Update privacy policy URL path in deployment instructions Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- docs/BuildAndDeploy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BuildAndDeploy.md b/docs/BuildAndDeploy.md index f9d308f..572c602 100644 --- a/docs/BuildAndDeploy.md +++ b/docs/BuildAndDeploy.md @@ -120,7 +120,7 @@ For a **major** semver bump, use one of: 3. When ready for a new user-facing version, merge the **Release PR** from release-please on `main` (updates `MARKETING_VERSION` and `CHANGELOG.md`; creates `vX.Y.Z` on GitHub). 4. Pull `main`, run `xcodegen generate`, archive in Xcode (_Product → Archive_). 5. Upload to App Store Connect. -6. Add a privacy policy URL in App Store Connect — publish `privacy/index.html` on Vercel (or another static HTTPS host) as `/privacy/`, using `docs/Privacy.md` as the canonical statement. +6. Add a privacy policy URL in App Store Connect — publish `support/privacy/index.html` on Vercel (or another static HTTPS host) as `/support/privacy/`, using `docs/Privacy.md` as the canonical statement. 7. Fill App Store listing fields from `docs/AppStoreMetadata.md`. 8. Use localized listing variants from `docs/AppStoreMetadata.localized.md`. 9. Walk through `docs/AppStoreReleaseChecklist.md` before pressing Submit for Review. From 1f4fcedad26d4d682480c2a11bb6f28c7fbd1c5e Mon Sep 17 00:00:00 2001 From: Sebastian Engel Date: Thu, 17 Sep 2026 15:12:10 +0200 Subject: [PATCH 09/10] chore: Change HTML language attribute from 'de' to 'en' Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- support/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/index.html b/support/index.html index c3919ba..48361aa 100644 --- a/support/index.html +++ b/support/index.html @@ -1,5 +1,5 @@ - + From b07b4499029995f4006568d3f522048990e5d4e1 Mon Sep 17 00:00:00 2001 From: Sebastian Engel Date: Thu, 17 Sep 2026 16:30:41 +0200 Subject: [PATCH 10/10] docs(BuildAndDeploy): align privacy URL step with actual hosting location Co-Authored-By: Claude Sonnet 5 --- docs/BuildAndDeploy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BuildAndDeploy.md b/docs/BuildAndDeploy.md index 572c602..4e28db4 100644 --- a/docs/BuildAndDeploy.md +++ b/docs/BuildAndDeploy.md @@ -120,7 +120,7 @@ For a **major** semver bump, use one of: 3. When ready for a new user-facing version, merge the **Release PR** from release-please on `main` (updates `MARKETING_VERSION` and `CHANGELOG.md`; creates `vX.Y.Z` on GitHub). 4. Pull `main`, run `xcodegen generate`, archive in Xcode (_Product → Archive_). 5. Upload to App Store Connect. -6. Add a privacy policy URL in App Store Connect — publish `support/privacy/index.html` on Vercel (or another static HTTPS host) as `/support/privacy/`, using `docs/Privacy.md` as the canonical statement. +6. Add a privacy policy URL in App Store Connect — `support/privacy/index.html`, published at `https://juuronina.de/LogWeight/support/privacy/` (see `docs/AppStoreMetadata.md`), using `docs/Privacy.md` as the canonical statement. 7. Fill App Store listing fields from `docs/AppStoreMetadata.md`. 8. Use localized listing variants from `docs/AppStoreMetadata.localized.md`. 9. Walk through `docs/AppStoreReleaseChecklist.md` before pressing Submit for Review.