Capture, inspect and replay webhooks locally with a single FastAPI process. No cloud. No accounts. No tunneling required.
curl -X POST http://localhost:8000/hooks/stripe \ -H "Content-Type: application/json" \ -d '{"type":"payment.succeeded","amount":4200}'
{ "id": "3f2a1b8c-...", "slug": "stripe", "status": "captured" }
curl -X POST "http://localhost:8000/requests/3f2a1b8c/replay?target_url=http://localhost:3000/webhooks" # → {"status_code": 200, "duration_ms": 48, ...}
One process. One file. Nothing else.
pip install -r requirements.txt uvicorn main:app --reload # HookDump running # Capture endpoint : http://localhost:8000/hooks/{slug} # Docs : http://localhost:8000/docs
docker compose upData persists in a Docker named volume across restarts.
# Capture POST /hooks/{slug} # receive any webhook # Inspect GET /requests # list captures ?limit=50&slug=stripe GET /requests/{id} # full headers + body DELETE /requests/{id} # remove # Replay POST /requests/{id}/replay # replay ?target_url=https://... # Meta GET /health GET /docs # Swagger UI
Capture Stripe test events once, replay against your local handler as many times as needed — without re-triggering events from the dashboard.
Inspect push, PR, and review events with full headers, including X-Hub-Signature, exactly as GitHub sends them.
Use HookDump as a local inbox during development. Capture once from a tunnel, then iterate on your handler and replay on demand.
Reproduce edge cases deterministically. The exact bytes that arrived — method, headers, body — are forwarded verbatim.
No workers, no queues, no sidecars. One uvicorn command, one SQLite file.
Nothing leaves your machine. No API keys, no rate limits, no vendor lock-in.
Replay the exact request that arrived. Byte-for-byte identical — not a reconstruction.
Three dependencies. Under 200 lines across five files. Audit the whole codebase in 10 minutes.