Before wiring a GitHub webhook into your app, it helps to see real deliveries: which events fire, what the payload looks like, and whether your secret produces the signature you expect.
$ curl https://hookden.pages.dev/new
Repo → Settings → Webhooks → Add webhook:
https://hookden.pages.dev/h/… URLapplication/jsondev-secret-123GitHub immediately sends a ping event. Open your bin dashboard and it's there —
including headers like X-GitHub-Event, X-GitHub-Delivery and
X-Hub-Signature-256.
In the bin's settings, choose GitHub as the signature scheme and paste the
same secret. Every capture now shows a ✓ sig or ✗ sig badge, computed as
HMAC-SHA256(secret, raw body) against the X-Hub-Signature-256 header —
so you can confirm your secret handling before writing the verification code in your app.
Reference implementation for your handler (Node):
import crypto from 'node:crypto';
const sig = 'sha256=' + crypto.createHmac('sha256', secret)
.update(rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(sig),
Buffer.from(req.headers['x-hub-signature-256']));
Gotcha: always HMAC the raw request bytes, not the re-serialized JSON — re-serialization reorders keys and changes whitespace, which breaks the signature.
Trigger a real event (push a commit, open an issue). When your handler is ready, use Replay on any capture to re-send it to your real endpoint — no need to keep pushing commits — or set auto-forward so every delivery is proxied to your dev server while you still see each one in the dashboard.
Deliveries not showing up at all? See GitHub webhook not triggering? Diagnose it in 5 minutes.
No signup needed. Or from your terminal: curl https://hookden.pages.dev/new
← All guides · Signature debugger · Payload examples · Docs · Hookden vs webhook.site