πŸš€ Release Roundup

CaddyUI v2.10.9 β€” Smart Caddyfile import: paste once, get Proxy Hosts

Paste a Caddyfile and CaddyUI now classifies each site block into a Proxy Host, Redirection, or Advanced route automatically β€” no more "everything ends up as Advanced". Plus a re-classify button for older imports, ~70 new per-host options shipped across the v2.10 arc, path-based routing on proxy hosts, and baseline security headers on CaddyUI's own responses.

v2.10.9 β˜• ~9 min read

πŸ“₯ Smart Caddyfile import β€” paste once, get the right resource type v2.10.7 β†’ v2.10.9

This is the headline of the release. Until v2.10.6, pasting a Caddyfile into /caddyfile-import turned every site block into an Advanced (raw JSON) route β€” even the trivial example.com { reverse_proxy localhost:3000 } ones. They worked fine, but you lost the form-driven editor: the per-host security headers, health checks, alias management, all the things the proxy-host UI exists for.

v2.10.7 fixes that. Each pasted block is now inspected after Caddy's /adapt runs and routed to the right table:

Block looks likeImported as
host(s) + a single reverse_proxyProxy Host β€” full edit form
host(s) + a single redirRedirection
custom matchers, multiple handlers, layer-4, anything exoticAdvanced route β€” JSON preserved verbatim

The classification runs after Caddy normalises the Caddyfile, so you don't get false negatives from quirky-but-equivalent syntax. The auto-classify checkbox is on by default β€” uncheck it if you want the old "everything as Advanced" behaviour for full control of the JSON.

v2.10.8 β€” knowing what just happened

Importing 30 blocks in one paste produces 30 rows. v2.10.8 makes the result page tell you what each one became:

v2.10.9 β€” rescuing older imports

If you imported your Caddyfile under v2.10.6 or earlier, your proxy-shaped blocks are sitting on /raw-routes as Advanced rows. v2.10.9 adds a "Re-classify" button at the top of /raw-routes that re-runs the v2.10.7 classifier across every visible Advanced row:

Why this matters in practice. The proxy-host form is where ~70 of CaddyUI's options live β€” security headers, health checks, alias domains, managed DNS, the deploying-page poller, the v2.7.7 duplicate-domain guard, all of it. An Advanced row is an opaque JSON blob that none of those features can introspect. Re-classifying turns those rows back into editable, observable, governable proxy hosts in one click.

πŸ”§ ~70 per-host options + path-based routing v2.10.0

v2.10.0 was the GA cut of a long preview cycle (v2.9.0 β†’ v2.9.267). Two structural features and around seventy individual per-host options landed:

Two structural features

~70 per-host options across four batches

Eight features per batch, four batches, plus ad-hoc additions. A non-exhaustive sample of the categories:

Migrations are additive (ALTER TABLE ADD COLUMN guarded by a column-existence check), so upgrading from any v2.7.x or v2.8.x doesn't require any manual steps.


With ~70 fields on the proxy-host edit form, finding the one you want became its own challenge. v2.10.2 adds a search box at the top of the form that filters fields live as you type β€” match against the field label, hint text, or the underlying option name. Tab headers stay visible; matching fields glow, non-matches fade. Clearing the box restores the full form.

Looking for the X-Forwarded-Proto toggle? Type "forwarded". CSP override? Type "csp". Fastest way to navigate a dense form without imposing a new IA on it.


πŸ›‘οΈ Baseline security headers on CaddyUI's own responses v2.10.3 β†’ v2.10.5

CaddyUI itself is a web app, served by Caddy. v2.10.3 adds a baseline security-header bundle to CaddyUI's own response chain β€” separate from any per-host headers you toggle on for your downstream sites. Defaults that Mozilla Observatory rates A+ out of the box:

v2.10.4 fixed a bundle-dedup bug where the initial implementation could ship two copies of the same header when both the global bundle and a per-host toggle set the same name. v2.10.5 generalised the fix: per-header response setters now go through a delete + set pattern so the upstream's value is unconditionally replaced, instead of being appended next to a CaddyUI-set value (which some clients honour differently).

If you front CaddyUI with another reverse proxy (e.g. Cloudflare in front of Caddy in front of CaddyUI), check that the outer proxy isn't also setting these headers β€” otherwise you'll see duplicates in the response. Either disable them on the outer layer or drop the v2.10.3 baseline (it's per-toggle in Settings).

πŸ“š Caddyfile ↔ form-field mapping v2.10.6

Built-in docs at /docs got a new section: a side-by-side mapping of every Caddyfile directive to the proxy-host form field that produces it. Inline links from the Caddyfile-import page route you to the relevant doc anchor when a paste fails. Useful when you're hand-translating an old Caddyfile and want to know which form field corresponds to header_up, handle_errors, tls dns cloudflare, etc.


πŸ“¦ Upgrade

docker compose pull && docker compose up -d

Or in Portainer: Recreate β†’ enable Re-pull image. Migrations run automatically on startup. No downtime beyond the container restart.

Multi-arch on Docker Hub (linux/amd64 + linux/arm64, SBOM + provenance attestations, scratch base, non-root UID 10001):

docker pull applegater/caddyui:v2.10.9
# or, for the rolling preview tag (single-arch amd64)
docker pull applegater/caddyui:preview

Note: :latest still points at v2.10.0 β€” the :latest retag bundles roughly eight features at a time to keep the rolling tag stable. v2.10.7/8/9 are on :preview and the per-version tags. :latest will move forward once a few more features land.

πŸ—ΊοΈ On the whiteboard

Want something specific? Open an issue on GitHub.