Compare commits

...

2 Commits

Author SHA1 Message Date
paulhorn 62641b4954 docs: Kontaktadresse des Verantwortlichen eintragen
Die Hinweise auf noch auszufüllende Angaben entfallen damit - sie würden
sonst eine Lücke behaupten, die es nicht mehr gibt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 13:55:34 +02:00
paulhorn c7488eacec feat: Zugang über Passwort schützen und Datenschutzerklärung anpassen
Die Anwendung führt Gesundheitsdaten und richtet sich an niemanden außer
den Betreiber. Ein auth_basic vor dem Server-Block nimmt ihr den Charakter
eines an die Allgemeinheit gerichteten Angebots - damit entfällt die
Impressumspflicht nach § 5 DDG und mit ihr die Pflicht, eine private
Postanschrift zu veröffentlichen.

Die Erklärung nennt den Verantwortlichen daher nur noch mit Namen und
E-Mail-Adresse und beschreibt die Zugangsbeschränkung in einem eigenen
Abschnitt.

Das Manifest braucht hinter der Passwortabfrage crossorigin=
"use-credentials": Ohne diese Angabe holt der Browser es ohne Anmeldedaten,
bekommt ein 401 und die App wäre nicht mehr installierbar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 13:36:44 +02:00
2 changed files with 35 additions and 17 deletions
+7 -2
View File
@@ -6,8 +6,13 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Week Organizer</title>
<!-- Installierbar als App, auf dem Homescreen wie auf dem Desktop. -->
<link rel="manifest" href="manifest.webmanifest" />
<!--
Installierbar als App, auf dem Homescreen wie auf dem Desktop.
crossorigin="use-credentials" ist hinter dem Passwortschutz zwingend:
Ohne diese Angabe holt der Browser das Manifest ohne Anmeldedaten, bekommt
ein 401 zurück und die App lässt sich nicht mehr installieren.
-->
<link rel="manifest" href="manifest.webmanifest" crossorigin="use-credentials" />
<link rel="icon" type="image/png" sizes="32x32" href="icons/favicon-32.png" />
<link rel="apple-touch-icon" href="icons/apple-touch-icon.png" />
<meta name="theme-color" content="#0e2842" />
+28 -15
View File
@@ -10,15 +10,18 @@
* anpassen. Vor dem öffentlichen Betrieb anwaltlich prüfen lassen, zumal
* Gesundheitsdaten betroffen sind.
*
* Die mit BETREIBER_ gekennzeichneten Angaben müssen vor der
* Veröffentlichung ausgefüllt werden.
* Bewusst ohne Postanschrift: Die Anwendung ist durch ein Passwort geschützt
* und damit kein an die Allgemeinheit gerichtetes Angebot. Art. 13 DSGVO
* verlangt Identität und Kontaktdaten des Verantwortlichen, nicht zwingend
* eine Anschrift. Sollte der Zugang jemals geöffnet werden, ist diese
* Einschätzung hinfällig - dann sind Anschrift und ein Impressum nach § 5 DDG
* zu prüfen.
*/
/** Anzupassen vor Veröffentlichung. */
/** Angaben zum Verantwortlichen nach Art. 13 Abs. 1 lit. a DSGVO. */
export const BETREIBER = {
name: "Paul Vincent Horn",
anschrift: "[Straße und Hausnummer, PLZ Ort]",
email: "[E-Mail-Adresse]",
email: "arbeit@paulvincenthorn.de",
aufsichtsbehoerde:
"Die für den Wohnsitz zuständige Landesdatenschutzbehörde. Eine Übersicht führt der Bundesbeauftragte für den Datenschutz und die Informationsfreiheit."
};
@@ -35,6 +38,7 @@ export const STAND = "August 2026";
export const KURZFASSUNG = [
"Alles, was du in dieser App erfasst, bleibt im Speicher deines Browsers auf deinem Gerät.",
"Es gibt keine Benutzerkonten, keine Übertragung deiner Einträge an einen Server, keine Cookies, keine Werbung, keine Analysedienste und keine eingebundenen Inhalte Dritter.",
"Der Zugang ist durch ein Passwort geschützt. Die Anwendung richtet sich nicht an die Allgemeinheit, sondern an einen bekannten, kleinen Kreis von Personen.",
"Wer diese Seite aufruft, hinterlässt allerdings - wie bei jeder Website - technische Spuren im Protokoll des Webservers. Darum geht es unten im Abschnitt zu den Server-Protokollen."
];
@@ -43,7 +47,8 @@ export const ABSCHNITTE: Abschnitt[] = [
titel: "1. Verantwortlicher",
absaetze: [
"Verantwortlich für die Datenverarbeitung im Sinne von Art. 4 Nr. 7 DSGVO ist:",
`${BETREIBER.name}, ${BETREIBER.anschrift}, E-Mail: ${BETREIBER.email}`,
`${BETREIBER.name}, E-Mail: ${BETREIBER.email}`,
"Diese Anwendung wird privat und ohne jede Gewinnerzielungsabsicht betrieben. Sie ist kein geschäftsmäßiges Angebot im Sinne von § 5 DDG; eine Impressumspflicht besteht daher nicht. Über die genannte E-Mail-Adresse ist der Verantwortliche unmittelbar erreichbar.",
"Ein Datenschutzbeauftragter ist nicht bestellt; die Voraussetzungen des Art. 37 DSGVO und des § 38 BDSG liegen nicht vor."
]
},
@@ -104,13 +109,21 @@ export const ABSCHNITTE: Abschnitt[] = [
]
},
{
titel: "6. Verschlüsselung",
titel: "6. Zugangsbeschränkung",
absaetze: [
"Der Abruf dieser Anwendung ist durch eine Passwortabfrage geschützt (HTTP-Basisauthentifizierung). Ohne gültige Zugangsdaten liefert der Server keine Inhalte aus.",
"Damit ist die Anwendung nicht allgemein zugänglich, sondern ein persönliches Werkzeug für einen bekannten Personenkreis. Die Zugangsdaten werden ausschließlich zur Prüfung der Berechtigung verwendet; das Passwort liegt auf dem Server nur als kryptografischer Hashwert vor. Der Benutzername erscheint in den oben beschriebenen Server-Protokollen und unterliegt derselben Löschfrist.",
"Die Beschränkung ist zugleich eine technische Maßnahme nach Art. 32 DSGVO: Sie verhindert, dass Unbeteiligte die Anwendung überhaupt erreichen. Deine Einträge selbst schützt sie nicht zusätzlich - die liegen ohnehin nur auf deinem Gerät."
]
},
{
titel: "7. Verschlüsselung",
absaetze: [
"Die Verbindung ist durchgehend mit TLS verschlüsselt (erkennbar an „https“ in der Adresszeile). Damit sind die Übertragungswege gegen Mitlesen durch Dritte geschützt."
]
},
{
titel: "7. Keine Einbindung fremder Dienste",
titel: "8. Keine Einbindung fremder Dienste",
absaetze: [
"Die Anwendung lädt sämtliche Bestandteile vom eigenen Server. Es werden keine Inhalte von externen Anbietern nachgeladen - keine Schriftarten, keine Symbolbibliotheken, kein Content Delivery Network.",
"Damit erfährt kein Dritter von deinem Aufruf, und es findet keine Übermittlung in Drittländer im Sinne der Art. 44 ff. DSGVO statt.",
@@ -118,17 +131,17 @@ export const ABSCHNITTE: Abschnitt[] = [
]
},
{
titel: "8. Export und Weitergabe durch dich",
titel: "9. Export und Weitergabe durch dich",
absaetze: [
"Die Anwendung bietet dir an, deine Daten als JSON- oder CSV-Datei zu exportieren. Diese Dateien werden lokal in deinem Browser erzeugt und in deinen Download-Ordner gelegt; auch dabei findet keine Übertragung an einen Server statt.",
"Was du anschließend mit diesen Dateien tust, liegt in deiner Verantwortung. Bedenke bei einer Weitergabe, etwa an behandelnde Personen, dass sie Gesundheitsdaten enthalten können."
]
},
{
titel: "9. Deine Rechte",
titel: "10. Deine Rechte",
absaetze: [
"Dir stehen gegenüber dem Verantwortlichen die folgenden Rechte zu, soweit dieser personenbezogene Daten von dir verarbeitet - was sich hier auf die Server-Protokolle beschränkt:",
"Zur Ausübung genügt eine formlose Nachricht an die oben genannte Adresse.",
"Zur Ausübung genügt eine formlose Nachricht an die oben genannte E-Mail-Adresse.",
"Für die in deinem Browser gespeicherten Einträge brauchst du diese Rechte nicht in Anspruch zu nehmen: Du kannst sie jederzeit selbst einsehen, ändern, exportieren und löschen, ohne jemanden um etwas bitten zu müssen."
],
punkte: [
@@ -142,28 +155,28 @@ export const ABSCHNITTE: Abschnitt[] = [
]
},
{
titel: "10. Zuständige Aufsichtsbehörde",
titel: "11. Zuständige Aufsichtsbehörde",
absaetze: [
"Unabhängig von einem Rechtsbehelf steht dir das Recht zu, dich bei einer Datenschutz-Aufsichtsbehörde zu beschweren.",
BETREIBER.aufsichtsbehoerde
]
},
{
titel: "11. Pflicht zur Bereitstellung",
titel: "12. Pflicht zur Bereitstellung",
absaetze: [
"Du bist weder gesetzlich noch vertraglich verpflichtet, personenbezogene Daten bereitzustellen. Die im Server-Protokoll erfassten Angaben fallen technisch bedingt beim Abruf an; ohne sie ist eine Auslieferung der Anwendung nicht möglich.",
"Ob und was du in der Anwendung erfasst, entscheidest allein du. Die Anwendung funktioniert auch dann, wenn du nur einzelne Bereiche nutzt."
]
},
{
titel: "12. Kein Ersatz für Behandlung",
titel: "13. Kein Ersatz für Behandlung",
absaetze: [
"Diese Anwendung ist ein Werkzeug zur Selbstbeobachtung und Tagesstrukturierung. Sie ist kein Medizinprodukt, stellt keine Diagnosen und ersetzt weder Behandlung noch Beratung durch Fachpersonen.",
"Wenn es dir schlecht geht, wende dich an deine behandelnde Praxis. In einer akuten Krise erreichst du die Telefonseelsorge rund um die Uhr kostenfrei unter 0800 1110111 und 0800 1110222, den ärztlichen Bereitschaftsdienst unter 116117 und den Rettungsdienst unter 112."
]
},
{
titel: "13. Änderungen dieser Erklärung",
titel: "14. Änderungen dieser Erklärung",
absaetze: [
`Diese Erklärung hat den Stand ${STAND}. Sie wird angepasst, wenn sich die Anwendung oder die rechtlichen Anforderungen ändern. Maßgeblich ist die jeweils hier abrufbare Fassung.`
]