From 4758ce8d8721fe09be09adb58ce1452faa6a1eb5 Mon Sep 17 00:00:00 2001 From: neodk2004 Date: Mon, 7 Sep 2026 18:57:49 +0200 Subject: [PATCH] feat: add Child Safety Standards page for Google Play compliance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New public page at /kinderschutz — required by Google Play's Child Safety Standards policy for apps with user-generated content/social features (https://support.google.com/googleplay/android-developer/answer/14747720). Registered as public + maintenance-exempt in proxy.ts, matching the existing /impressum, /datenschutz, /nutzungsbedingungen pattern. Content covers only mechanisms that actually exist in this codebase: in-app reporting (ReportSheet + admin moderation review), a named responsible contact (same identity as /impressum), and the German/EU legal framework (StGB §184b/c, DSA, JuSchG) for law-enforcement cooperation on confirmed CSAE content — no invented automated- detection claims. Cross-linked from the other legal pages' footers, the web /pets footer, and the mobile app's My Pets legal-links section (new pets.legalChildSafety i18n key, DE/EN). --- mobile/app/(app)/(tabs)/pets.tsx | 1 + mobile/src/i18n/locales/de.json | 1 + mobile/src/i18n/locales/en.json | 1 + src/app/(app)/pets/page.tsx | 2 + src/app/datenschutz/page.tsx | 3 + src/app/impressum/page.tsx | 3 + src/app/kinderschutz/page.tsx | 150 +++++++++++++++++++++++++++ src/app/nutzungsbedingungen/page.tsx | 3 + src/proxy.ts | 3 +- 9 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/app/kinderschutz/page.tsx diff --git a/mobile/app/(app)/(tabs)/pets.tsx b/mobile/app/(app)/(tabs)/pets.tsx index d63d7ed..8b43286 100644 --- a/mobile/app/(app)/(tabs)/pets.tsx +++ b/mobile/app/(app)/(tabs)/pets.tsx @@ -213,6 +213,7 @@ function LegalSection() { { label: t("pets.legalImpressum"), path: "impressum" }, { label: t("pets.legalPrivacy"), path: "datenschutz" }, { label: t("pets.legalTerms"), path: "nutzungsbedingungen" }, + { label: t("pets.legalChildSafety"), path: "kinderschutz" }, ]; return ( diff --git a/mobile/src/i18n/locales/de.json b/mobile/src/i18n/locales/de.json index c14491a..9669db4 100644 --- a/mobile/src/i18n/locales/de.json +++ b/mobile/src/i18n/locales/de.json @@ -200,6 +200,7 @@ "legalImpressum": "Impressum", "legalPrivacy": "Datenschutzerklärung", "legalTerms": "Nutzungsbedingungen", + "legalChildSafety": "Kinderschutz", "versionLabel": "Version {{version}}" }, "auth": { diff --git a/mobile/src/i18n/locales/en.json b/mobile/src/i18n/locales/en.json index 2c58bb7..5f3e087 100644 --- a/mobile/src/i18n/locales/en.json +++ b/mobile/src/i18n/locales/en.json @@ -200,6 +200,7 @@ "legalImpressum": "Legal Notice", "legalPrivacy": "Privacy Policy", "legalTerms": "Terms of Service", + "legalChildSafety": "Child Safety Standards", "versionLabel": "Version {{version}}" }, "auth": { diff --git a/src/app/(app)/pets/page.tsx b/src/app/(app)/pets/page.tsx index e3885a9..6167c4e 100644 --- a/src/app/(app)/pets/page.tsx +++ b/src/app/(app)/pets/page.tsx @@ -45,6 +45,8 @@ export default async function PetsPage({ AGB + Kinderschutz + p.name)} defaultOpen={deleteAccount === "1"} diff --git a/src/app/datenschutz/page.tsx b/src/app/datenschutz/page.tsx index ccb4ad5..df5093c 100644 --- a/src/app/datenschutz/page.tsx +++ b/src/app/datenschutz/page.tsx @@ -247,6 +247,9 @@ export default function DatenschutzPage() { AGB + + Kinderschutz + diff --git a/src/app/impressum/page.tsx b/src/app/impressum/page.tsx index 5091dce..08abbdf 100644 --- a/src/app/impressum/page.tsx +++ b/src/app/impressum/page.tsx @@ -108,6 +108,9 @@ export default function ImpressumPage() { AGB + + Kinderschutz + diff --git a/src/app/kinderschutz/page.tsx b/src/app/kinderschutz/page.tsx new file mode 100644 index 0000000..b9be23a --- /dev/null +++ b/src/app/kinderschutz/page.tsx @@ -0,0 +1,150 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { LegalLayout, LegalSection } from "@/components/legal/LegalLayout"; + +function decode(b64: string): string { + try { + return atob(b64); + } catch { + return ""; + } +} + +// Same operator identity as /impressum — base64-obfuscated against +// scraper harvesting, not against a determined reader. +const CONTACT_NAME = "RGFuaWVsIEJhcmFj"; +const CONTACT_EMAIL = "d2VibWFzdGVyQHBhd2ZlZWQub3Jn"; + +/** + * Google Play "Child Safety Standards" policy page — required for apps + * with user-generated content / social features: + * https://support.google.com/googleplay/android-developer/answer/14747720 + * + * Publicly accessible, no login (see proxy.ts's isPublicRoute / + * MAINTENANCE_EXEMPT_PATHS), and the URL this page lives at must be + * entered in Play Console → App content → Child Safety Standards. + * + * Describes only mechanisms that actually exist in this codebase (user + * reports via ReportSheet + admin ModerationLog review) — no invented + * automated-detection claims (no PhotoDNA/hash-matching is implemented). + */ +export default function KinderschutzPage() { + const [revealed, setRevealed] = useState(false); + useEffect(() => setRevealed(true), []); + + const contactName = revealed ? decode(CONTACT_NAME) : "––"; + const contactEmail = revealed ? decode(CONTACT_EMAIL) : "––"; + + return ( + + +

+ PawFeed toleriert keine Inhalte, die Kinder sexuell ausbeuten oder + missbrauchen (Child Sexual Abuse and Exploitation, „CSAE"), und + keine Inhalte oder Verhaltensweisen, die Kinder auf andere Weise + gefährden. Das gilt für Beiträge, Storys, Profilbilder, + Kommentare und private Nachrichten gleichermaßen. +

+
+ + +

+ Jeder Beitrag und jedes Profil lässt sich direkt in der App über + die Melde-Funktion (⋮-Menü) an unser Moderationsteam melden — + unter anderem mit den Gründen „Unangemessene Inhalte" und + „Belästigung oder Mobbing". Meldungen sind sofort nach dem + Absenden für die Moderation sichtbar, unabhängig davon, ob die + gemeldete Person das mitbekommt. +

+

+ Vermutest du sexualisierte Gewalt gegen Kinder oder eine akute + Gefährdung, melde den Inhalt zusätzlich direkt per E-Mail an{" "} + {revealed ? ( + + {contactEmail} + + ) : ( + "––" + )}{" "} + — so erreichst du uns auch, falls die In-App-Meldung aus + technischen Gründen nicht möglich ist. +

+
+ + +

+ Meldungen werden von unserem Moderationsteam geprüft und in einem + Prüfprotokoll dokumentiert. Bestätigt sich ein Verstoß, entfernen + wir den Inhalt umgehend und sperren das verantwortliche + Tier-/Nutzerkonto dauerhaft. Bei Verdacht auf strafbare Inhalte + nach § 184b, § 184c StGB (Kinderpornografische bzw. + jugendpornografische Inhalte) sichern wir die relevanten Daten im + gesetzlich zulässigen Rahmen für Ermittlungsbehörden, statt sie + eigenständig weiterzuverbreiten oder Dritten zugänglich zu + machen. +

+
+ + +

+ Bei bestätigten oder hinreichend begründeten Verdachtsfällen von + CSAE-Inhalten erstatten wir Anzeige bei den zuständigen deutschen + Ermittlungsbehörden (z. B. beim Bundeskriminalamt) und/oder + melden den Fall an eine anerkannte Meldestelle des + INHOPE-Netzwerks (z. B. die Internet-Beschwerdestelle von eco/FSM,{" "} + + internet-beschwerdestelle.de + + ). Wir kommen gesetzlichen Auskunfts- und Meldepflichten nach dem + Digital Services Act (Verordnung (EU) 2022/2065) und dem + Jugendschutzgesetz (JuSchG) nach. +

+
+ + +
+

{contactName}

+

Verantwortlich für Kinderschutz-Meldungen und -Maßnahmen

+

+ E-Mail:{" "} + {revealed ? ( + + {contactEmail} + + ) : ( + "––" + )} +

+
+
+ + +

+ PawFeed richtet sich an Personen, die geschäftsfähig sind bzw. + über die Einwilligung ihrer Erziehungsberechtigten verfügen + (siehe unsere{" "} + + Nutzungsbedingungen + + ). Die App ist nicht gezielt für Kinder unter 13 Jahren + konzipiert und bewirbt sich nicht an diese Zielgruppe. +

+
+
+ ); +} diff --git a/src/app/nutzungsbedingungen/page.tsx b/src/app/nutzungsbedingungen/page.tsx index f6d97b9..15bc689 100644 --- a/src/app/nutzungsbedingungen/page.tsx +++ b/src/app/nutzungsbedingungen/page.tsx @@ -225,6 +225,9 @@ export default function NutzungsbedingungenPage() { Datenschutz + + Kinderschutz + diff --git a/src/proxy.ts b/src/proxy.ts index 48feed7..c25f30a 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -3,7 +3,7 @@ import { NextResponse } from "next/server"; import { timingSafeStringEqual } from "@/lib/timing-safe-compare"; import { isMaintenanceModeEnabled } from "@/lib/maintenance"; -const MAINTENANCE_EXEMPT_PATHS = new Set(["/impressum", "/datenschutz", "/nutzungsbedingungen", "/ueber-uns"]); +const MAINTENANCE_EXEMPT_PATHS = new Set(["/impressum", "/datenschutz", "/nutzungsbedingungen", "/ueber-uns", "/kinderschutz"]); const MAINTENANCE_HTML = ` @@ -26,6 +26,7 @@ const isPublicRoute = createRouteMatcher([ "/datenschutz", "/nutzungsbedingungen", "/ueber-uns", + "/kinderschutz", "/join(.*)", "/api/webhooks/(.*)", "/api/auth/(.*)",