Run local app commands behind Caddy with friendly local hostnames.
Install latest release:
curl -fsSL https://raw.githubusercontent.com/iterate/devwrap/main/install.sh | bashInstall a specific release:
curl -fsSL https://raw.githubusercontent.com/iterate/devwrap/main/install.sh | bash -s -- -v 0.0.2devwrap --name myapp -- pnpm devUse a custom host when needed:
devwrap --name web --host web.dev.test -- pnpm devUse @PORT when your app expects a CLI flag instead of env vars:
devwrap --name dev-server -- vite dev --port @PORTBy default hosts are <name>.localhost.
devwrap also sets PORT=<allocated port>, DEVWRAP_APP=<name>, and DEVWRAP_HOST=<https url> for the child process.
unmanaged caddy: Caddy is already running on admin API127.0.0.1:2019managed caddy: started bydevwrap proxy start
Start managed Caddy:
devwrap proxy startPrivileged start (bind 80/443 if available):
devwrap proxy start -pShortcut: devwrap -p starts managed proxy when no --name + command are provided.
devwrap proxy status
devwrap proxy trust
devwrap proxy stop
devwrap ls
devwrap rm <name>
devwrap doctorAll commands support --json for scriptable output.
Examples:
devwrap proxy status --json
devwrap ls --json
devwrap --json --name api -- uvicorn app:app --port @PORTdevwrap proxy trust fetches the local CA root from Caddy admin API and installs trust using the same truststore approach used by Caddy.
For Node.js clients (fetch, undici, axios over HTTPS), you may also need to enable CA trust in Node:
- Newer Node versions: set
NODE_USE_SYSTEM_CA=1so Node uses system trust. - Older Node versions (or as a fallback): set
NODE_EXTRA_CA_CERTSto Caddy's local root cert path.
Caddy local root cert path is resolved from the Caddy data dir in this order:
$DEVWRAP_CADDY_DATA_DIR(if set)- else
$CADDY_DATA_DIR(if set) - else platform default Caddy data dir (macOS:
~/Library/Application Support/Caddy, Linux:~/.local/share/caddy)
Append pki/authorities/local/root.crt to the selected data dir.
Example:
# Newer Node
export NODE_USE_SYSTEM_CA=1
# Older Node / fallback (macOS)
export NODE_EXTRA_CA_CERTS="$HOME/Library/Application Support/Caddy/pki/authorities/local/root.crt"
# Older Node / fallback (Linux)
export NODE_EXTRA_CA_CERTS="$HOME/.local/share/caddy/pki/authorities/local/root.crt"State is stored in:
$XDG_STATE_HOME/devwrap- fallback:
~/.local/state/devwrap
Files:
state.jsonstate.lockdaemon.piddaemon.log
Build + install from local source (dev flow):
./install-dev.shSource code lives in cmd/devwrap.
Build locally with:
/usr/local/go/bin/go build ./cmd/devwrap