dp
dev.pipe Rechtliches

Rechtliches // PRIVACY

Datenschutzerklärung

Diese Seite beschreibt, was die Systeme von dev.pipe tatsächlich speichern. Jede nicht als Lücke markierte Aussage stammt aus dem Quelltext dieses Dienstes und lässt sich anhand der jeweils genannten Dateien nachprüfen. Als Lücke markierte Blöcke sind rechtliche oder organisatorische Angaben, die nur der Betreiber und seine Anwältin oder sein Anwalt machen können.

Dienst, für den diese Seite gilt: https://www.devpipe.eu

⚠ DIESE SEITE IST UNVOLLSTÄNDIG UND DARF NICHT LIVE GEHEN

7 offene Lücken auf dieser Seite

Die unten markierten Blöcke sind mit Absicht leer. Sie enthalten rechtliche oder unternehmerische Angaben, die nur der Betreiber und seine Anwältin oder sein Anwalt machen können. Jede davon steht in docs/legal-content-checklist.md.

01Verantwortlicher und Datenschutzbeauftragter

⚠ LÜCKE — ANGABE DES BETREIBERS ERFORDERLICH

Wer für diese Verarbeitung verantwortlich ist

Erforderliche Angaben:

  • Name, Rechtsform und Anschrift des Verantwortlichen (Art. 4 Nr. 7 DSGVO)
  • Kontaktadresse für Datenschutzanfragen
  • Ob ein Datenschutzbeauftragter zu benennen ist (§ 38 BDSG) und wenn ja, dessen Kontaktdaten
  • Vertreter nach Art. 27 DSGVO, falls der Verantwortliche nicht in der EU niedergelassen ist

Ohne diese Angaben hat die gesamte Erklärung keinen Adressaten, und niemand kann ein Recht ausüben.

02Was der Dienst tut

Du schickst aus einem Entwicklungswerkzeug eine Anfrage an einen OpenAI-kompatiblen Endpunkt. Ein Gateway prüft den API-Key und leitet die Anfrage an Inferenz-Worker weiter, die das Modell im Grafikspeicher halten. Das Control Plane gibt Keys aus, zählt den Verbrauch und spricht für die Abrechnung mit Stripe.

Belegt in: config/litellm-config.yaml · docker-compose.yml · backend/app/api/v1/

03Daten in der Datenbank des Control Plane

Das Control Plane hält die folgenden Zeilen in PostgreSQL. Für personenbezogene Daten ist die Liste nach dem Stand dieses Quelltexts vollständig.

TabelleGespeicherte FelderAnmerkung
customers E-Mail-Adresse, Name, Stripe-Kundenkennung, Aktiv-Kennzeichen, Zeitstempel für Anlage und Änderung Wird geschrieben, sobald ein Abonnement bezahlt ist.
api_keys SHA-256-Hash des Schlüssels, Anzeigepräfix, Alias, Schlüsseltyp, Gateway-Kennung, Limits, Aktiv-Kennzeichen, Ablauf, Zeitstempel für Anlage und Widerruf Der Schlüssel selbst wird nie gespeichert. Bei einem Testzugang ohne Client-Kennung wird der Alias aus der IP-Adresse des Anfragenden gebildet; der Alias ist damit selbst ein personenbezogenes Datum.
subscriptions Stripe-Abonnementkennung, Tarif, Status, laufender Abrechnungszeitraum, Zeitstempel Spiegel des Zustands, den Stripe per Webhook meldet.
device_authorizations E-Mail-Adresse im Klartext, kanonisch gefaltete Adresse, IP-Adresse im Klartext, SHA-256-Hash eines Hardware-Fingerabdrucks, SHA-256-Digests der Geräte- und Nutzercodes, Versuchszähler, Zeitstempel Gehört zum Geräte-Flow des CLI-Installers. Die IP-Adresse steht im Klartext, nicht als Hash.
event_ledger Stripe-Ereigniskennung, Ereignistyp, Verarbeitungsstatus, Hash der Nutzlast, Zeitstempel der Verarbeitung Verhindert, dass ein Stripe-Webhook zweimal verarbeitet wird. Der Inhalt der Nutzlast wird nicht aufbewahrt.
usage_metrics_hourly Nur Zähler: Anfragen, Prompt-, Antwort- und zwischengespeicherte Tokens, Latenzklassen, gedrosselte Anfragen je Stunde und Key Keine Adresse, keine IP-Adresse, kein Inhalt der Anfragen.

Belegt in: backend/app/models/

04Kurzlebige Daten in Redis

In Redis liegen nur Zähler und Marken, jeweils mit einer Ablaufzeit. Die längste Lebensdauer im Code beträgt sieben Tage.

  • Zähler zur Missbrauchsabwehr unter gehashten Kennungen, sodass sich die Kennung aus dem Zähler nicht zurücklesen lässt
  • Verbrauchsmarken für die Proof-of-Work-Aufgabe, damit eine gelöste Aufgabe nicht erneut eingereicht werden kann
  • Nutzungsaggregate, aus denen das Cockpit seine Diagramme speist

Belegt in: backend/app/services/rate_limiter.py · backend/app/services/telemetry_pipeline.py

05Der Inhalt deiner Anfragen

Prompts, Quelltext und erzeugte Antworten liegen nur so lange im Arbeitsspeicher, wie eine Anfrage läuft. Vier voneinander unabhängige Einstellungen halten sie aus jeder Speicherung heraus. Sie sind hier genannt, damit die Aussage nachprüfbar ist und nicht geglaubt werden muss.

  • Die einzige Logging-Integration des Gateways ist unser eigener Nutzungs-Forwarder, beschränkt auf eine feste Positivliste aus Token-Zählern und Key-Hashes; auch die eigenen Verbrauchseinträge des Gateways speichern keinen Prompt- und keinen Antworttext
  • Die Inferenz-Worker werden mit --disable-log-requests gestartet, sodass Prompts nie in deren Protokoll landen
  • Der Reverse Proxy entfernt Abfragezeichenkette sowie Anfrage- und Antwort-Kopfzeilen aus dem Zugriffsprotokoll
  • Die Fehlererfassung ersetzt Prompt-, Nachrichten- und Token-Felder durch eine Filtermarke, bevor ein Ereignis den Prozess verlässt

Weil in diesem Aufbau nirgends Anfrageinhalte auf eine Festplatte geschrieben werden, existiert hier auch kein Datenbestand, mit dem sich ein Modell trainieren oder nachtrainieren ließe.

Belegt in: config/litellm-config.yaml · config/litellm_usage_callback.py · docker-compose.yml · config/Caddyfile · backend/app/core/bugsink.py

06Zugriffsprotokolle des Webservers

Der Reverse Proxy schreibt ein Zugriffsprotokoll auf die Standardfehlerausgabe. Abfragezeichenkette, Anfrage- und Antwort-Kopfzeilen werden aus jedem Eintrag entfernt; genau das hält API-Keys, Sitzungs-Cookies und Prompts daraus heraus. Die übrigen Felder enthalten weiterhin die IP-Adresse des anfragenden Clients.

⚠ LÜCKE — ANGABE DES BETREIBERS ERFORDERLICH

Aufbewahrung der Protokolle

Erforderliche Angaben:

  • Wie lange Container-Protokolle aufbewahrt und wohin sie ausgeleitet werden
  • Ob auf dem Host eine Rotation eingerichtet ist; die Compose-Dateien setzen keine Rotationsgrenzen
  • Aufbewahrungsdauer für die IP-Adressen in diesen Protokollen

Der Aufbau selbst löscht keine Protokollzeile. Was damit geschieht, wird außerhalb dieses Projekts entschieden.

Belegt in: config/Caddyfile

07Cookies und Browser-Speicher

Diese Seite setzt genau ein Cookie. Es heißt session_token, ist als HttpOnly und SameSite=Lax gekennzeichnet, wird im Produktivbetrieb mit dem Secure-Kennzeichen ausgeliefert und läuft nach sieben Tagen ab. Es sorgt dafür, dass eine angemeldete Kundin angemeldet bleibt. Es gibt kein Analyse-Cookie, kein Werbe-Cookie und kein Zählpixel, und die Skripte verwenden weder localStorage noch sessionStorage.

⚠ LÜCKE — ANGABE DES BETREIBERS ERFORDERLICH

Einwilligungsbewertung

Erforderliche Angaben:

  • Ob das Anmelde-Cookie im Sinne von § 25 Abs. 2 TDDDG unbedingt erforderlich ist und deshalb ohne Einwilligungsbanner auskommt

Der technische Befund oben ist vollständig. Der Schluss, der daraus zu ziehen ist, ist ein rechtlicher.

Belegt in: backend/app/api/v1/auth.py · frontend/static/js/

08Schriften und andere externe Ressourcen

Die Webschriften werden von diesem Server ausgeliefert. Beim Aufruf einer Seite dieses Angebots wird deshalb überhaupt kein fremder Server kontaktiert, und es wird keine IP-Adresse an einen Schriftanbieter übermittelt. Ein Test hält das für jede öffentliche Seite fest.

Belegt in: frontend/static/css/input.css · frontend/static/fonts/ · tests/test_frontend_assets.py

09Empfänger und Dritte

Dies sind die einzigen Empfänger, die im Quelltext vorkommen. Die Spalte mit der Rechtsgrundlage bleibt bewusst leer.

EmpfängerWas übermittelt wirdWannRechtsgrundlage
Stripe (Zahlungsabwicklung) E-Mail-Adresse, Name, gewählter Tarif sowie Hash und Präfix eines Test-Keys, der aufgewertet wird Beim Anlegen einer Checkout-Sitzung und bei jedem Abonnement-Ereignis, das Stripe meldet — NOCH ZU ERGÄNZEN —
SMTP-Anbieter (im Code nicht genannt) Empfängeradresse, Betreff und Text der Bestätigungs- und Anmelde-E-Mails Immer dann, wenn eine solche E-Mail versendet wird — NOCH ZU ERGÄNZEN —
Bugsink-Fehlererfassung (optional, selbst betrieben) Fehlerdaten, in denen Prompts, Schlüssel, Tokens und Cookies durch eine Filtermarke ersetzt sind, sowie Anfragepfad und Statuscode Nur bei einem Serverfehler und nur, wenn der Betreiber eine DSN hinterlegt hat — NOCH ZU ERGÄNZEN —
Hugging Face (Modellgewichte) Keine Kundendaten. Der Betreiber lädt dort beim Start eines Workers die Modellgewichte herunter Nie während einer Kundenanfrage Nicht einschlägig

⚠ LÜCKE — ANGABE DES BETREIBERS ERFORDERLICH

Angaben, die nur der Betreiber kennt

Erforderliche Angaben:

  • Welches Unternehmen die E-Mails tatsächlich versendet und wo es die Adressen verarbeitet
  • Mit welcher Stripe-Gesellschaft der Vertrag besteht und welche Garantien für Übermittlungen gelten
  • Ob die Fehlererfassung im Produktivbetrieb eingeschaltet ist und auf wessen Infrastruktur sie läuft
  • Hoster und Rechenzentrumsbetreiber als weiterer Auftragsverarbeiter
  • Die Rechtsgrundlage für jede Zeile der obigen Tabelle

Kartendaten werden auf einer Stripe-Seite eingegeben und erreichen dieses System nie; alles Übrige hängt an Verträgen, die der Quelltext nicht kennt.

Belegt in: backend/app/services/stripe_service.py · backend/app/services/email_service.py · backend/app/core/bugsink.py · docker-compose.yml

10Automatisierte Prüfung von Testanfragen

Ein Test-Key wird ohne Kreditkarte ausgegeben. Deshalb entscheidet das System automatisch, ob eine Anfrage glaubwürdig wirkt. Es vergleicht die IP-Adresse mit veröffentlichten Adressbereichen von Cloud-Anbietern, weist Wegwerf-Mail-Domains ab, verlangt eine gelöste Proof-of-Work-Aufgabe und eine bestätigte E-Mail-Adresse und gewährt je Adresse nur einen Testzugang innerhalb einer Wartezeit. Eine Anfrage, die daran scheitert, wird abgelehnt, ohne dass ein Mensch sie ansieht.

⚠ LÜCKE — ANGABE DES BETREIBERS ERFORDERLICH

Bewertung der automatisierten Entscheidung

Erforderliche Angaben:

  • Ob diese Ablehnung eine automatisierte Entscheidung nach Art. 22 DSGVO ist und was darüber mitzuteilen wäre
  • Wie eine Person eine Überprüfung der Entscheidung verlangen kann

Die Mechanik oben ist vollständig beschrieben. Ob sie in dieser Form zulässig ist, ist eine rechtliche Wertung.

Belegt in: backend/app/services/datacenter_feed_service.py · backend/app/services/rate_limiter.py · backend/app/services/onboarding_service.py

11Speicherdauer und Löschung

Das muss deutlich gesagt werden, denn hier tut das System noch nicht das, was eine Datenschutzerklärung sonst verspricht: Im Backend gibt es keinen automatischen Löschpfad. Keine Stelle im Code entfernt eine Zeile aus der Datenbank. Ein widerrufener API-Key wird als inaktiv gekennzeichnet und erhält einen Widerrufszeitstempel; seine Zeile bleibt bestehen, einschließlich des Alias, der eine IP-Adresse enthalten kann. Nur die Einträge in Redis entfernen sich selbst, nach höchstens sieben Tagen.

⚠ LÜCKE — ANGABE DES BETREIBERS ERFORDERLICH

Aufbewahrungsfristen und Löschverfahren

Erforderliche Angaben:

  • Aufbewahrungsdauer für jede oben genannte Tabelle
  • Wie ein Verlangen nach Art. 17 DSGVO heute erfüllt wird, wer es ausführt und wie es dokumentiert wird
  • Welche Zeilen aus steuer- oder handelsrechtlichen Gründen aufzubewahren sind und wie lange
  • Ob vor dem Start eine Löschroutine gebaut wird

Keine Frist in diese Seite schreiben, die kein Code durchsetzt. Entweder die Routine wird gebaut, oder die Seite sagt, was wirklich passiert.

Belegt in: backend/app/services/stripe_service.py · backend/app/api/v1/dashboard.py · backend/app/models/

12Zwecke der Verarbeitung

Die Zwecke stammen aus dem Quelltext. Die Rechtsgrundlage für jeden von ihnen ist eine rechtliche Wertung und bleibt offen.

ZweckVerwendete DatenRechtsgrundlage
Inferenzdienst bereitstellen und API-Keys verwalten Schlüssel-Hash, Präfix, Alias, Limits, Kundenzuordnung — NOCH ZU ERGÄNZEN —
Testzugänge ausgeben und vor Missbrauch schützen E-Mail-Adresse, IP-Adresse, Hash des Hardware-Fingerabdrucks, Zähler — NOCH ZU ERGÄNZEN —
Abrechnung, Abonnementverwaltung und Rechnungen E-Mail-Adresse, Name, Stripe-Kennungen, Tarif, Status — NOCH ZU ERGÄNZEN —
Bestätigungs- und Anmelde-E-Mails versenden E-Mail-Adresse, Einmal-Link oder Digest eines Codes — NOCH ZU ERGÄNZEN —
Plattform sicher betreiben und Fehler finden Zugriffsprotokolle mit IP-Adresse, bereinigte Fehlerereignisse — NOCH ZU ERGÄNZEN —
Verbrauchszahlen im Cockpit anzeigen Stündliche Zähler je Key, keine Inhalte — NOCH ZU ERGÄNZEN —

13Deine Rechte

Nach der DSGVO kannst du Auskunft über deine Daten verlangen (Art. 15), ihre Berichtigung (Art. 16), ihre Löschung (Art. 17), die Einschränkung der Verarbeitung (Art. 18) und eine Kopie in einem übertragbaren Format (Art. 20). Du kannst einer Verarbeitung widersprechen, die auf ein berechtigtes Interesse gestützt ist (Art. 21), und dich bei einer Aufsichtsbehörde beschweren (Art. 77).

⚠ LÜCKE — ANGABE DES BETREIBERS ERFORDERLICH

Wie diese Rechte ausgeübt werden

Erforderliche Angaben:

  • Anschrift oder Postfach für solche Anfragen
  • Zuständige Aufsichtsbehörde, die sich aus dem Sitz des Unternehmens ergibt
  • Internes Verfahren und Antwortfrist
  • Wie ein Löschverlangen erfüllt wird, solange es keinen Löschpfad gibt

Eine Liste von Rechten ohne Adresse, an die man sie richten kann, nützt niemandem.