Open Source · MIT · NPM

Local webhook tunnel.
zero infrastructure

Instant local tunnel for webhooks. No ngrok. No account. No data leaves your machine. One command and you're live.

$npx @hookflo/tern-dev --port 3000
three steps to live webhook debugging

Three steps to live

No installs, no configuration, no account. Run npx and you're tunneling in seconds.

  • Start tunnel on any local port with a single command
  • Get a public HTTPS URL instantly — paste into any webhook provider
  • Watch events arrive in real time at localhost:2019
  • Inspect full payloads, headers, status codes, and latency
  • Replay any event with one click
  • Ctrl+C erases all data — zero traces left behind
$ terminalLIVE
# 1. Start the tunnel $ npx @hookflo/tern-dev --port 3000 tunnel https://abc123.relay.tern.hookflo.com dashboard http://localhost:2019 forwardinglocalhost:3000 # 2. Copy tunnel URL to your webhook provider # 3. Open dashboard and watch events flow in real-time Tunnel live · Ctrl+C to end & erase all data

Everything for local webhook dev

A complete toolkit covering tunneling, inspection, replay, verification, and configuration — without third-party accounts or cloud storage.

Instant Public Tunnel

One command gives you a public HTTPS relay URL — no account, no signup, no friction. Your webhooks arrive in milliseconds.

Live Event Dashboard

Real-time log at localhost:2019 with full payload inspection, headers, response codes, and latency metrics.

Zero Persistence

Everything lives in RAM. Nothing touches disk. Nothing reaches the cloud. Ctrl+C and it's completely gone.

Signature Verification

Built-in guidance for Stripe, GitHub, Clerk, and custom HMAC webhooks. Verify integrity without extra libraries.

One-Click Replay

Resend any captured webhook to your local server instantly. Test edge cases and error handling without re-triggering the provider.

Dead Letter Queue

Failed events are isolated in a DLQ-style view. Inspect, debug, and replay failures without sifting through all traffic.

Export as cURL / fetch

Copy any event as a ready-to-run curl command or fetch snippet. Share exact requests with teammates in one click.

Config File Support

Persist settings with tern.config.json. Rate limiting, IP allowlisting, path blocking, session TTL, and audit logs.

Self-Hostable Relay

Run your own relay via hookflo/tern-relay. Point the CLI with --relay to keep everything inside your own infrastructure.

Inspect every byte in real time

The local dashboard at localhost:2019 gives you complete visibility into every webhook — payloads, headers, signatures, latency, and more.

  • Payload inspection with JSON formatting and syntax highlighting
  • Full HTTP headers with signature validation status
  • Response code, body, and latency for every event
  • Side-by-side event comparison and diffs
  • Dead Letter Queue — isolated view of failed events
  • One-click replay to refire any event
  • Export any event as curl or fetch snippet
  • Real-time WebSocket updates — no polling
EventsLive LogDLQ (1)Connected
POST/stripe/webhook2002.4ms
POST/github/events50045ms
POST/clerk/hooks2001.1ms
POST/custom/handler2021.8ms
4
Events
1
Failures
0B
Persisted

All flags, at a glance

Every option the CLI accepts — combinable with tern.config.json for persistent configuration.

FlagTypeDefaultDescription
--portnumberrequiredLocal app port to forward requests to
--pathstring"/"Path prefix for forwarded requests
--ui-portnumber2019Dashboard HTTP port
--no-uibooleanfalseDisable dashboard and browser WebSocket server
--relaystringwss://relay.tern.hookflo.comOverride relay WebSocket URL for self-hosting
--max-eventsnumber500Maximum events buffered in session memory

Persistent setup with tern.config.json

Drop a tern.config.json file in your project root. CLI flags are merged and auto-loaded — no need to retype them every session.

  • Port, path prefix, and UI port
  • Rate limiting — requests per minute per IP
  • IP allowlisting and blocklisting
  • Block specific paths and HTTP methods
  • Custom relay server URL for self-hosting
  • Session TTL and auto-kill timers
  • Audit logging to file
  • JSON Schema with full IDE autocomplete
tern.config.jsonJSON
{// $schema: "schemastore.org/tern-dev""port": 3000,"path": "/webhooks","uiPort": 2019,"rateLimit": 100,"maxEvents": 500,"allowIp": ["54.187.174.169","52.86.47.0/24"],"blockPaths": ["/health"],"blockMethods": ["GET", "HEAD"],"sessionTtl": 3600,"auditLog": "./tern-audit.log","relay": "wss://relay.yourinfra.com","noUi": false}

Your data never leaves your machine

RAM-only Storage

All captured events live exclusively in process memory. Nothing is written to disk at any point during a session.

No Cloud Persistence

The relay infrastructure forwards payloads in real time — it never stores, logs, or indexes your webhook data.

Instant Erasure

Press Ctrl+C and the entire session — events, payloads, headers — is gone. No traces, no temp files.

Ready to test webhooks locally?

No account. No ngrok. No storage. One command and you're live.

$npx @hookflo/tern-dev --port 3000