The open-source, single-binary alternative to ngrok. Expose your local
localhostserver to the internet with zero config, zero signup, and zero hassle.
Expose is a modern Go-based tunneling tool that lets you share your local development environment with the world. Perfect for testing webhooks, mobile debugging, or showing off your work on localtunnel or Cloudflare networks.
| Feature | ๐ Expose | ngrok | Cloudflare Tunnel | LocalTunnel (Node) |
|---|---|---|---|---|
| No Signup Required | โ | โ | โ | โ |
| Single Binary | โ | โ | โ | โ (requires Node.js) |
| Open Source | โ | โ | โ | โ |
| Self-Hosted Server | โ | โ | โ | โ |
| Language | Go | Go | Go | JS |
| Free Custom Domains | ๐ง (Planned) | ๐ฒ Paid | โ | โ |
- ๐ Multiple Providers: LocalTunnel, Cloudflare, or your own self-hosted server.
- ๐ Self-Hosted: Run
expose serveron any $5 VPS โ full control, no third parties. - โก Zero Friction: No accounts, no auth tokens, just run and go.
- ๐ฆ Lightweight: A single <10MB binary with no external dependencies.
- ๐ง Developer Friendly: Written in pure Go, easy to contribute to.
# Install
go install github.com/kernelshard/expose/cmd/expose@latest
# Initialize config
expose init
# Start tunnel (defaults to port 3000)
expose tunnelexpose tunnel -P cloudflare -p 8080# On your VPS โ one-time setup
expose server --domain=tunnel.mysite.com --control-port=7890 --public-port=8080
# On your laptop โ just works
expose tunnel --server=tunnel.mysite.com:7890Download the latest binary for your OS (Windows, macOS, Linux) from the Releases Page. Unzip it and add it to your PATH.
go install github.com/kernelshard/expose/cmd/expose@latestgit clone https://github.com/kernelshard/expose.git
cd expose
go build -o expose ./cmd/expose
./expose --version$ expose init
โ Config created: .expose.ymlCreates .expose.yml in current directory:
project: expose
port: 3000# Use config port
$ expose tunnel
โ Tunnel (LocalTunnel) started for localhost:3000
โ Public URL: https://quick-mammals-sing.loca.lt
โ Forwarding to http://localhost:3000
โ Provider: LocalTunnel
โ Press Ctrl+C to stop
# Override port
$ expose tunnel --port 8080# List all config values
$ expose config list
project: expose
port: 3000
# Get specific value
$ expose config get port
3000
$ expose config get project
expose$ expose --version
expose version v0.1.2 (commit: d30c483, built: 2025-11-10)
$ expose init
โ Config created: .expose.yml (project: expose, port: 3000)
$ python3 -m http.server 3000 &
Serving HTTP on 0.0.0.0 port 3000...
$ expose tunnel
๐ Tunnel[LocalTunnel] started for localhost:3000
โ Public URL: https://ripe-garlics-add.loca.lt
โ Forwarding to: http://localhost:3000
โ Provider: LocalTunnel
Press Ctrl+C to stop
$ curl https://ripe-garlics-add.loca.lt
<!DOCTYPE HTML>... # Works!Tested on: Go 1.23, macOS 14, Ubuntu 22.04
expose/
โโโ cmd/expose/ # CLI entry point
โโโ internal/
โ โโโ cli/ # Cobra commands (thin layer)
โ โโโ config/ # YAML config management
โ โโโ provider/ # Tunnel provider implementations
โ โโโ server/ # Self-hosted tunnel server
โ โโโ tunnel/ # Service layer (business logic)
โ โโโ version/ # Version metadata
โโโ .expose.yml # User config (add to .gitignore per project)
Design principles:
- Interface-driven โ
Providerinterface supports multiple tunnel backends - Clean separation โ CLI โ Service โ Provider (no circular deps)
- Testable โ Real file tests, injectable service layer
- One tunnel per process โ Each
expose tunnelcommand runs independently (can run multiple on different ports) - No persistence โ Public URLs change on restart
- CLI-only โ No web UI or dashboard yet
See GitHub Issues for roadmap.
- Go 1.23+
- Git
git clone https://github.com/kernelshard/expose.git
cd expose
go mod download# Run all tests with race detector
go test ./... -v -race -cover
# Check coverage for specific packages
go test ./internal/config -cover
go test ./internal/tunnel -cover
go test ./internal/provider -covergo build -o expose ./cmd/expose
./expose --version# Without installing
go run cmd/expose/main.go tunnel
# Test with live server
python3 -m http.server 3000 # Terminal 1
./expose tunnel # Terminal 2Contributions welcome! See CONTRIBUTING.md for:
- Development workflow
- Branch strategy
- Testing requirements
- Code style guidelines
MIT License - see LICENSE for details.
Made with โค๏ธ by @kernelshard
