Sicherheit
Stand: 2026-10-17
Was die Dokumente und Daten schützt, die Sie an Formfeed senden, wo sie liegen und wie lange. Die Einzelheiten stehen in der Dokumentation: Datenresidenz, Authentifizierung und Webhooks.
Wo Ihre Daten liegen
Formfeed rendert nur in der EU. Datenbank und Anmeldung laufen bei Supabase in Frankfurt (AWS eu-central-1). Gerendert wird bei Fly.io in Frankfurt: Chromium für HTML-Vorlagen, LibreOffice für die Umwandlung von Office-Dateien in PDF und der Dienst, der E-Rechnungen und PDF/UA-1-Dateien erzeugt und prüft. Gerenderte Dateien, Dateien der Dateibibliothek, Logos des Brand Kits sowie Word- und PowerPoint-Vorlagendateien liegen in Cloudflare R2 mit EU-Jurisdiktion. Keine andere Region rendert: api-us.formfeed.dev ist für eine US-Region reserviert, die nicht geöffnet ist, und eine Anfrage dorthin rendert ebenfalls in der EU.
Zwei Teile laufen dort, wo es dem Aufrufer am nächsten ist, und das kann außerhalb der EU sein. Das API-Gateway am Edge von Cloudflare leitet jede Anfrage nach Frankfurt weiter, ohne zu speichern, was sie trägt; im globalen Key-Value-Speicher von Cloudflare hält es Angaben zu API-Schlüsseln, Vorlagenversionen und das Brand Kit eine Minute, Schriftenlisten zehn Minuten und die Antworten auf Anfragen mit Idempotenz-Schlüssel 24 Stunden. Die Funktionen der App bei Supabase (das echte Rendering im Editor, die Abrechnung, die Importe von anderen Anbietern) laufen ebenfalls am Standort, der ihrem Aufrufer am nächsten liegt, und speichern nichts außerhalb von Frankfurt.
Ein Workspace kann jede Ausgabe zusätzlich in einen eigenen Bucket kopieren lassen (eigener Speicher, ab Pro): Dieser liegt, wo der Workspace ihn gewählt hat, und Formfeed behält die eigene Kopie für die Aufbewahrungsfrist in der EU. Webhook-Ereignisse gehen an die Adressen, die Sie eintragen.
Trennung
Jede Tabelle mit Daten einer Organisation trägt deren ID und ist durch Row-Level-Security geschützt, die die Datenbank durchsetzt, nicht nur die Anwendung. Die API liest und schreibt nur über Funktionen der Datenbank, die sie mit dem Workspace des Schlüssels aufruft.
Jedes Rendering bekommt in Chromium einen eigenen Browser-Kontext, der mit dem Rendering geschlossen wird; Cookies und Speicher gehen also nicht von einem Rendering auf das nächste über. JavaScript einer Vorlage läuft als Skript dieser Seite, nie im Prozess des Servers selbst. Jede Verbindung, die Chromium öffnet, auch WebSockets, läuft über einen Proxy, der die Adresse nach der DNS-Auflösung prüft: Private Netze, Loopback- und Link-Local-Adressen, Cloud-Metadatendienste und interne Hosts werden abgewiesen, ebenso unverschlüsseltes http; Service Worker sind gesperrt, und WebRTC bekommt kein direktes UDP.
Der Office-Konverter lädt nichts aus dem Web. Er und der E-Rechnungs-Dienst haben keine öffentliche Adresse: Nur die Render-Server erreichen sie, über das private Netz von Fly.io.
Die Vorschauen des Editors laufen in Frames mit Sandbox. Das CDN liefert das aufbewahrte HTML eines fehlgeschlagenen Renderings und jede Datei der Dateibibliothek mit Content-Security-Policy: sandbox aus, sodass eine direkt geöffnete Datei kein Skript ausführt.
Anmeldung und Rollen
Mitglieder melden sich mit Passwort, Magic Link oder einem Google- oder GitHub-Konto an. Die Zwei-Faktor-Authentifizierung ist für jedes Mitglied freiwillig und in jedem Plan enthalten: ein 6-stelliger Code aus einer Authenticator-App (TOTP), verlangt bei der Anmeldung, vor dem Zurücksetzen des Passworts, beim Bestätigen von formfeed login und beim Erlauben eines KI-Agenten. Wiederherstellungscodes gibt es nicht: Ein zweiter Authenticator ist die Reserve, und ohne ihn schaltet der Support den zweiten Faktor erst ab, wenn geprüft ist, dass das Konto Ihnen gehört. API-Schlüssel berührt sie nicht.
Jedes Mitglied hat eine Rolle: Inhaber, Admin, Editor oder Betrachter. Nur Inhaber und Admins legen in der App API-Schlüssel an; der Schlüssel, den formfeed login der Kommandozeile eines Mitglieds gibt, hat nur die Scopes von dessen Rolle. Ein KI-Agent, der über den gehosteten MCP-Server angemeldet ist, kann Vorlagen, Renderings und das Konto lesen und Dokumente rendern, mehr nicht, gleich welche Rolle das Mitglied hat. Ab Pro sehen Inhaber und Admins im Aktivitätsprotokoll, wer Mitglieder, Schlüssel, Vorlagen, Webhooks und Einstellungen geändert hat (30 Tage im Pro-Plan, 365 im Business-Plan).
API-Schlüssel und Webhooks
Ein API-Schlüssel wird einmal angezeigt, wenn er angelegt wird. Formfeed speichert nur einen SHA-256-Hash davon, verbunden mit einem Geheimnis, das den Tresor (Vault) der Datenbank nie verlässt. Ein Schlüssel gehört zu einem Workspace, trägt Scopes und eine Umgebung (Live oder Test), zeigt, wann er zuletzt genutzt wurde, und lässt sich jederzeit widerrufen. Ein widerrufener Schlüssel funktioniert innerhalb einer Minute nicht mehr, weil die API die Angaben eines Schlüssels bis zu 60 Sekunden vorhält. Einen Schlüssel, den eine Webseite sendet, weist die API ab: Schlüssel gehören auf Server.
Zustellungen an einen eingetragenen Webhook-Endpunkt sind mit HMAC-SHA256 über einen Zeitstempel und den Inhalt signiert (Header Webhook-Signature), mit einem Geheimnis, das einmal angezeigt wird. Eine webhook_url pro Rendering wird nur signiert, wenn die Anfrage auch ein webhook_secret mitsendet.
Die Zugangsdaten des eigenen Buckets eines Workspace liegen im Vault der Datenbank, lesbar nur für die Render-Server, und Formfeed schreibt in diesen Bucket nur. Geheimnisse der Plattform liegen in den Secret-Stores der Anbieter, nie im Code.
Download-Links
Download-Links sind signiert, solange Sie nichts anderes wählen: Ein signierter Link gilt höchstens sieben Tage und nie länger, als die Datei aufbewahrt wird, und GET /renders/{id} stellt einen frischen aus. Ein Workspace oder eine Anfrage kann stattdessen öffentliche Links wählen; sie haben keine Signatur und funktionieren, bis die Datei gelöscht wird. Nutzen Sie sie nur für Dokumente, die nicht vertraulich sind. Dateien der Dateibibliothek werden immer ohne Signatur ausgeliefert, unter einer Adresse aus Workspace-ID und Dateiname; Kundendokumente gehören deshalb nicht in die Bibliothek. Siehe Download-Links, Zugriff und Aufbewahrung.
Verschlüsselung
Verbindungen über das Internet sind mit TLS verschlüsselt. Zwischen den Render-Servern und den Konvertern, die sie aufrufen, bleibt der Verkehr im privaten Netz von Fly.io. Datenbank, Backups und Dateispeicher sind im Ruhezustand verschlüsselt.
Aufbewahrung
Gerenderte Dateien werden gelöscht, wenn die Aufbewahrungsfrist des Plans endet: 1 Tag im Free-Plan, 30 Tage im Starter-Plan, 365 Tage im Pro-Plan, ohne Limit im Business-Plan. Die Einstellung eines Workspace und expires_in einer Anfrage können sie nur verkürzen, Ausgaben von Test-Renderings bleiben höchstens 24 Stunden, und jede Ausgabe lässt sich über die API früher löschen. Ein Batch-Zip wird gelöscht, wenn die erste Datei darin abläuft (eine früher über die API gelöschte Datei bleibt bis dahin im Zip); sein Link läuft nach höchstens sieben Tagen ab.
Die Daten, die Sie senden, dienen dem Rendering und werden danach verworfen, es sei denn, der Workspace schaltet „Render-Anfragen aufbewahren“ ein (24 Stunden ab Starter, bis zu 7 Tage ab Pro), um fehlgeschlagene Renderings erneut auszuführen; jeder Lesezugriff auf eine aufbewahrte Anfrage wird ins Audit-Log geschrieben, und Passwörter für den PDF-Schutz werden nie aufbewahrt. Ein fehlgeschlagenes Rendering behält sein zusammengesetztes HTML, das seine Daten enthält, 24 Stunden lang, damit das Render-Protokoll zeigen kann, was fehlgeschlagen ist. Schriften und Bilder, die Vorlagen aus dem Web laden, werden bis zu 7 Tage auf den Render-Servern zwischengespeichert.
Das Render-Protokoll behält Metadaten (Status, Zeiten, Einheiten, Vorlagenversion, Ihr meta, Prüfsummen), nie das Dokument; seine Einträge werden nach 13 Monaten gelöscht, später nur, solange die Datei, zu der sie gehören, noch gespeichert ist. Das Löschen eines Workspace widerruft seine Schlüssel sofort und entfernt seinen Inhalt nach 30 Tagen; das Löschen der Organisation entfernt ihre Daten nach 30 Tagen und aus den Backups innerhalb weiterer 30 Tage.
Betrieb
Die Datenbank sichert Supabase. Fehler der API und der Render-Server gehen an Sentry in dessen EU-Datenregion, ohne Anfrageinhalte. Verfügbarkeitsmonitore prüfen die öffentlichen Endpunkte aus Europa und den USA, und die Statusseite zeigt Störungen und geplante Wartung. Abhängigkeiten werden jede Nacht gegen veröffentlichte Sicherheitshinweise geprüft. Jedes Rendering hält den Chromium-Build fest, mit dem es entstand, eine Prüfsumme der Vorlagenversion und einen SHA-256 der Datei; so lässt sich ein Dokument auf das zurückführen, was es erzeugt hat.
Vorfälle
Betrifft eine Verletzung des Schutzes personenbezogener Daten Ihre Daten, melden wir sie Ihnen unverzüglich mit dem, was zu diesem Zeitpunkt bekannt ist, und ergänzen im Lauf der Untersuchung, wie es der Auftragsverarbeitungsvertrag vorsieht.
Verantwortungsvolle Offenlegung
Melden Sie Schwachstellen an security@formfeed.dev (PGP auf Anfrage). Wir bestätigen innerhalb von zwei Werktagen, halten Sie auf dem Laufenden und gehen nicht rechtlich gegen Forschung in gutem Glauben vor, die Datenschutzverletzungen, Datenzerstörung und Störungen des Dienstes vermeidet. Unsere security.txt nennt den Kontakt für automatische Werkzeuge.
Compliance
DSGVO: Ein Auftragsverarbeitungsvertrag nach Art. 28 ist Teil der Bedingungen jedes bezahlten Plans, und Free-Workspaces können ihn per E-Mail anfordern. Die Liste der Unterauftragsverarbeiter nennt jeden Anbieter, und Inhaber der Organisation erfahren von einer Änderung 30 Tage vorher. Vorlagen und Renderings lassen sich über die API und die CLI exportieren; Ausgaben werden über die API gelöscht, Workspaces in der App oder über die API, die Organisation in der App. Formfeed hat keine Zertifizierung nach SOC 2 oder ISO 27001.