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$ 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$ 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$ 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$ 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 opensslhttps://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
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
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
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
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
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
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 appFor 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
3-day free trial · no card required
- Local domains + auto HTTPS
- Public tunnels & webhooks
- Traffic inspector & port manager
- All future updates
OtterKit CLI · for agents
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
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