Webhook providers can't reach localhost. The usual fixes are a tunnel, a staging deploy, or copying a payload from logs into curl. Each loses something: the tunnel URL changes, staging is slow, and the curl request has different headers, a reformatted body and a signature that no longer matches.
HookWatcher gives you a stable public endpoint that stores every request exactly as it arrived. hwcli listen then delivers each request to your machine byte for byte, and keeps it so you can send it again later.
Set it up
hwcli login hwcli endpoints create --copy # a new endpoint, URL copied hwcli listen <endpoint> --forward http://localhost:8080/webhooks
Point the provider's webhook settings at your endpoint URL. Each delivery shows up in the terminal with your server's answer:
Forwarding events to localhost:8080/webhooks ✓ payment_intent.succeeded 200 OK 38 ms ✗ invoice.paid 500 Error 214 ms evt_93df18ab Replay: hwcli replay evt_93df18ab
What gets delivered
- The exact raw body, method and query string. JSON is never re-serialized, so signatures computed over the body stay valid.
- Headers as received, including signature headers when you pass
--include-sensitive. Your server can run its real verification code. :8080/webhooksis shorthand forhttp://localhost:8080/webhooks.--append-pathadds the path the provider called after the endpoint ID.- Only loopback targets are accepted. hwcli never forwards to other machines on your network.
The local endpoint is a forwarding endpoint like any other. It shows as Offline while hwcli isn't running, and deliveries that fail are retried. In the dashboard the device appears under Replay Locally, so anyone in the workspace with Developer access can send an event to your running session.
Next
When a delivery fails, don't wait for the provider to retry. Replay it as often as you need while you fix the handler.