█ █ █▀▀█ █▀▀█ █▀▄▀█ █ █ █▀▀█ █ █▀▀ █▄█▄█ █ █ █▄▄▀ █ █ █ █▀▀█ █ █ █ █▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀▀▀
Expose your localhost to the internet. Instantly.
Wormhole is an open-source ngrok alternative that gives your local server a public HTTPS URL with a single command. No signup required. No config files. Just works.
wormhole http 3000
█ █ █▀▀█ █▀▀█ █▀▄▀█ █ █ █▀▀█ █ █▀▀
█▄█▄█ █ █ █▄▄▀ █ █ █ █▀▀█ █ █ █ █▀▀
▀ ▀ ▀ ▀▀▀▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀▀▀
v0.1.0
╭──────────────────────────────────────────────────╮
│ Status ● connected │
│ Forwarding https://k7x9m2.wormhole.bar → ... │
│ Inspector http://localhost:4040 │
╰──────────────────────────────────────────────────╯
Requests
--------------------------------------------------------------
GET / 200 12ms
POST /webhooks/stripe 200 8ms
GET /api/users 200 34ms
wormhole http 3000 and you're livewormhole http 3000 --subdomain myapp (free with GitHub login)localhost:4040 with live request streamcurl -fsSL https://wormhole.bar/install.sh | sh
brew install MuhammadHananAsghar/tap/wormhole
go install github.com/MuhammadHananAsghar/wormhole/cmd/wormhole@latest
git clone https://github.com/MuhammadHananAsghar/wormhole.git
cd wormhole
make build
# Binary: ./wormhole
# Start your local server on any port
wormhole http 3000
# => https://k7x9m2.wormhole.bar -> http://localhost:3000
# One-time login via GitHub
wormhole login
# Use your own subdomain
wormhole http 3000 --subdomain myapp
# => https://myapp.wormhole.bar -> http://localhost:3000
Every tunnel automatically starts a traffic inspector at http://localhost:4040:
# Custom inspector port
wormhole http 3000 --inspect localhost:5050
# Disable inspector
wormhole http 3000 --no-inspect
wormhole http <port> # Expose local HTTP server
wormhole http <port> --subdomain NAME # Custom subdomain
wormhole http <port> --headless # No TUI, plain log output
wormhole http <port> --inspect ADDR # Custom inspector address
wormhole http <port> --no-inspect # Disable inspector
wormhole login # Authenticate via GitHub
wormhole logout # Remove stored credentials
wormhole status # Show auth status
wormhole uninstall # Remove wormhole from system
wormhole uninstall --purge # Also remove config (~/.wormhole/)
wormhole version # Print version
YOUR LAPTOP CLOUDFLARE EDGE (300+ cities)
┌──────────────┐ ┌─────────────────────────────┐
│ │ WebSocket │ │
│ wormhole │◄───────────────►│ Worker (request router) │
│ client │ (encrypted) │ ↕ │
│ │ │ Durable Object (tunnel) │
│ localhost │ │ • Holds your WebSocket │
│ :3000 │ │ • Proxies HTTP to you │
└──────────────┘ │ • Hibernates when idle │
└──────────────┬──────────────┘
│
*.wormhole.bar (Cloudflare DNS)
│
Public Internet
*.wormhole.bar hit the Workerlocalhost:3000Latency: client <-> nearest CF edge (~5-20ms) + localhost (~0ms) = fast.
| Component | Technology |
|---|---|
| CLI Client | Go, Cobra, Bubbletea, Lipgloss |
| Transport | WebSocket (gorilla/websocket) |
| Edge Relay | Cloudflare Workers + Durable Objects |
| Database | Cloudflare D1 (SQLite) |
| DNS | Cloudflare DNS (wildcard *.wormhole.bar) |
| TLS | Cloudflare automatic SSL |
| Auth | GitHub OAuth |
wormhole/
├── cmd/wormhole/ # CLI entry point
├── internal/
│ ├── client/ # Tunnel client (connect, forward, display)
│ ├── transport/ # WebSocket transport layer
│ └── inspect/ # Traffic inspector (recorder, server, replay, HAR)
├── edge/ # Cloudflare Worker + Durable Object relay
│ ├── src/
│ │ ├── index.ts # Worker router + auth
│ │ └── tunnel.ts # Durable Object tunnel proxy
│ └── migrations/ # D1 schema migrations
├── pkg/config/ # User config (~/.wormhole/config.json)
├── deployments/ # install.sh, Docker, etc.
├── Makefile
└── .goreleaser.yml
# Run all Go tests
go test ./... -race
# Run edge tests
cd edge && npm test
# Build binary
make build
# Cross-compile all platforms
make dist
This project follows test-driven development. Write failing tests first, then implement.
# Run tests in watch mode
go test ./internal/inspect/ -v -count=1
# Coverage
go test ./... -cover
| Feature | ngrok (free) | Cloudflare Tunnel | Wormhole |
|---|---|---|---|
| One-command setup | Needs signup | Needs CF account | Just works |
| Custom subdomains | Paid ($8/mo) | Yes (complex) | Free |
| HTTPS | Yes | Yes | Yes |
| Traffic inspector | Basic | No | Full (replay, HAR) |
| WebSocket support | Yes | Yes | Yes |
| Open source | No | Client only | Fully open source |
| Cost | $0-$120/yr | $0 (complex) | $0 |
wormhole http 3000 -> public URL)Muhammad Hanan Asghar
MIT License. See LICENSE for details.
Built with Go + Cloudflare Workers. Runs on the edge.
$ claude mcp add wormhole \
-- python -m otcore.mcp_server <graph>