4.0.0
Patchwork 4.0 is a complete rewrite of the application in Go. The Django/Python codebase has been replaced by a single statically compiled binary that serves the web interface, REST API, and SMTP ingress daemon.
Highlights:
Single binary deployment: no Python, no virtualenvs, no WSGI servers.
Built-in SMTP/LMTP daemon for receiving emails from Postfix via transport maps.
Webhook support for event-driven integrations.
Auto-generated OpenAPI documentation served at
/api/docs.XML-RPC API removed in favor of the REST API.
Database migration tooling for existing Django installations.
Compatible with existing user credentials (PBKDF2-SHA256 passwords).
For migration instructions from Django-based Patchwork, see Migrating from Django to Go.
v4.0.0-rc1
New Features
Complete rewrite in Go. Patchwork is now delivered as a single static binary (
pw) that replaces Django, gunicorn/uwsgi, virtualenvs, and all Python dependencies. Building requires only a Go toolchain. Deployment requires only the binary and a configuration file.
Built-in SMTP/LMTP ingress daemon (
pw ingress). Incoming email is received directly over SMTP instead of being piped through a shell script. This integrates cleanly with Postfix transport maps and removes the need for special user accounts or database grants for the mail delivery agent.
Webhook support for event notifications. Projects can register webhook endpoints that receive HTTP POST requests when events occur (patch created, state changed, check created, etc.). Payloads are signed with HMAC-SHA256 when a secret is configured.
Upgrade Notes
Configuration has moved from Django Python settings files (
production.py) to a TOML file (patchwork.toml). See the migration guide for a mapping of Django settings to TOML keys.
Database migration from Django 3.2 to 4.0 is supported via
pw db export(reads the old schema) andpw db import(loads into the new schema). See the migration guide for the full procedure.
Postfix integration has changed from
/etc/aliasespiping toparsemail.shto transport maps forwarding to thepw ingressSMTP daemon. See Incoming Email for the new configuration.
User passwords stored in Django’s PBKDF2-SHA256 format are read natively. No password reset is required after migration.
API Changes
The XML-RPC API has been removed. The REST API is the only supported programmatic interface. Clients that relied on XML-RPC (e.g. older versions of
pwclient) should switch to the REST API viagit-pw.
The OpenAPI schema is now auto-generated at runtime and served at
/api/docs. Static schema files are no longer shipped in the source tree.