Your Tunnels
Create Tunnel
| Status | Name | Protocol | Route | Public URL | Uptime | Actions |
|---|---|---|---|---|---|---|
|
|
|
Tunnel IDs (for CLI)
| Status | Method | Path | Time |
|---|---|---|---|
Request Headers
Request Body
Response Headers
Live Session
Historical Totals
| Status | Connected | Disconnected | Duration | Data In | Data Out | Connections | Requests |
|---|---|---|---|---|---|---|---|
Use this key in your client config under the tunnel's key field.
Quick Start Guide
Get a tunnel running in under 2 minutes.
Create a Tunnel
Go to and create a new tunnel. An API key is auto-generated for each tunnel - copy it immediately, it's only shown once.
Download the Client
Download from the /download page, or:
curl -sL https:///api/download/linux/amd64 -o tunnle-client && chmod +x tunnle-client
Connect
Run the client pointing at your local service:
./tunnle-client \ -server wss:// \ -key YOUR_TUNNEL_API_KEY \ -tunnel YOUR_TUNNEL_ID \ -local 127.0.0.1:3000
CLI Reference
All available command-line flags for tunnle-client.
Config File
Instead of passing flags, use a YAML config at ~/.monkeytunel.yml.
Generate a starter config: tunnle-client -init > ~/.monkeytunel.yml
# ~/.monkeytunel.yml server: wss:// tunnels: - name: myapp id: your-tunnel-uuid key: your-tunnel-api-key # each tunnel gets its own key local: 127.0.0.1:3000 proto: http route: subdomain subdomain: myapp - name: ssh id: another-tunnel-uuid key: another-tunnel-api-key local: 127.0.0.1:22 proto: tcp route: port port: 2222
All tunnels in the config run concurrently from a single process, each with its own API key and reconnect logic.
Then just run: tunnle-client (no flags needed)
Command-line flags always override config file values.
Protocols
Custom Domains
Point your own domain to a tunnel instead of using the default subdomain.
Add a CNAME record
Point your domain to this server:
app.yourdomain.com CNAME
Set custom domain on tunnel
Edit your tunnel and enter the custom domain in the "Custom Domain" field, or set it when creating the tunnel.
Connect the client
Traffic to app.yourdomain.com will be routed to your tunnel automatically.
Webhook Notifications
Get notified when your tunnel connects or disconnects. Set a webhook URL on any tunnel.
Events
Payload Example
{
"event": "tunnel_disconnected",
"tunnel_id": "abc-123-...",
"timestamp": "2026-02-28T12:00:00Z",
"data": {
"bytes_in": 1048576,
"bytes_out": 524288,
"connection_count": 42,
"duration_seconds": 3600.5
}
}
Request Inspector
The inspector captures the last 100 HTTP requests flowing through a tunnel, showing method, path, status code, headers, body preview, and latency.
To use it:
- Go to Tunnels and click Inspect on an HTTP tunnel
- Send traffic through the tunnel
- The inspector auto-refreshes every 2 seconds
- Click any request row to expand headers and body
You can also fetch requests via the API:
GET /api/tunnels/{id}/requests
Docker / Self-Hosting
Run your own MonkeyTunel server with Docker.
Quick Start with Docker Compose
git clone <repo> && cd monkeytunel
# Edit docker-compose.yml with your domain and secrets
docker compose up -d
Standalone Docker
docker build -t monkeytunel . docker run -d \ -p 80:80 -p 443:443 -p 8080:8080 \ -v ./data:/data \ -v ./certs:/certs \ -e TUNNLE_DOMAIN=tunnel.example.com \ -e TUNNLE_JWT_SECRET=your-secret \ monkeytunel
Server Config (TOML)
listen = ":443" domain = "tunnel.example.com" base_domain = "tunnel.example.com" db_path = "/data/tunnle.db" jwt_secret = "generate-a-strong-secret" tls_cert = "/certs/fullchain.pem" tls_key = "/certs/privkey.pem" rate_limit_api = 60 rate_limit_auth = 10 bin_dir = "/data/binaries"
Cross-Compile Client Binaries
make build-all # Builds for linux/darwin/windows x amd64/arm64
API Reference
All endpoints require Authorization: Bearer <token> except auth routes.
Authentication
Tunnels
Admin (admin only)
Downloads
Create User
| User | Role | Bandwidth Limit | Joined | Actions | |
|---|---|---|---|---|---|
|
|
| Name | Protocol | Route | Owner | Created |
|---|---|---|---|---|
Change Password
Access Control
Edit Tunnel
·
Connect Tunnel
Replace YOUR_API_KEY with your tunnel's API key. Adjust -local to your local service address.