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
| Name | Prefix | Created | Actions |
|---|---|---|---|
Quick Start Guide
Get a tunnel running in under 2 minutes.
Create an API Key
Go to and create a new key. Copy it immediately - it's only shown once.
Create a Tunnel
Go to and create a new tunnel. Choose HTTP protocol with subdomain routing for web apps.
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_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:// key: your-api-key-here tunnels: - name: myapp id: your-tunnel-uuid local: 127.0.0.1:3000 proto: http route: subdomain subdomain: myapp - name: ssh id: another-tunnel-uuid local: 127.0.0.1:22 proto: tcp route: port port: 2222
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
API Keys
Admin (admin only)
Downloads
Create User
| User | Role | Bandwidth Limit | Joined | Actions | |
|---|---|---|---|---|---|
|
|
| Name | Protocol | Route | Owner | Created |
|---|---|---|---|---|