reclaim/app/lib/pages/legal_page.dart
flemming-it 7efe84de34 docs(legal): fill Impressum + Datenschutz from authoritative fai_web data
Replaces the [PLACEHOLDER] entries in the Recht-Tab with the
real legal-entity data published on flemming.ai (single source
of truth across F∆I surfaces):

  - Anbieter   Dr. Stefan Flemming, Flemming.IT, freiberuflich
  - Anschrift  Dardanellenweg 41, 12109 Berlin
  - Kontakt    contact@flemming.ai, +49 30 66302929
  - USt-IdNr.  DE269393425 (§ 27a UStG)
  - Verantw.   Dr. Stefan Flemming (§ 18 Abs. 2 MStV)
  - Hosting    Hetzner Online GmbH, Gunzenhausen (AVV nach Art. 28)
  - Logs       max. 14 Tage

Also brings the wording in line with the current §-Lage:

  - § 5 TMG / § 7 Abs. 1 TMG → § 5 DDG / § 7 Abs. 1 DDG
    (Digitale-Dienste-Gesetz seit Mai 2024 — das TMG existiert
    in der zitierten Form nicht mehr).
  - Adds the standard 'Haftung für Inhalte', 'Haftung für
    Links' und 'Urheberrecht'-Abschnitte des fai_web-Templates,
    Letzterer verweist auf Abschnitt 3 (§ 5 UrhG amtliche Werke)
    für die in der App dargestellten Norm-Texte.

Recl∆Im ist damit aus Recht-Sicht so weit, wie fai_web es ist —
und gleichermaßen reif für eine öffentliche Sichtbarkeit, sobald
Methodik-Beirat + Volljuristen-Approval-Kette stehen.

Signed-off-by: flemming-it <sf@flemming.it>
2026-06-18 13:58:29 +02:00

357 lines
15 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import '../theme/reclaim_tokens.dart';
import '../widgets/reclaim_card.dart';
/// Combined legal-information page. Six sections in the order
/// a careful reader cares about them. The legal-entity data
/// (Anbieter, Anschrift, USt-IdNr., Hosting-Provider, …) mirrors
/// the upstream fai_web (`flemming.ai`) authoritative version
/// to keep the public-facing F∆I posture consistent across
/// surfaces.
class LegalPage extends StatelessWidget {
const LegalPage({super.key});
static const _email = 'contact@flemming.ai';
static const _phone = '+49 30 66302929';
static const _stand = 'Stand: Juni 2026';
@override
Widget build(BuildContext context) {
final t = Theme.of(context).textTheme;
return SingleChildScrollView(
padding: const EdgeInsets.all(ReclaimSpace.xl),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Recht & Hinweise', style: t.displaySmall),
const SizedBox(height: ReclaimSpace.xs),
Text(
'Disclaimer, AI-Act-Transparenz, Urheberrecht, '
'Datenschutz, Impressum, Lizenz.',
style: t.bodyLarge?.copyWith(color: ReclaimColors.mute),
),
const SizedBox(height: ReclaimSpace.lg),
// 1. Disclaimer
ReclaimCard(
accent: true,
child: _Section(
title: '1. Disclaimer — keine Rechtsberatung',
children: [
_p(t,
'Recl∆Im liefert eine methodisch-strukturierte '
'Wirkungsanalyse von Rechtsnormen. Die Ergebnisse sind '
'KEINE Rechtsberatung im Sinne des '
'Rechtsdienstleistungsgesetzes (RDG) und ersetzen weder '
'eine individuelle juristische Prüfung noch eine '
'Auskunft der zuständigen Behörden oder Kammern.'),
_p(t,
'Alle Bewertungs-Zahlen tragen eine Evidenz-Tier-Stufe '
'(T1T4). Stufen T3/T4 sind nicht peer-reviewed und '
'dienen ausschließlich als Hinweis-/Anregungs-Wert. '
'Eine Reform- oder Streichungs-Empfehlung der '
'Anwendung ist ein methodischer Vorschlag, keine '
'politische Forderung.'),
_p(t,
'Die Demo-Daten (fünf Pilot-Normen) sind '
'Plausibilitäts-Schätzungen ohne NKR-Validierung. '
'Bevor eine Zahl in eine politische Vorlage übernommen '
'wird, ist die zugrundeliegende Quelle einzeln zu '
'prüfen.'),
],
),
),
const SizedBox(height: ReclaimSpace.lg),
// 2. AI Act
ReclaimCard(
child: _Section(
title: '2. EU AI Act — Transparenz nach Art. 50',
children: [
_p(t,
'Recl∆Im setzt Künstliche-Intelligenz-Komponenten ein: '
'Large-Language-Modelle (LLM) zur Vorschlags-Extraktion '
'aus Norm-Texten und zur Synthese von Reform-Texten. '
'Jede LLM-erzeugte Aussage ist kennzeichnungspflichtig '
'und mit RAG-Quellen-Pflicht hinterlegt; Aussagen ohne '
'zitierfähige Quelle werden verworfen.'),
_p(t,
'Recl∆Im ist KEIN Hochrisiko-KI-System nach Anhang III '
'der KI-Verordnung. Die Anwendung trifft keine '
'Verwaltungsentscheidungen, generiert keine Rechtsakte, '
'beeinflusst nicht direkt Beschäftigungs-, Bildungs- '
'oder Sozialleistungs-Verfahren. Sie dient ausschließlich '
'der Recherche, Visualisierung und Vorschlags-Generierung '
'für menschliche Entscheidungsträger.'),
_p(t,
'Jede Bewertung durchläuft vor Veröffentlichung einen '
'`system.approval@^0`-Schritt (Human-in-the-Loop). '
'Die menschliche Letztverantwortung ist nicht '
'überschreibbar.'),
_p(t,
'Verwendete Modelle und ihre Digests werden im '
'tamper-evidenten Audit-Log des Ch∆In-Hubs gespeichert. '
'Reproduzierbarkeit erfolgt mit Temperature ≤ 0,1 und '
'festem Prompt-Hash.'),
],
),
),
const SizedBox(height: ReclaimSpace.lg),
// 3. Quellen + UrhG
ReclaimCard(
child: _Section(
title: '3. Quellen & Urheberrecht (§ 5 UrhG)',
children: [
_p(t,
'Die in der Anwendung dargestellten Gesetzes- und '
'Verordnungs-Texte sind amtliche Werke im Sinne des '
'§ 5 UrhG und damit gemeinfrei. Die kanonischen Quellen '
'sind verlinkt und durch SHA-256-Prüfsummen im '
'Audit-Log nachvollziehbar.'),
_p(t, 'Primärquellen (T1):'),
_bullet(t,
'Bundesrecht: gesetze-im-internet.de (BMJ) — § 5 UrhG.'),
_bullet(t,
'EU-Recht: EUR-Lex (Europäische Kommission) — '
'Mehrsprachigkeit nach Verordnung (EU) Nr. 1257/2012.'),
_bullet(t,
'Landesrecht Berlin: gesetze.berlin.de / '
'landesrecht-berlin.de — § 5 UrhG.'),
_p(t, 'Sekundärquellen (T1/T2):'),
_bullet(t,
'Nationaler Normenkontrollrat (NKR) — '
'Bürokratiekosten-Datenbank, Methodenleitfaden.'),
_bullet(t,
'Statistisches Bundesamt (DESTATIS) — '
'Unternehmensregister, Bürokratiekostenindex.'),
_bullet(t,
'DIHK, ZDH, IHK Berlin, BDI — '
'Verbands-Erhebungen mit Quellen-Angabe.'),
_p(t,
'Eigene Methodik und Software-Code sind unter '
'Apache License 2.0 veröffentlicht; '
'Code-Repository: git.flemming.ai/fai/reclaim.'),
],
),
),
const SizedBox(height: ReclaimSpace.lg),
// 4. Datenschutz
ReclaimCard(
child: _Section(
title: '4. Datenschutzerklärung (DSGVO Art. 13)',
children: [
_h(t, 'Verantwortlicher'),
_p(t,
'Verantwortlich für die Datenverarbeitung in dieser '
'Anwendung ist Dr. Stefan Flemming '
'(Flemming.IT — Beratung und Entwicklung), '
'Dardanellenweg 41, 12109 Berlin, Deutschland. '
'Kontakt: $_email'),
_h(t, 'Hosting & Server-Logs'),
_p(t,
'Wird die Anwendung als Webseite bereitgestellt, läuft '
'sie auf Servern der Hetzner Online GmbH, '
'Industriestr. 25, 91710 Gunzenhausen, Deutschland. '
'Beim Aufruf werden technisch notwendige Zugriffsdaten '
'(IP-Adresse, Datum/Uhrzeit, abgerufene Ressource, '
'Referrer, User-Agent) in Server-Logfiles verarbeitet. '
'Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO '
'(berechtigtes Interesse an Betrieb und Sicherheit). '
'Mit Hetzner besteht ein Vertrag zur Auftragsverarbeitung '
'gemäß Art. 28 DSGVO; Server-Logfiles werden nach '
'spätestens 14 Tagen gelöscht.'),
_p(t,
'Im Desktop-/Mock-Modus werden keine personenbezogenen '
'Daten erhoben; alle Daten verbleiben lokal auf dem '
'Endgerät.'),
_h(t, 'Cookies & Tracking'),
_p(t,
'Die Anwendung setzt keine Tracking- oder '
'Marketing-Cookies und bindet keine externen '
'Analysedienste ein. Eine Cookie-Einwilligung ist daher '
'nicht erforderlich.'),
_h(t, 'Kontaktaufnahme'),
_p(t,
'Wenn Sie uns per E-Mail kontaktieren, verarbeiten wir '
'die übermittelten Daten zur Bearbeitung Ihrer Anfrage '
'(Art. 6 Abs. 1 lit. b bzw. f DSGVO). Die Daten werden '
'gelöscht, sobald sie für den Zweck nicht mehr '
'erforderlich sind.'),
_h(t, 'Ihre Rechte'),
_p(t,
'Sie haben das Recht auf Auskunft, Berichtigung, '
'Löschung, Einschränkung der Verarbeitung, '
'Datenübertragbarkeit und Widerspruch '
'(Art. 1521 DSGVO) sowie das Recht auf Beschwerde '
'bei einer Aufsichtsbehörde, etwa der Berliner '
'Beauftragten für Datenschutz und Informationsfreiheit, '
'Friedrichstr. 219, 10969 Berlin.'),
_p(t, _stand),
],
),
),
const SizedBox(height: ReclaimSpace.lg),
// 5. Impressum
ReclaimCard(
child: _Section(
title: '5. Impressum',
children: [
_h(t, 'Angaben gemäß § 5 DDG'),
_p(t,
'Dr. Stefan Flemming\n'
'Flemming.IT — Beratung und Entwicklung, freiberuflich '
'(www.flemming.it)\n'
'Dardanellenweg 41\n'
'12109 Berlin\n'
'Deutschland'),
_h(t, 'Kontakt'),
_p(t, 'E-Mail: $_email\nTelefon: $_phone'),
_h(t, 'Umsatzsteuer-ID'),
_p(t,
'Umsatzsteuer-Identifikationsnummer gemäß § 27a UStG: '
'DE269393425'),
_h(t, 'Verantwortlich i.S.d. § 18 Abs. 2 MStV'),
_p(t, 'Dr. Stefan Flemming, Anschrift wie oben.'),
_h(t, 'Haftung für Inhalte'),
_p(t,
'Als Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für '
'eigene Inhalte auf diesen Seiten nach den allgemeinen '
'Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG sind wir '
'als Diensteanbieter jedoch nicht verpflichtet, '
'übermittelte oder gespeicherte fremde Informationen '
'zu überwachen oder nach Umständen zu forschen, die '
'auf eine rechtswidrige Tätigkeit hinweisen.'),
_h(t, 'Haftung für Links'),
_p(t,
'Unser Angebot enthält ggf. Links zu externen Websites '
'Dritter, auf deren Inhalte wir keinen Einfluss haben. '
'Deshalb können wir für diese fremden Inhalte auch '
'keine Gewähr übernehmen. Für die Inhalte der '
'verlinkten Seiten ist stets der jeweilige Anbieter '
'oder Betreiber verantwortlich.'),
_h(t, 'Urheberrecht'),
_p(t,
'Die durch die Seitenbetreiber erstellten Inhalte und '
'Werke auf diesen Seiten unterliegen dem deutschen '
'Urheberrecht. Beiträge Dritter sind als solche '
'gekennzeichnet. Davon unberührt bleibt § 5 UrhG für '
'die wiedergegebenen amtlichen Werke (vgl. Abschnitt 3).'),
_p(t,
'Plattform der Europäischen Kommission zur '
'außergerichtlichen Online-Streitbeilegung (Art. 14 '
'Abs. 1 ODR-VO): ec.europa.eu/consumers/odr. Wir sind '
'nicht bereit oder verpflichtet, an '
'Streitbeilegungsverfahren vor einer '
'Verbraucherschlichtungsstelle teilzunehmen.'),
_p(t, _stand),
],
),
),
const SizedBox(height: ReclaimSpace.lg),
// 6. Open Source
ReclaimCard(
child: _Section(
title: '6. Open Source & Lizenz',
children: [
_p(t,
'Recl∆Im ist freie Software, lizenziert unter der '
'Apache License, Version 2.0. Der Quelltext, die '
'Module und die Methodik sind öffentlich einsehbar '
'unter:'),
InkWell(
onTap: () => launchUrl(
Uri.parse('https://git.flemming.ai/fai/reclaim'),
mode: LaunchMode.externalApplication,
),
child: Text(
'https://git.flemming.ai/fai/reclaim',
style: t.bodyLarge?.copyWith(
color: ReclaimColors.signal,
decoration: TextDecoration.underline,
fontFamily: ReclaimTypography.mono,
),
),
),
const SizedBox(height: ReclaimSpace.sm),
_p(t,
'Plattform: Ch∆In (Apache 2.0). Methodische Vorbilder '
'und Lizenz-Hinweise stehen in der Datei NOTICE im '
'Repository.'),
_p(t,
'Beiträge willkommen. DCO Sign-off und Conventional '
'Commits in Englisch sind Konvention.'),
],
),
),
],
),
);
}
}
class _Section extends StatelessWidget {
const _Section({required this.title, required this.children});
final String title;
final List<Widget> children;
@override
Widget build(BuildContext context) {
final t = Theme.of(context).textTheme;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title, style: t.headlineSmall),
const SizedBox(height: ReclaimSpace.md),
...children,
],
);
}
}
Widget _h(TextTheme t, String s) => Padding(
padding: const EdgeInsets.only(
top: ReclaimSpace.sm,
bottom: 4,
),
child: Text(s,
style: t.titleMedium?.copyWith(color: ReclaimColors.signal)),
);
Widget _p(TextTheme t, String s) => Padding(
padding: const EdgeInsets.only(bottom: ReclaimSpace.sm),
child: SelectableText(s, style: t.bodyLarge?.copyWith(height: 1.55)),
);
Widget _bullet(TextTheme t, String s) => Padding(
padding: const EdgeInsets.only(
left: ReclaimSpace.lg,
bottom: ReclaimSpace.xs,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(top: 8, right: 10),
child: Container(
width: 5,
height: 5,
decoration: const BoxDecoration(
color: ReclaimColors.signal,
shape: BoxShape.circle,
),
),
),
Expanded(
child: SelectableText(s,
style: t.bodyLarge?.copyWith(height: 1.55)),
),
],
),
);