modules/programs/agents/shared/skills/caddy/SKILL.md
Inspect and manage my self-hosted Caddy reverse proxy via its admin API. Use when the user asks about Caddy, mentions reverse proxy routes, virtual hosts, TLS/cert issues for internal `.lan` domains, upstream health, or wants to view/reload the active Caddy configuration.
npx skillsauth add MichaelVessia/nixos-config caddyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Manage my self-hosted Caddy reverse proxy through its admin API: inspect the running config, list routes and upstream pools, check the internal CA, and hot-reload a new config file.
The admin API URL is exported into the shell by sops-nix (see
modules/programs/shell.nix):
CADDY_URL — base URL of the admin API, no trailing slash
(e.g. http://192.168.1.252:2019)The Caddy admin API has no authentication. It is bound to a LAN-only
address on the LXC host; off-network access requires tailscale/VPN. The caddy
CLI reports a JSON error envelope when CADDY_URL is missing.
Use the installed caddy CLI for common operations. It always emits a single
JSON envelope with ok, command, result or error, and next_actions.
scripts/caddy.sh remains as a compatibility shim for older workflows.
caddy config # GET /config/ (full active config)
caddy routes # matchers + upstreams per server
caddy upstreams # live reverse-proxy pool + health
caddy pki-ca # internal CA info (GET /pki/ca/local)
caddy reload <config.json> --confirm-reload # POST /load, confirm first
For anything not covered, call the API directly with $CADDY_URL — see
references/api-endpoints.md and references/quick-reference.md.
caddy routes to see all matchers + their upstream dials.curl -fsS "$CADDY_URL/config/" | jq '
.apps.http.servers[].routes[]
| select(.match[]?.host[]? == "example.lan")
'
caddy upstreams..lan domainsThis Caddy uses tls.automation.issuers.module = internal, i.e. Caddy's
built-in CA. Clients must trust Caddy's root CA cert to avoid browser
warnings:
caddy pki-ca — returns the CA's root_certificate (PEM).update-ca-certificates on Linux, mobile profile, etc.).reload replaces the entire active configuration atomically. Caddy validates
the new config first, but a bad config that still parses can take services
offline. Always confirm with the user before:
caddy reload <file> --confirm-reload — replaces the running configPOST /load, PATCH /config/..., PUT /config/...,
DELETE /config/..., or POST /stop callRequire the user to say something explicit like "yes, reload" or "go ahead, apply it" before invoking. Show them the diff of what will change first when possible.
references/api-endpoints.md — admin API endpoints used here (/config/,
/load, /reverse_proxy/upstreams, /pki/ca/local)references/quick-reference.md — copy-paste curl recipesreferences/troubleshooting.md — admin API reachability, invalid configs,
internal-CA cert trust issues/load.192.168.1.252:2019). Off-network access requires
tailscale or VPN.CADDY_URL is unreachable, surface that to the user rather than
guessing.tools
User guide for the local squash-safe `stack` CLI for stacked PR/MR repair on GitHub and GitLab. Use when someone asks how to inspect, track, sync, merge, document, or undo stacked pull requests / merge requests in squash-merge repositories. Prefer this tool over GitHub's `gh stack` command for this workflow.
tools
Control herdr from inside it. Manage workspaces and tabs, split panes, spawn agents, read output, and wait for state changes — all via CLI commands that talk to the running herdr instance over a local unix socket. Use when running inside herdr (HERDR_ENV=1).
development
Inspect my self-hosted AutoCaliWeb library. Use when the user asks about AutoCaliWeb, books in Calibre, OPDS status, recent imports, shelves, catalog stats, or wants to search the ebook library.
data-ai
Subscribe a YouTube channel in TubeArchivist, queue its top videos by views from recent uploads, wait for the first file, scan Jellyfin, and rename + lock the channel folder to a friendly display name. Use when the user says "add a youtube channel", "subscribe to <channel>", or wants a curated TubeArchivist + Jellyfin import for a creator.