Digitale Vorgangsbearbeitung für die öffentliche Verwaltung
Vorgangswerk ist eine quelloffene Plattform zur digitalen Bearbeitung von Verwaltungsvorgängen. Antragsformulare, Workflows, Dokumente und Kommunikation – in einer Anwendung, selbst gehostet, OZG-konform.
Lizenz: EUPL-1.2 · Sprache: Deutsch · Stack: Django · PostgreSQL · Docker
Viele Behörden – besonders Kommunen und kleine Träger – stehen vor demselben Problem: Anträge kommen per E-Mail oder Papier rein, werden in Excel verwaltet, und der Bearbeitungsstatus ist für niemanden transparent. Kommerzielle Lösungen sind teuer, proprietär und oft überdimensioniert.
Vorgangswerk schließt diese Lücke:
- Kein Vendor Lock-in – Open Source unter EUPL-1.2, selbst gehostet, volle Datenkontrolle
- Kein IT-Großprojekt – läuft mit
make pullin unter einer Minute, ein einziger Docker-Befehl - Für die Praxis gebaut – Formulare, Workflows, Dokumente und Postfach in einer Anwendung statt vier verschiedenen Systemen
- OZG-konform – BundID-Anbindung (SAML SP), öffentliche Antragsstrecken ohne Login, LeiKa-Schlüssel, FIT-Connect Eingang & Ausgang
- Barrierefrei – BITV 2.0 / WCAG 2.1 AA, gesetzliche Pflichtanforderung für Behördensoftware
- Souverän – kein SaaS, keine Cloud-Abhängigkeit, läuft on-premise oder im eigenen Rechenzentrum
Für wen: Kommunalverwaltungen, Zweckverbände, kommunale Unternehmen, Behörden auf Landes- und Bundesebene sowie gemeinnützige Organisationen mit Verwaltungsaufgaben.
Viele Behörden nutzen PDF-Formulare, die sie gar nicht ändern können – vorgegeben vom Land, rechtlich bindend, oder seit Jahren als verbindliche Vorlage im Einsatz. Ein neues System einzuführen bedeutet dann meistens: alle Formulare neu bauen, neu abstimmen, neu genehmigen lassen.
Vorgangswerk macht das überflüssig.
Eine Gemeinde hat einen zweiseitigen Antrag auf Wohnberechtigungsschein als PDF-Formular. Das Formular ist vom Kreis vorgegeben – die Gemeinde darf es nicht ändern. Bisher: Bürger druckt es aus, füllt es mit der Hand aus, schickt es per Post.
Mit Vorgangswerk:
- Das bestehende PDF wird einmalig hochgeladen
- Eine KI erkennt automatisch alle Felder – Name, Adresse, Familienstand, Ankreuzfelder, Datumsfelder
- Daraus entsteht eine digitale Antragsstrecke: Schritt für Schritt, auf dem Smartphone, mit Validierung
- Wenn der Bürger fertig ist, werden seine Angaben automatisch in das originale Formular des Kreises eingetragen – jedes Feld an der richtigen Stelle, jedes Kästchen mit dem richtigen Kreuz
Das Amt bekommt am Ende genau das PDF, das es kennt – vollständig ausgefüllt, kein Abtippen, kein Papier. Das Formular selbst hat sich kein bisschen geändert.
| Vorher | Mit Vorgangswerk |
|---|---|
| Bürger druckt aus, füllt handschriftlich aus | Bürger füllt online aus – Handy, Tablet, PC |
| Einscannen oder per Post einschicken | PDF kommt vollständig ausgefüllt direkt an |
| Sachbearbeiter tippt Daten ins System | Daten liegen strukturiert vor – kein Abtippen |
| Neues System? Alle Formulare neu bauen | Bestehende Formulare einfach hochladen |
Für wen das besonders relevant ist: Kommunen, Kreise und Träger, die Formulare von übergeordneten Behörden übernehmen und keinen Spielraum bei Gestaltung oder Struktur haben.
Visueller Pfad-Editor – Verzweigte Antragsformulare per Drag & Drop
Prozesszentrale – Überfällige Tasks, laufende Workflows, Sachbearbeiter-Übersicht
Bürgerseitige Antragsstrecke – Mit Fortschrittsbalken, Breadcrumb-Navigation und mobilem Layout
- Visueller Pfad-Editor zum Aufbau mehrstufiger Antragsformulare (Drag & Drop, Verzweigungen, Transitionen)
- Über 20 Feldtypen: Text, Auswahl, Datum, Datei-Upload, Unterschrift, Tabelle, Adresse, IBAN u. v. m.
- Bedingte Felder (
zeige_wenn) – Felder ein-/ausblenden abhängig von anderen Eingaben - Öffentliche Antragsstrecken – ohne Login, mit Tracking-Link für Antragsteller
- Quiz & Prüfbögen – Multiple-Choice-Tests mit automatischer Auswertung und Zertifikat (geeignet für Einweisungen, Schulungen, Einbürgerungstest)
- PDF-Ausgabe ausgefüllter Anträge (WeasyPrint)
- Webhook-Benachrichtigungen bei Abschluss (JSON-POST an externe Systeme)
- Modellierung von Geschäftsprozessen als visuelle Workflows (Knoten, Transitionen, Bedingungen)
- Aufgabenverwaltung mit Zuweisung an Benutzer und Teams
- Arbeitsstapel-Übersicht für Sachbearbeiter
- Prozesszentrale mit Gesamtüberblick aller laufenden Instanzen
- Verwaltung von Dokumenten mit Versionierung und Zugriffsschutz
- Integration von OnlyOffice (WOPI) zur direkten Bearbeitung im Browser
- Klassifizierung als öffentlich, intern oder sensibel
- Zeitlich begrenzte Zugriffsschlüssel für sensible Dokumente (AES-256-GCM)
- Automatisches Backup (täglich/wöchentlich/monatlich)
- IMAP-basierter E-Mail-Worker für eingehende Nachrichten
- Postfach-Ansicht mit Zuordnung zu Vorgängen
- E-Mail-Benachrichtigungen bei Workflow-Ereignissen
- FES (Fortgeschrittene Elektronische Signatur) intern via pyHanko
- QES (Qualifizierte Elektronische Signatur) via sign.me (Bundesdruckerei)
- Signaturstatus, Validierung und Zertifikatsverwaltung
- Prepaid-Portal für externe Nutzer
- PDF-Formular hochladen → Claude KI analysiert Struktur → fertiger Pfad wird automatisch angelegt
- Stripe-Integration für Credit-Kauf
- BentoPDF / Stirling-PDF Integration als PDF-Werkzeug
- SAML SP-Integration implementiert – Anbindung an
test.id.bund.de/id.bund.deohne Codeänderungen möglich - HTTP-POST-Binding, ACS-Callback, SP-Metadaten-Endpoint
- Benutzeranlage und -aktualisierung anhand des bPK2 (Bereichsspezifisches Personenkennzeichen)
- Getestet mit offiziellem BundID-Simulator (
ghcr.io/ba-itsys/bundid-simulator) - Für Produktivbetrieb: SP-Registrierung beim ITZBund + SP-Zertifikat (kein Codeaufwand)
- OZG-Anforderung erfüllt: Kommunen benötigen kein eigenes Identity-Management
Eingang – Vorgangswerk als Backend-Fachverfahren hinter der OZG-Super-App:
- Nimmt Submissions von der OZG-Super-App oder anderen FIT-Connect-Sendern entgegen
- Automatische Zuordnung über LeiKa-Schlüssel zum passenden Antragspfad
- FIM-Feldzuordnung – FIM-IDs (
F6xxxxxxx) werden auf interne Felder gemappt - JWE-Entschlüsselung mit RSA-4096 (Subscriber-Zertifikat der FITKO)
- Workflow-Start, Benachrichtigungs-E-Mails und Audit-Log automatisch nach Eingang
- Export bestehender Anträge als FIT-Connect Submission Payload (
/api/antrag/{nr}/fitconnect/)
Ausgang – Anträge direkt ins Fachverfahren der Empfangsbehörde:
- Abgeschlossene Anträge werden JWE-verschlüsselt per FIT-Connect übermittelt – kein PDF per E-Mail, kein Abtippen
- OAuth2 Client Credentials, Ende-zu-Ende-Verschlüsselung mit dem öffentlichen JWK der Empfangsbehörde
- Metadata-Schema 2.0, SHA-512 Inhaltsprüfung, Anhänge verschlüsselt übertragen
- Manueller Versand per Button in der Auswertung; Destination-ID pro Formular konfigurierbar
- Für Produktivbetrieb: Destination-ID der Empfangsbehörde eintragen – kein weiterer Codeaufwand
- Benutzerverwaltung mit MFA (TOTP), Brute-Force-Schutz (django-axes)
- REST-API via django-ninja (OpenAPI-Doku unter
/api/docs) - Dashboard mit Live-Daten aus allen Apps
- Profilverwaltung mit Benachrichtigungseinstellungen
Vorgangswerk ist auf Konformität mit BITV 2.0 / WCAG 2.1 AA ausgerichtet – Pflichtanforderung für Behördensoftware gemäß § 12a BGG.
Umgesetzte Maßnahmen:
- Tastaturnavigation: Skip-Link, semantische Landmarks (
<main>,<nav>,<footer>),tabindex-Fokus-Management - Screenreader:
aria-hiddenauf alle dekorativen Icons/Emojis,aria-labelauf Kachel-Links und Schaltflächen - Formulare:
<fieldset>/<legend>für Radio- und Checkbox-Gruppen, korrekte<label for=...>-Verknüpfung,aria-requiredauf Pflichtfeldern, Pflichtfeld-Sterne mitaria-hidden - Fortschrittsanzeige:
<nav aria-label="Formularfortschritt">mitaria-current="step"auf dem aktiven Schritt - Fehlermeldungen:
role="alert"+aria-live="assertive", Fokus springt automatisch auf Fehler-Box - Überschriftenhierarchie: Abschnitts-Header als
<h2 class="h6">(kein H1→H6-Sprung) - Signatur-Feld:
role="img"+aria-labelledbyauf Canvas, Tastatur-Alternative (Bestätigungs-Checkbox) - Gruppen-Felder:
role="list"/role="listitem", Fokus nach Hinzufügen auf erstes Feld des neuen Eintrags
| Komponente | Technologie |
|---|---|
| Backend | Django 5.x, Python 3.12 |
| Datenbank | PostgreSQL 16 |
| PDF-Generierung | WeasyPrint |
| Dokumenteneditor | OnlyOffice (WOPI) |
| Statische Dateien | Whitenoise |
| Webserver | Gunicorn |
| Deployment | Docker / Docker Compose |
| KI-Analyse | Anthropic Claude API |
| Zahlung | Stripe |
| Signatur | pyHanko, sign.me |
Eine öffentliche Demo-Instanz ist verfügbar unter:
https://vorgangswerk.georg-klein.com
| Feld | Wert |
|---|---|
| Benutzer | demo@vorgangswerk.de |
| Passwort | Demo1234! |
| Rolle | Sachbearbeiter (kein Admin, keine Benutzerverwaltung) |
Voraussetzungen: Docker, Docker Compose, Make
# 1. Repository klonen
git clone https://github.com/geolohmar-star/vorgangswerk.git
cd vorgangswerk
# 2. .env anlegen und anpassen
make setup
# SECRET_KEY generieren:
python -c "import secrets; print(secrets.token_urlsafe(50))"
# Wert in .env bei SECRET_KEY eintragen, DB_PASSWORD setzen
# 3. Fertiges Image laden und starten
make pull
# 4. Superuser anlegen
make superusermake setup # .env anlegen
make build # Image bauen und starten
make superuserDie Anwendung ist danach unter http://localhost:8100 erreichbar.
make start # Starten
make stop # Stoppen
make restart # Web-Container neu starten
make logs # Logs live verfolgen
make shell # Django-Shell
make demo # Demo-Daten laden (Beispiel-Pfad, Workflow, Testbenutzer)
make update # git pull + neu bauen + migrieren# Mit eigenem OnlyOffice-Container
docker compose --profile onlyoffice up -d| Variable | Pflicht | Beschreibung |
|---|---|---|
SECRET_KEY |
Ja | Django Secret Key |
DB_PASSWORD |
Ja | PostgreSQL-Passwort |
ALLOWED_HOSTS |
Ja | Kommagetrennte Hostnamen |
ANTHROPIC_API_KEY |
Nein | Für KI-Formularanalyse (Portal) |
ONLYOFFICE_URL |
Nein | URL des OnlyOffice-Servers |
ONLYOFFICE_JWT_SECRET |
Nein | JWT-Secret für OnlyOffice |
SIGNME_API_KEY |
Nein | Für QES via sign.me |
EMAIL_HOST |
Nein | SMTP für ausgehende E-Mails |
IMAP_HOST |
Nein | IMAP für eingehende E-Mails |
STRIPE_PUBLIC_KEY |
Nein | Stripe (Portal-Zahlungen) |
STRIPE_SECRET_KEY |
Nein | Stripe Secret |
VERSCHLUESSEL_KEY |
Nein | AES-Key für sensible Dokumente |
BENTOPDF_URL |
Nein | URL zu BentoPDF/Stirling-PDF |
FITCONNECT_CLIENT_ID |
Nein | OAuth2 Client-ID für FIT-Connect Ausgang (Sender) |
FITCONNECT_CLIENT_SECRET |
Nein | OAuth2 Client-Secret für FIT-Connect Ausgang |
FITCONNECT_DESTINATION_ID |
Nein | Standard-Destination-ID (kann pro Formular überschrieben werden) |
FITCONNECT_CALLBACK_SECRET |
Nein | HMAC-Secret für FIT-Connect Callback-Verifizierung |
Eine vollständige Vorlage: .env.example
vorgangswerk/
├── core/ – Benutzerverwaltung, Dashboard, API
├── formulare/ – Pfad-Editor, Antragsstrecken, Quizmodul
├── workflow/ – Workflow-Engine, Arbeitsstapel
├── dokumente/ – DMS, OnlyOffice-Integration
├── kommunikation/ – E-Mail-Worker, Postfach
├── korrespondenz/ – Briefvorlagen, Schreiben
├── signatur/ – FES/QES-Integration
├── portal/ – KI-Portal, Stripe, PDF-Analyse
├── quiz/ – Fragenpools, BAMF-Einbürgerungstest
├── config/ – Django-Einstellungen, URLs
├── static/ – JavaScript, CSS
├── templates/ – Basis-Templates
└── docker-compose.yml
| Problem | Lösung |
|---|---|
| Container startet nicht | make logs → fehlende .env-Werte prüfen (SECRET_KEY, DB_PASSWORD) |
| Datenbank nicht erreichbar | docker compose ps db → docker compose restart db |
| CSS/JS fehlt | docker compose exec web python manage.py collectstatic --noinput |
| Migrationen fehlgeschlagen | docker compose exec web python manage.py migrate --verbosity 2 |
| E-Mail wird nicht versandt | docker compose exec web python manage.py sendtestemail test@beispiel.de |
| OnlyOffice öffnet nicht | WOPI_BASE_URL muss vom OnlyOffice-Container erreichbar sein |
| Gesperrter Benutzer (MFA) | docker compose exec web python manage.py axes_reset |
| Speicherplatz voll | docker system prune -f + alte Sicherungen prüfen |
Ausführliche Hilfe: docs/BETRIEB.md
| Dokument | Inhalt |
|---|---|
| Betriebsanleitung | Updates, Backup/Restore, Logs, E-Mail, HTTPS, Troubleshooting |
| Architektur | App-Struktur, Datenmodelle, Datenfluss, Erweiterungspunkte |
| Mitwirken | Entwicklungsumgebung, PR-Workflow, Code-Stil |
Beiträge sind willkommen. Bitte:
- Fork erstellen
- Feature-Branch anlegen (
git checkout -b feature/mein-feature) - Änderungen committen
- Pull Request öffnen
Für größere Änderungen, Fragen oder Fehlerberichte bitte ein GitHub Issue anlegen.
Veröffentlicht unter der European Union Public Licence 1.2 (EUPL-1.2).
Die EUPL-1.2 ist die offizielle Open-Source-Lizenz der Europäischen Kommission – entwickelt speziell für den Einsatz in der öffentlichen Verwaltung. Sie ist in allen 23 EU-Amtssprachen rechtsverbindlich verfasst und damit eine der wenigen Lizenzen, die in einem deutschen Behördenumfeld ohne rechtliche Graubereiche eingesetzt werden kann.
Für den Verwaltungseinsatz relevant:
- Nutzung ist kostenfrei und dauerhaft gesichert – keine Abhängigkeit von Lizenzgebühren oder Herstellerentscheidungen
- Quellcode-Einsicht ist garantiert – Behörden können den Code prüfen, anpassen und weitergeben
- Copyleft-Pflicht – Weiterentwicklungen müssen ebenfalls unter EUPL veröffentlicht werden; verhindert proprietäre Abspaltungen
- Kompatibel mit opencode.de – der deutschen Open-Source-Plattform für die Verwaltung; EUPL-1.2 ist dort die bevorzugte Lizenz
- Kompatibel mit GPL, LGPL, MPL u. a. – problemlose Kombination mit anderen Open-Source-Komponenten
Georg Klein · vorgangswerk@georg-klein.com
Für Bugs und Feature-Anfragen bitte GitHub Issues verwenden.


