Instant tunnels · webhooks · approvals

Tunnels & webhooks.
For you and your agents.

A native macOS app for tunnels, webhooks, and HTTPS on your machine, plus a pay-as-you-go CLI your AI agents drive themselves. One command, one public URL.

or: npx otterkit tunnel 3000

$ npx otterkit tunnel 3000

✓ OtterKit credits · 1 credit/hr

Provisioning tunnel…

Tunnel ready https://agent-a1b2c3d4.otterkit.app

→ 127.0.0.1:3000 · Ctrl+C to disconnect

200 GET / (12ms)

Everything local, exposed

One toolkit for local development and the agents that build on it.

Public tunnels

Expose any local port with a secure URL. Stable subdomains, TTL auto-stop, daemon mode, otterkit.toml profiles - no config, no firewall changes.

Webhook capture

Endpoints with no server behind them. Standby mode answers and buffers while you sleep; replay with edits, fire signed synthetic Stripe/GitHub events, verify signatures.

Approvals & durable waits

Agents park on server-held conditions instead of polling. Human approval gates with one-tap email links - the agent blocks until someone taps Approve.

Live inspector & share links

Watch every request in real time - then share a read-only live page with anyone. Paste it in a Slack thread or GitHub issue and debug together, no login.

Local domains + auto HTTPS

Beautiful .localhost domains with trusted SSL in one click. The green padlock on every local project, and no more memorizing ports.

Agent-native CLI + MCP

One npx command, or one otterkit.toml. Agents provision, capture, await, approve, and replay themselves, with --json everywhere and a built-in MCP server for Claude Code & Cursor.

In detail

Five primitives, deeply configurable.

Tunnels

A public URL for any port, on your terms.

One command exposes localhost with HTTPS on *.otterkit.app. Pick a stable subdomain that survives restarts, set a TTL so forgotten tunnels stop themselves, run in the background as a daemon, or define whole environments in otterkit.toml and bring them up with one command.

--subdomain api-demostable reserved names--ttl 4hauto-stop (up to 7d)--daemonbackground modeotterkit upprofiles from otterkit.toml--jsonscript-friendly output1¢/hr · 10¢/day capmetered, prepaid
Tunnel docs

$ npx otterkit tunnel 3000 --subdomain demo --ttl 4h

Tunnel ready https://demo.otterkit.app

→ 127.0.0.1:3000 · auto-stops in 4h

200 POST /api/orders (18ms)

Webhooks

Endpoints that work while you don’t.

Capture webhooks with no server behind them. Standby mode keeps the endpoint answering - with a status and body you choose - and buffers every request while you’re disconnected, replaying them the moment you’re back. Replay captures with edited fields, re-sign them, fire correctly-signed synthetic Stripe, GitHub, Shopify, or Slack events at your local handler, and verify provider signatures when something looks off.

--standbyanswers + buffers offline--respond 201custom status & bodyreplay --set amount=42edit & re-send capturessend stripe:payment.succeededsigned synthetic eventsawait --count 1block until a match landsverify stripesignature checks
Webhook docs

$ npx otterkit webhook --standby --respond 201

Endpoint live https://agent-1f2e3d4c.otterkit.app

standby: serving 201 + buffering while disconnected

⇡ buffered POST /stripe · replayed on reconnect

Approvals & durable waits

Agents that wait cost nothing. Humans decide with one tap.

A durable wait is a server-held condition: when a matching request lands - method, path, or a JSON field - OtterKit calls your URL back, signed, with retries. No polling, no open socket. Approval gates put a human in the loop: the agent blocks until someone decides, from the portal inbox or a single-use approve link delivered by email. No account needed to approve.

wake --field event.type=paidmatch method · path · JSON fieldapprove "Deploy to prod?"block on a human decisionone-tap linkssingle-use, no loginemail deliveryapprove from your inboxX-OtterKit-SignatureHMAC-signed callbacks + retriesportal inboxevery pending decision, one page
Durable waits docs

$ npx otterkit approve demo "Deploy v2.1 to prod?"

Approval requested · emailed to the on-call - waiting…

# they tap Approve on their phone

Approved - ship it

Live inspector & share links

See every request. Show anyone, safely.

Every capture records both sides - method, path, full headers, body, response, and timing - live in the desktop app, the portal feed, or otterkit inspect in your terminal. Then make it a team sport: one click mints a public, read-only inspector page for any endpoint. Paste it into a Slack thread, a GitHub issue, or a support ticket with a vendor, and everyone watches the same traffic arrive in real time - including what was buffered before they opened it. Viewers can look, never touch: no replay, no responses, no controls. Rotate the link and every viewer is dropped instantly; disable it and the page is gone.

inspect <subdomain>browse captures in the terminalawait --field event.type=paidstream matches as they land/i/<sub>/<token>public read-only live pagerotate · disablerevoke instantly, viewers kicked16 viewersconcurrent watchers per linkheaders · body · timingboth sides of every request
Inspector docs

$ npx otterkit inspect agent-1f2e3d4c

12:04:11 POST /stripe 200 · 1.2 KB · 14ms

12:04:53 POST /orders 201 · 640 B · 9ms

# share it - read-only, live, no login for viewers

https://otterkit.app/i/agent-1f2e3d4c/shr_9f2…

Local domains + auto HTTPS

localhost, like it always should have been.

The native Mac app gives every project a memorable .localhost domain with a real, trusted SSL certificate - the green padlock on your own machine, no browser warnings, no openssl incantations, no editing /etc/hosts. Point myapp.localhost at any port in one click; certificates are minted and trusted automatically. A built-in port manager shows everything listening on your machine so a mystery process never squats your dev port again, and any local domain becomes a public tunnel with one more click.

myapp.localhostnamed domains, not port numberstrusted SSLauto-minted, no warningsport managersee & kill whatever is squatting a portone-click tunnellocal domain → public URLmenu bar appnative macOS 12+, AS & Intelzero configno /etc/hosts, no openssl
Local domains docs

https://myapp.localhost → 127.0.0.1:5173 ✓ HTTPS

https://api.localhost → 127.0.0.1:4000 ✓ HTTPS

https://docs.localhost → 127.0.0.1:3999 ✓ HTTPS

# named, trusted, remembered - managed from the menu bar

Use cases

Real workflows, start to finish.

npx otterkit tunnel 3000

one command

agent-a1b2.otterkit.app

https · live

Tunnel ready ✓

200 GET / · first visitor in

A public URL, one command, done

No config, no dashboard, no firewall changes. Run one command and whatever is on port 3000 has a public HTTPS URL. Ctrl+C when you are done and it is gone.

npx otterkit tunnel 3000

hook-1f2e

no server needed

live feed

POST /orders

POST /stripe

GET /ping

headers · body · timing

See what a webhook actually sends

Need somewhere to point a webhook right now? Mint an endpoint in seconds - or grab one at otterkit.com/try without even an account - and watch every request arrive with full headers, body, and timing.

npx otterkit webhook

Stripe

events

hook-a1b2

standby · 201

your terminal

replayed

buffered · 2

2 requests replayed ✓

Ship a payment webhook before lunch

Point Stripe at an endpoint that is always up. Events buffer while your laptop is closed and replay into your terminal the moment you are back - nothing lost, nothing re-sent by hand.

npx otterkit webhook --standby

agent

otterkit approve

OtterKit

approval wait

your phone

one-tap link

blocked, waiting…✉️ Approve

Approved - deploying ✓

Let the agent run. Keep the switch.

Your agent pauses at the risky step and asks. You get a one-tap approve link by email, decide from anywhere, and the agent resumes with your decision - signed, single-use, no login.

npx otterkit approve demo "Deploy to prod?"

localhost:3000

your machine

demo.otterkit.app

https · public

--ttl 4h · auto-stops

200 GET / · 12ms

Demo work-in-progress to anyone

One command turns localhost into a stable public HTTPS URL a client can open on their phone. Set a TTL and the tunnel cleans up after itself when the meeting is over.

npx otterkit tunnel 3000 --subdomain demo --ttl 4h

hook-a1b2

/i/… read-only

you
teammate
vendor support
no login · can't touch

Debug live, with the vendor watching

Share a read-only inspector page in the support ticket. You, your teammate, and the vendor watch the same requests arrive in real time - and nobody can touch your endpoint.

Share → https://otterkit.app/i/…

For developers

A native Mac app: .localhost domains with HTTPS, one-click public tunnels, webhook capture, and a live traffic inspector. Your daily local-dev workflow, in one place.

Download the app

For agents & CI

A pay-as-you-go CLI, and a native MCP server. Log in once and any agent on the machine provisions tunnels itself, metered by the hour, no keys to paste. Claude Code and Cursor plug in with one line: npx otterkit mcp.

Pricing

Fair, and honest about it.

OtterKit for Mac

$29/ year

3-day free trial · no card required

  • Local domains + auto HTTPS
  • Public tunnels & webhooks
  • Traffic inspector & port manager
  • All future updates
Start free trial

OtterKit CLI · for agents

/ connected hour

Prepaid credits · never more than 10¢/day per tunnel

  • Pay only while connected
  • No subscription, credits never expire
  • Log in once, agents self-provision
  • Free credits to start
Get started free

Questions, answered.

It exposes your local servers to the internet (public tunnels and webhook endpoints), adds human approval gates and durable waits for agents, and gives you local .localhost domains with automatic HTTPS. A native macOS app for hands-on work, and a CLI your agents and CI can drive on their own.

Get a public URL in seconds.

Download the Mac app, or spin up the portal and let your agents take it from there.

macOS 12 or later · Apple Silicon & Intel