Plugwerk 1.0.0-beta.3
Released: 2026-05-10 · GitHub release · Docker image
The third beta brings a complete transactional-email pipeline (SMTP backend, admin templates, Mailpit profile for local development), self-service user registration with forgot-password / reset-password flows, a sweep of security and performance fixes, and small but real breaking changes on the Client SDK that downstream hosts will want to plan for.
Highlights
Section titled “Highlights”- Transactional email infrastructure — SMTP backend, admin pages for SMTP configuration and email-template management, an editorial-minimal HTML layout for outgoing mail, and an opt-in Mailpit profile so local development gets a catch-all inbox without external SMTP.
- Self-service registration — application-setting gated. Operators can enable a public sign-up flow with email verification.
- Forgot-password / reset-password — same gating model. End users recover access without an admin round-trip when the setting is on.
- Superadmin-triggered password reset — admins can send a reset email to any user from the user-admin UI; the user then completes the reset themselves.
- Catalog correctness for the Client SDK —
PlugwerkCatalognow walks every server page inlist/search/releases, so paginated catalogs no longer truncate at the first page. - Mailpit local SMTP catch-all —
docker compose --profile mail up -dbrings up a one-process inbox athttp://localhost:8025that the server can talk to over plain SMTP, no external account required.
Breaking changes
Section titled “Breaking changes”- Client SDK —
PlugwerkInstallernow drives the PF4JPluginManagerlifecycle. The installer takes ownership ofloadPlugin/startPlugin/unloadPlugin, removing the older lifecycle-wrapper indirection that some hosts had to mirror manually. Hosts that hand-rolled the plugin lifecycle around the SDK will need to drop their wrapper. The follow-up SDK reference docs are tracked in website#83. - Client SDK —
connect()now threads thePluginManagerso the deprecated PF4J wrapper can be retired. The new shape is documented in Client Plugin → Configuration. /api/v1/admin/usersis now paginated. Anyone consuming the endpoint via raw HTTP needs to honour the new pagination wrapper. The Admin UI handles this transparently.- OIDC client-secret encryption switched from AES-CBC to AES-GCM. The on-disk format is upgraded transparently the first time a secret is read or rotated; no operator action required, but secrets stored under the previous scheme are re-encrypted opportunistically. Plan for a small one-time write amplification on first reads after the upgrade.
- JWTs without
jti,sub, oriatare now rejected with a clear error. Hand-rolled test tokens that omitted any of these will start failing — regenerate them.
Upgrade notes
Section titled “Upgrade notes”-
Pull the new image:
Terminal window docker pull plugwerk/plugwerk-server:1.0.0-beta.3 -
Audit any custom integrations against the breaking-change list above. The Client SDK changes are the most likely to affect a live deployment; the JWT / pagination changes only affect raw integrators.
-
Decide whether to enable the new application settings.
- Self-service registration — off by default. Enable from the admin settings page once you have decided whether it fits your access model.
- Forgot-password / reset-password — off by default; enable in the admin settings page. Requires SMTP to be configured first.
-
Configure SMTP if you want any of the email-driven features (registration verification, password reset, superadmin-triggered reset). Use Admin → Email → SMTP in the web UI, or in development the new Mailpit profile:
Terminal window docker compose --profile mail up -d# Mailpit web UI at http://localhost:8025 -
Verify the upgrade:
curl http://<your-host>/actuator/healthreturns{"status":"UP"}.- Existing users can still log in (their refresh cookies survive the upgrade).
Admin → Email → Templateslists the bundled templates.
Other notable changes
Section titled “Other notable changes”Security
Section titled “Security”- SSRF guard for OIDC discovery and stored URIs — the server refuses to talk to private-network or link-local addresses when probing or refreshing an issuer URI.
- Defense-in-depth
@PreAuthorizesweep across admin list endpoints — closes a handful of cases where the route handler was the only authorization gate. - Constant-time padding on the forgot-password 204 response — the handler now takes a fixed minimum time regardless of whether the email exists, removing a timing oracle.
- Multiple dependency CVEs cleared — axios bumped through 13 advisories,
postcssbumped to clear CVE-2026-41305,yamlbumped to clear CVE-2026-33532.
Performance
Section titled “Performance”- N+1 query fix in
UpdateCheckService— the clientupdatepoll for hosts with large installed-plugin sets is now a small, bounded number of queries instead of one per plugin. - Pagination on
/admin/userswith optional server-side search via theqquery parameter — the previous unbounded list could time out on large installations. - Storage I/O moved out of
@Transactionalboundaries in delete paths — long-running storage deletes no longer hold a database transaction open. - Deterministic latest-release picking per plugin in the catalog — fixes a non-deterministic ordering on simultaneous publishes that occasionally surfaced an older release as "latest".
Bug fixes
Section titled “Bug fixes”@RequestParamconstraint violations now return HTTP 400 instead of 500 — proper input-validation semantics on the affected endpoints.- Settings cache refresh deferred until after transaction commit — fixes a race where a partially-applied settings update could be observed by other threads.
- Public response shape for the catalog list endpoint stabilised — internal-only fields are no longer leaked.
Developer experience
Section titled “Developer experience”- MUI Material v7 → v9 frontend migration — only relevant if you fork the admin frontend.
- Self-hosted Renovate for the main repo (operator-invisible).
Full changelog
Section titled “Full changelog”See the GitHub release notes for the complete commit-level changelog and individual PR links.