Define your project's tunnels and webhook endpoints once in an otterkit.toml, then start them all with one command. Each profile runs as a background daemon, so status, inspect, replay, and stop work on them like on any other daemon.
[tunnels.web]
port = 3000
subdomain = "myapp" # stable URL (optional)
host = "127.0.0.1" # local host (optional, default 127.0.0.1)
auth = "admin:s3cret" # HTTP Basic auth (optional, tunnels only)
log = true # capture requests (optional, default off here)
ttl = "8h" # auto-stop (optional, default 24h)
[tunnels.hooks]
webhook = true # webhook endpoint, no local server
subdomain = "myapp-hooks"
respond = 200 # custom auto-response (optional)
respond_body = '{"ok":true}'
respond_content_type = "application/json"Each profile sets either port or webhook = true, not both. auth applies to tunnels only, and the respond keys apply to webhook endpoints only.
Commands#
npx otterkit up # start everything
npx otterkit up --json # machine-readable results for agents
npx otterkit up --config <path> # use a different file
npx otterkit down # stop the daemons started from the configup is idempotent. Profiles that are already running are skipped and reported as already_running, so agents can run it repeatedly without creating duplicates. down stops the matching daemons and deletes their capture logs.