Tofu

Tofu webhook relay / live local routing

Stable webhook URLs for local development.

One hook, fanned out to your whole team.

Give Stripe, GitHub, Resend, and other providers one stable URL, then fan out the same event to your localhost, a teammate, and staging. Watch and replay everything from your terminal.

tofu relay
$ tofu login$ tofu hooks create stripe --name "Stripe"$ tofu hooks url stripe$ tofu targets set local "http://127.0.0.1:3000/api/webhooks/stripe" --hook stripe$ tofu watch stripe15:31:02  evt_01JABC  POST receivedstored15:31:03  local  200 OK 124msdelivered15:31:04  replay  readyavailable

Built for development. Payloads expire automatically.

Core workflow

Stop changing webhook URLs every time your local setup changes.

01

Create one provider URL

Give Stripe, GitHub, Prodigi, Resend, or any provider a stable Tofu hook URL.

02

Point it at local code

Set a localhost target and change it whenever your app moves without touching the provider.

03

Watch delivery live

Keep `tofu watch` open for received events, target responses, timings, and failures.

04

Replay the exact request

Send the retained request body and headers back through targets while the payload is available.

What is Tofu?

A hosted webhook relay with a terminal-first workflow.

Tofu sits between webhook providers and your development environment. It accepts provider requests quickly, stores replay payloads for a limited window, keeps event metadata visible longer, and lets you replay while payload data is available.

Not an ngrok replacement.

Use ngrok, localhost, staging, or a preview URL as your target. Tofu gives providers one stable webhook URL and lets you fan out, inspect, and replay events without reconfiguring Stripe, GitHub, Resend, or other providers every time your local setup changes.

Stable provider URLs

A hook keeps the public URL steady while your local target changes underneath.

Fan out to multiple targets

Send the same provider event to localhost, a teammate, staging, or a temporary test target.

Watch live events

SSE-powered watch mode streams event and delivery updates straight into the CLI.

Replay deliveries

Retry the latest event or a specific retained event until its payload expires.

Shared workspace history

Hooks, targets, events, and deliveries live in the workspace so teammates inspect the same trail.

Payload expiry controls

Request bodies and headers expire automatically, and you can expire payloads manually when secrets slip through.

Use cases

One event stream for local work, shared testing, and short-lived environments.

Local webhook development

Point Stripe, GitHub, Resend, or a custom provider at one stable URL while your app runs locally.

Team debugging

Attach more than one target so teammates can inspect and test from the same incoming event stream.

CI and preview environments

Register a temporary target for a CI run or preview deploy, replay an available event, then remove it.

Regression testing

Replay real webhook payloads during the retention window after changing a handler or upgrading a dependency.

Pricing

Start free. Upgrade when you need longer replay windows, more hooks, and team targets.

Free

$0/month

One workspace, 3 hooks, 1 target per hook, 500 events a month, 24h payload retention, 7 days of event history, replay, and live watch.

Pro

Built independently

$9.99/month

100 hooks, 5 targets per hook, 50k events a month, 7 days of payload retention, 30 days of event history, replay, live watch, and up to 4 team members.

Ready when you are

Stop pasting ngrok URLs into Stripe.
Get one that stays put.

Tofu is in private beta. Request access and we'll get you a stable hook URL, live watch, and replay in a few minutes.

Built for development. Payloads expire automatically. No credit card.