Blog

Webhooks that inspire.

All about the webhooks universe. Shipped into space. 🚀

More about Webhooks

A balance scale. The raised left pan carries a stack of five cards labelled virtualized list, live tail, attempt chain, JSON viewer and replay button, annotated in coral as weeks of work. The lowered right pan carries a single line reading npx shadcn add @repost/delivery-history-table, with a check mark and the note one command. Under the scale, a dashed line and the sentence: the only part worth writing is the token endpoint.GuidesDon't build the webhook delivery table. Install it.A customer asks whether their webhook went out, and two weeks later you are speccing a deliveries page. Repost publishes that page as a shadcn registry.Quentin Mousset4 min readThree test runs on one time axis marked 0s, 0.4s, 5s and 9s. The first, sleep 5, runs the full five seconds although the webhook lands at 0.4s, and the stretch after it is hatched and labelled 4.6s of nothing. The second, sleep 5 on a slow day, ends at 5s with a coral cross reading expected 1, got 0, while the webhook only lands at 9s, too late. The third, repost expect, stops at 0.4s with a check mark reading returns on arrival, and a dashed line continues to a coral bracket: or exit 7 at the timeout.GuidesYour test is sleeping. The webhook already arrived.A sleep is a guess about someone else's latency. Wait for the request itself: the test returns the moment the webhook lands, and fails loudly when it never does.Quentin Mousset3 min readA schema.repost box lists id String, amount Float and currency String, with currency circled as the field just added. Six dashed arrows fan out to six generated clients: typescript, go, java, kotlin and csharp each carry a check mark, while python carries a coral cross annotated still on the old shape. A brace gathers all six toward repost schema generate --check, where the note reads build fails here, not in production.EngineeringOne webhook schema. Six SDKs that never drift.Hand-maintained clients drift the week you ship. Generate all six from one schema file, and let CI fail the pull request that forgets one.Quentin Mousset2 min readAn evolution chart headed Webhooks Progress Timeline, with five labelled boxes above it: PING 1999, TRACKBACK 2002, WEB HOOKS 2006, WEBSUB 2018, WEBHOOK 2026. The first two figures are a knuckle-walking ape and a stooped hominid, then the line stops evolving: the 2006, 2018 and 2026 figures are the same upright walker, repeated without a single change. An arrow curves back from 2026 to 2006, and the caption reads Same HTTP POST. Different stakes.EngineeringWho invented webhooks? Meet the HTTP POST that never grew upSeveral serious attempts to replace it, and a webhook is still an HTTP POST to a URL you chose. The protocol never moved. What it carries did.Quentin Mousset15 min readA retry timeline for a 30-second base, a ×3 multiplier and a 3-hour cap: attempts land at 0s, 30s, 2m, 6m30, 20m, 1h and 3h02, separated by gaps of 30s, 1m30, 4m30, 13m30, 40m30 and 2h02. Past attempt 7 the cap engages and every further attempt sits three hours after the last, so attempt 14 falls at 24 hours, where the schedule gives up.EngineeringWebhook retry storms and the arithmetic of backoffFixed-interval retries turn one slow consumer into a queue that never drains. What exponential backoff actually costs, and how to size the ceiling.Felipe Schulz10 min readTwo delivery paths compared while a laptop is closed: an ephemeral tunnel URL loses the three events that arrive in that window, with nothing left to replay, while a durable bucket stores all three and streams the backlog down to the laptop on the next repost forward.GuidesForwarding webhooks to localhost without a tunnelPublic tunnels leak URLs, rotate hostnames, and expire mid-debug. Forwarding from a durable bucket keeps the endpoint stable and the payloads replayable.Quentin Mousset6 min readThe same JSON object in two serializations: the producer's 35-byte body and the 31-byte string that comes back from JSON.parse then JSON.stringify. Each one hashes to a different HMAC-SHA256 under the same signing secret, so only the producer's bytes match the webhook-signature header and the re-serialized copy is rejected.EngineeringWebhook signature verification, end to endA webhook signature covers the exact bytes on the wire, not the object you meant to send. Why re-serialization breaks verification, and how to test it.Quentin Mousset11 min read