expose
Lightweight, open-source secure tunneling tool to expose local servers to the internet
About expose
Expose โ Pure Go Localhost Tunneling CLI

Turn your
localhostinto a public shareable URL in one command โ zero config, zero signups, and a single <10MB binary.
The lightweight, open-source Go alternative to ngrok for webhook testing, mobile previews, and remote debugging.
Install via Homebrew:
brew install kernelshard/tap/expose
Tunnel your local server (e.g. port 3000):
expose tunnel 3000
๐ก What is this for?
When you run an app on http://localhost:3000, only your laptop can access it. Expose creates a temporary public HTTPS URL that connects directly to your local server:
- ๐ช Webhook Testing: Give Stripe, GitHub, or Twilio a live HTTPS URL to test webhook callbacks locally.
- ๐ฑ Mobile & Device Testing: Open your local website on a physical smartphone or tablet over 4G/5G.
- ๐ฅ Instant Previews: Send a live demo link to a friend or client without deploying to cloud servers.
- ๐ Private Self-Hosting: Route traffic through your own private VPS instead of commercial SaaS relays.
๐ Why Expose?
| Feature | ๐ Expose | ngrok | Cloudflare Tunnel | LocalTunnel (Node) |
|---|---|---|---|---|
| Zero Signup Required | โ Instant | โ Mandatory account | โ Mandatory account | โ Instant |
| Single Static Binary | โ (<10MB) | โ (~30MB) | โ (~50MB) | โ (requires Node.js) |
| Open Source | โ Apache 2.0 | โ Proprietary | โ Apache 2.0 | โ MIT |
| Self-Hostable Relay | โ
expose server | โ SaaS only | โ Cloudflare network | โ ๏ธ Legacy Node server |
| Language & Runtime | Pure Go (zero CGO) | Go / C | Go daemon | Node.js (V8 heap) |
| Free Custom Domains | ๐ง Planned (#62) | ๐ฒ Paid plan | โ Cloudflare DNS | โ Not supported |
โก Quick Examples
# Tunnel a local development server (defaults to port 3000)
expose tunnel 3000
# Tunnel via Cloudflare Quick Tunnels
expose tunnel -P cloudflare -p 8080
# Connect to your private self-hosted relay gateway
expose tunnel 3000 --server=tunnel.mysite.com:7890
๐ฆ Installation Options
1. Homebrew (macOS & Linux โ Recommended)
brew install kernelshard/tap/expose
2. One-Line Shell Installer
curl -fsSL https://raw.githubusercontent.com/kernelshard/expose/main/install.sh | sh
Pin a specific version or install to a custom path:
# Pin version
VERSION=v0.5.0 curl -fsSL https://raw.githubusercontent.com/kernelshard/expose/main/install.sh | sh
# Custom directory
BINDIR=~/.local/bin curl -fsSL https://raw.githubusercontent.com/kernelshard/expose/main/install.sh | sh
3. Pre-built Binaries
Download the latest pre-compiled binary for your architecture (macOS, Linux, Windows) from the Releases Page.
4. Via Go Install (Go 1.22+)
go install github.com/kernelshard/expose/cmd/expose@latest
5. From Source
git clone https://github.com/kernelshard/expose.git
cd expose
go build -o expose ./cmd/expose
./expose --version
๐ Self-Hosted Relay Server
Need complete privacy and zero third-party relay dependence? Run your own tunnel gateway on any $5 VPS with a single command:
# Start your private relay server
expose server --domain=tunnel.mysite.com --control-port=7890 --public-port=8080
Connect your client to your VPS:
expose tunnel 3000 --server=tunnel.mysite.com:7890
โ๏ธ Project Configuration (.expose.yml)
Save defaults per project so you can just type expose tunnel:
# Create .expose.yml in current directory
$ expose init
โ Config created: .expose.yml
project: expose
port: 3000
Manage and query configuration values:
expose config list
expose config get port
๐ Architecture & Design Principles
expose/
โโโ cmd/expose/ # CLI entry point (Cobra)
โโโ internal/
โ โโโ cli/ # Cobra subcommands & flag parsing
โ โโโ config/ # YAML config management
โ โโโ provider/ # Tunnel providers (LocalTunnel, Cloudflare, Self-Hosted)
โ โโโ server/ # Self-hosted relay control & public server
โ โโโ tunnel/ # Core service orchestration & lifecycle
โ โโโ version/ # Build metadata & version injection
โโโ .expose.yml # Local project configuration
- Interface-Driven: Extensible
Providerinterface makes adding new tunnel backends straightforward. - Clean Separation: CLI โ Service โ Provider (strict unidirectionality, zero circular dependencies).
- Fully Testable: High test coverage (>80%) across packages with race detector validation (
go test -race).
๐งช Development & Testing
# Run all unit tests with Go race detector
go test ./... -v -race -cover
# Package-specific coverage
go test ./internal/tunnel -cover
go test ./internal/server -cover
go test ./internal/provider -cover
๐ค Contributing
Contributions are welcome! Please check out CONTRIBUTING.md for branch strategy, test requirements, and code style guidelines.
๐ License
Distributed under the Apache License 2.0. See LICENSE for details.
Made with โค๏ธ by @kernelshard
Frequently Asked Questions
What is expose?
expose is a Networking library for the Go programming language. Lightweight, open-source secure tunneling tool to expose local servers to the internet
How do I install expose?
Install expose with the Go module system using `go get kernelshard/expose`. Check the repository for the current installation instructions.
What category does expose belong to?
expose is listed under Networking, specifically Networking.