AI Disclosure Standard 1.6.3
Ein zustandsloser Go-Dienst für sichtbare und maschinenlesbare Erklärungen zur KI-Nutzung in Artikeln, Webseiten und einzelnen Inhaltsbestandteilen.
Funktionen
- einzelne Deklarationen und zusammengefasste Artikel-/Webseiten-Deklarationen;
- SVG-Badges, HTML-Erklärung und JSON-LD unter einem gemeinsamen Link;
- Text, Titelbild, weitere Bilder, Recherche, Übersetzung, Audio, Video und Code getrennt erfassbar;
- automatisch erzeugte, professionell formulierte Zusammenfassung als Fließtext und strukturierte Tabelle;
- frei wählbare Nachweisgrundlage: Selbsterklärung, technisch protokolliert, signiert oder verifiziert;
- Deutsch, Englisch, Französisch, Spanisch, Italienisch, Niederländisch, Portugiesisch und Polnisch;
- Sprachumschalter direkt auf der Ergebnisseite;
- mehrsprachige Hintergrundseite zu Artikel 50 des EU AI Act, Kennzeichnungspflichten und freiwilliger Transparenz;
- optionale lizenzierte Funktionen für eigene Texte und Badge-Darstellung;
- Offline-, Hybrid- und Online-Prüfung über die eigenständige Universal License Platform;
- konfigurierbare Seiten für Impressum, Datenschutz und Barrierefreiheit;
- CSP mit Request-Nonce, minimierte Logs, vertrauensgebundene Proxy-Header und gehärtete Container-Defaults;
- Health-, Readiness- und optional geschützter Prometheus-Endpunkt;
- Docker-, Kubernetes- und Docker-Swarm-Deployment.
Start unter Windows
go run .\cmd\server
Danach:
Generator: http://localhost:8080/
Produktseite: http://localhost:8080/product
Hintergrund: http://localhost:8080/background
Impressum: http://localhost:8080/impressum
Datenschutz: http://localhost:8080/datenschutz
Barrierefrei: http://localhost:8080/barrierefreiheit
Healthcheck: http://localhost:8080/healthz
Funktionen: http://localhost:8080/v1/capabilities
Go lädt .env nicht selbst. Unter PowerShell kann die Datei vor dem Start in die Prozessumgebung übernommen werden oder Docker Compose mit --env-file .env verwendet werden.
Docker Compose
Copy-Item .env.example .env
docker compose --env-file .env up -d --build
Lizenzprüfung
Dieses Projekt stellt keine Lizenzen aus und enthält keine Schlüsselgenerierung, privaten Schlüssel, Lizenzverwaltung, Admin-Oberfläche oder eigenen Lizenzserver. Diese Aufgaben gehören ausschließlich in die separat betriebene Universal License Platform.
Der Produktserver enthält nur den Laufzeit-Client und akzeptiert:
LICENSE_TOKEN=...
LICENSE_MODE=offline
LICENSE_SERVER_URL=
LICENSE_INSTANCE_ID=
Der Produktname ist fest verdrahtet:
ai-disclosure-standard
Für die vorhandenen Funktionen verwendet die Plattform diese Feature-IDs:
custom_text
custom_badge
white_label
Vertrauensschlüssel einbetten
Die öffentlichen Issuer- und Lease-Schlüssel werden von der Universal License Platform bereitgestellt. Lade dort den Trust Store herunter und ersetze vor dem Build:
internal/app/trusted_keys.json
PowerShell-Beispiel:
Invoke-WebRequest `
"https://licenses.example.org/api/v1/trust-store" `
-OutFile ".\internal\app\trusted_keys.json"
go build .\cmd\server
Der Trust Store wird mit go:embed fest in das Binary eingebaut. Es gibt absichtlich kein LICENSE_PUBLIC_KEY und keinen zur Laufzeit austauschbaren Trust Store.
Prüfmodi
Offline prüft den signierten Lizenz-Token ausschließlich lokal.
LICENSE_MODE=offline
LICENSE_TOKEN=...
Hybrid fragt die Universal License Platform ab und speichert ein kurzlebiges, signiertes Lease. Bei temporärer Nichterreichbarkeit kann das letzte gültige Lease innerhalb der in der Lizenz festgelegten Grace-Periode verwendet werden.
LICENSE_MODE=hybrid
LICENSE_TOKEN=...
LICENSE_CACHE_FILE=/data/license-lease.json
Online benötigt eine erfolgreiche aktuelle Prüfung durch die Plattform.
LICENSE_MODE=online
LICENSE_TOKEN=...
Bei Hybrid- und Online-Lizenzen übernimmt der Client bevorzugt die von der Plattform signiert in der Lizenz gespeicherte Server-URL. LICENSE_SERVER_URL ist nur ein expliziter Override beziehungsweise Fallback.
Der Client verwendet die Plattform-API:
POST /api/v1/licenses/validate
und unterstützt für bestehende Installationen weiterhin:
POST /v1/introspect
Weitere Einzelheiten stehen in docs/LICENSE-INTEGRATION.md. Für bestehende 1.5-Installationen siehe docs/MIGRATION-1.5-TO-1.6.md.
Konfiguration
Betrieb und Sicherheit
| Variable | Standard | Bedeutung |
|---|---|---|
LISTEN_ADDRESS |
:8080 |
HTTP-Adresse |
BASE_URL |
http://localhost:8080 |
öffentliche Origin ohne Pfad, Query oder Fragment |
PUBLIC_NAME |
AI Usage Disclosure |
sichtbarer Produktname |
CONTACT_URL |
Projektseite | Kontakt-/Informationsseite |
DEFAULT_LANGUAGE |
de |
Standardsprache |
TRUST_PROXY |
false |
Proxy-Header nur berücksichtigen, wenn zusätzlich vertrauenswürdige Netze gesetzt sind |
TRUSTED_PROXY_CIDRS |
leer | kommagetrennte CIDRs der tatsächlich kontrollierten Reverse Proxies |
LOG_CLIENT_IP |
false |
Client-IP in Anwendungslogs aufnehmen; aus Datenschutzgründen standardmäßig deaktiviert |
ENABLE_HSTS |
true |
HSTS bei einer https://-Basis-URL senden |
METRICS_ENABLED |
false |
/metrics aktivieren |
METRICS_TOKEN |
leer | bei aktiviertem /metrics verpflichtender Bearer-Token; auch als METRICS_TOKEN_FILE |
Betreiber- und Datenschutzangaben
Die Seiten /impressum, /datenschutz und /barrierefreiheit werden aus Umgebungsvariablen erzeugt. Mindestens LEGAL_NAME, LEGAL_ADDRESS, LEGAL_EMAIL, HOSTING_PROVIDER, LOG_RETENTION und CONSUMER_DISPUTE_STATUS müssen vor öffentlichem Betrieb geprüft werden. Mit LEGAL_STRICT=true startet der Server nicht, solange Pflichtwerte fehlen oder Platzhalter wie REPLACE_ME enthalten.
Weitere Variablen stehen vollständig in .env.example. Dazu gehören Vertretungsberechtigte, Register- und Umsatzsteuerangaben, redaktionell Verantwortliche, Datenschutzkontakt, Empfänger, Drittlandübermittlungen, Aufsichtsbehörde, Verbraucherstreitbeilegung und Barrierefreiheitskontakt.
Lizenzprüfung
| Variable | Standard | Bedeutung |
|---|---|---|
LICENSE_TOKEN |
leer | von der Universal License Platform ausgestellter Token |
LICENSE_MODE |
offline |
Mindestmodus offline, hybrid oder online |
LICENSE_SERVER_URL |
leer | optionaler Prüfserver-Override |
LICENSE_INSTANCE_ID |
leer | optionale Instanzbindung |
LICENSE_CACHE_FILE |
./data/license-lease.json |
signierter Hybrid-Lease-Cache |
LICENSE_REFRESH_INTERVAL |
15m |
Hintergrundaktualisierung |
LICENSE_REQUEST_TIMEOUT |
5s |
Timeout der Onlineprüfung |
Die mitgelieferten Rechtstexte sind eine technisch abgestimmte Vorlage, keine individuelle Rechtsberatung. Die konkrete Einordnung hängt unter anderem von Betreiber, Hosting, Vertragsmodell, Zielgruppe, Zusatzdiensten und redaktionellen Inhalten ab. Siehe docs/LEGAL-AND-SECURITY.md und den Reviewbericht vom 20. Juli 2026.
Für die Abgrenzung zum EU AI Act und insbesondere zu Artikel 4 und Artikel 50 siehe außerdem docs/EU-AI-ACT-COMPLIANCE.md. Das JSON-LD dieses Projekts ist ergänzende Dokumentation und kein automatischer Ersatz für eine Provider-Markierung nach Artikel 50 Absatz 2.
API
GET /badge/{preset}.svg
GET /v1/badge.svg
GET /background
GET /impressum
GET /datenschutz
GET /barrierefreiheit
GET /declaration
GET /v1/declaration.json
POST /v1/validate
GET /v1/capabilities
GET /healthz
GET /readyz
GET /metrics optional, standardmäßig deaktiviert
Beispiel für eine Artikelerklärung:
/declaration?mode=article&textExtent=none&textReview=none&imageExtent=full&imageReview=editorial&researchExtent=assisted&researchReview=expert&assurance=technicallyRecorded&lang=de
SVG-Darstellungen
Der Query-Parameter theme unterstützt drei Darstellungen:
| Wert | Ausgabe |
|---|---|
color |
klassisches zweifarbiges Text-Badge |
mono |
monochromes Text-Badge |
emoji |
quadratisches, rein grafisches SVG-Symbol mit zugänglichem Titel |
Die Emoji-Variante verwendet je nach Preset ein Mensch-, Recherche-, Zusammenfassungs- oder Blitzsymbol. Beispiel:
/badge/research.svg?theme=emoji&lang=de&link=auto
Bei theme=emoji werden style=flat und style=flat-square ignoriert, da die Ausgabe immer quadratisch ist. Mit der Pro-Funktion custom_badge steuert leftColor die Symbolfarbe und rightColor die Hintergrundfarbe.
Nachweisgrundlage
Der Generator bietet vier interoperable Werte. Sie werden über den Query-Parameter assurance an HTML- und JSON-LD-Ausgaben übertragen:
| Wert | Bedeutung |
|---|---|
selfDeclared |
Die veröffentlichende Person oder Organisation stellt die Angaben selbst bereit. |
technicallyRecorded |
Die Angaben wurden im Erstellungs- oder Veröffentlichungsprozess technisch protokolliert. |
signed |
Die Erklärung wurde digital signiert; Herkunft und Unverändertheit können geprüft werden. |
verified |
Die Angaben wurden nach einem dokumentierten Verfahren zusätzlich verifiziert. |
Eine digitale Signatur bestätigt die Herkunft und Integrität der Erklärung, nicht automatisch die inhaltliche Richtigkeit ihrer Angaben. Nicht zutreffende Nachweisstufen sollten nicht ausgewählt werden.
Entwicklung und Prüfung
go test .\...
go vet .\...
Der eingebundene, reine Laufzeit-Client wird separat geprüft:
Set-Location .\third_party\license-platform-client
go test .\...
Gesamtprüfung über Make:
make check
Projektgrenze
Im Hauptprojekt verbleiben ausschließlich:
- ein eingebetteter öffentlicher Trust Store;
- ein verifikationsfähiger Client;
- Feature- und Limit-Abfragen;
- optionaler signierter Lease-Cache.
Nicht enthalten sind:
- private Schlüssel;
- Keygen oder Lizenzsignierung;
- Lizenzportal oder Admin-API;
- Lizenzdatenbank;
- Widerrufsverwaltung oder Lease-Signierung.
Diese Funktionen werden nur in der eigenständigen Universal License Platform betrieben.
Art.-50-Kontext (Schema 1.2)
Optional kann legalContext den rechtlich relevanten Veröffentlichungskontext als Selbsteinordnung dokumentieren: deepfake, publicInterestText, artisticCreativeSatiricalFictional oder otherVoluntary. Der Generator nutzt diese Angaben für eine vorsichtige, nicht bindende Einschätzung und für eine eindeutigere Erstkennzeichnung. Ein Deepfake ist dabei nicht jedes KI-generierte Bild. Die Einordnung muss durch den Publisher anhand des konkreten Inhalts und Veröffentlichungskontexts erfolgen.
Bei publicInterestText berücksichtigt die Einschätzung, ob eine substanzielle inhaltliche Prüfung (editorial oder expert) und eine ausdrücklich benannte editorialResponsibility dokumentiert sind. Bei einer als wahrscheinlich kennzeichnungspflichtig eingeordneten Nutzung erzeugt der Badge eine unmittelbar verständliche Beschriftung statt nur „Artikeltransparenz“. Im emoji-Modus ergänzt der generierte Einbettungscode bei solchen Fällen zusätzlich sichtbaren Text.