Cadder coordinates local Caddy projects that would otherwise compete for the same HTTP and HTTPS listeners. Projects keep the familiar caddy run workflow while one per-installation cadderd daemon owns the real Caddy process and combines active routes.
Published documentation: https://maxie.dev/cadder/
Cadder 1.0 consists of three version-matched executables:
cadderdowns local IPC, registrations, SQLite state, redacted logs, effective Caddy configuration, and the real Caddy child process.caddyis the PATH-facing shim.caddy runstarts or attaches tocadderd, registers the current project, sends heartbeats, and unregisters on exit.cadderprovides lifecycle, inspection, diagnostics, bounded logs, and a routes-first TUI.
Keep all three executables together. Configure the trusted real Caddy source in cadder.toml beside them:
[caddy]
real_path = "C:/Tools/caddy/caddy.exe"Use real_command instead when a separately named real Caddy executable is available on PATH. Configure exactly one source.
- Download the matching
cadderarchive and SHA-256 file for your platform from GitHub Releases. - Extract its
cadder,cadderd, andcaddyexecutables into one user-owned directory. - Copy
cadder.toml.exampletocadder.tomland configure real Caddy. - Put the directory on PATH, run
caddy runin each project, then usecadder statusor opencadder tui.
Managed caddy run starts the matching daemon automatically when it is not already running. Mixed Cadder versions fail the exact protocol handshake before changing runtime state.
Install mise, then use the pinned project environment:
mise install --locked
mise tasks
mise run check
mise run tui-webmise run tui-web launches the TUI through the exact ttyglass npm package declared by the project. just tui-web is the short convenience entrypoint for the same task.
See CONTRIBUTING.md, SECURITY.md, and docs/ARCHITECTURE.md.
Cadder is licensed under the Apache License 2.0. See LICENSE.
