Port Forwarding & Tunnels
Expose any port from the agent's machine to the public internet. See the concept.
What you'll learn
- Create a tunnel for a port
- Pick your tunnel provider
- Manage tunnel lifecycle
Create a tunnel
vibecontrols tunnels create \
--agent <agent-id> \
--port 3000 \
--provider cloudflare
The agent's tunnel plugin spawns the appropriate subprocess (cloudflared or frpc) and returns the public URL.
Providers
| Provider | Plugin | URL |
|---|---|---|
cloudflare | @vibecontrols/vibe-plugin-tunnel-cloudflare | https://<random-words>.trycloudflare.com |
vibetunnels | @vibecontrols/vibe-plugin-tunnel-vibetunnels | Depends on your frps config |
The default provider is configured per-agent. Both are pluggable — add custom providers via the plugin SDK.
List tunnels
vibecontrols tunnels list # current workspace
vibecontrols tunnels list --agent <agent-id>
Or hit the agent's REST API directly:
curl -H "x-agent-api-key: $KEY" http://localhost:3005/api/profiles/default/tunnel
Tear down
vibecontrols tunnels delete <tunnel-id>
The plugin terminates the subprocess and removes the tunnel record.
Per-port forwards
For local-to-remote, remote-to-local, or dynamic SOCKS forwards (not public tunnels), use vibecontrols port-forward commands. These are tied to SSH targets.
Agent's own control-plane tunnel
The agent itself uses a tunnel for the backend to reach it. This is set up automatically on vibe start. Its URL is stored at Agent.tunnelUrl on the backend. You don't manage it directly — it's part of the agent lifecycle.
Next steps
- Session sharing — sessions get their own browser URLs via tunnel
- Tunneling & networking (admin)
- Concept: Tunnels