Name your preview URL in the terminal.
Live the second your server starts.
Every other tunnel makes a public URL something you allocate on their infrastructure — a random subdomain, a dashboard to reserve a name, a paid add-on for a custom one. Beamd flips it: you name the URL right in the terminal — beamd open 3000 --as api — or derive it from your git branch, and it's reachable the moment your server starts. No dashboard round-trip. You type the commands; your coding agents drive the exact same ones over MCP.
*Protip: Click "Run Simulation" to watch it resolve, fetch, and link step by step. @beamd/cli on npm ↗
One-time setup in about 5 minutes — even less on the hosted edge. Browse the docs →
Agents ship code. Beamd hands back a public URL — automatically.
Three agents, three projects, one edge. Every server an agent starts becomes a stable HTTPS URL — one names its web + api, one derives from a preview branch, one just takes the port. No dashboard and no per-app setup: the URL is reachable from anywhere the moment the server is up.
acme-web · names web + api
checkout · from preview branch
prototype · from the port
Open on your phone, share with a teammate, or hand it to a reviewer — live the moment the server starts, named from context.
Why do we need another tunnel software?
Built for agents. Built for builders who want to focus on creating and not configuring.
// 1. Explicitly named
$beamd open 3000 --as api
🔗 https://api-acme.staging.beamd.run
// 2. Derived from your current git branch
$beamd open 3000 --from branch
🔗 https://feat-stripe-auth-acme.staging.beamd.run
// 3. Derived from linked git worktree
$beamd open 3000 --from worktree
🔗 https://feat-stripe-auth-api-acme.staging.beamd.run
It's that simple. Get a stable, meaningful URL derived from your local context instantly. Other options include --from dir and --from repo.
The Capability Matrix
Every competitor treats a public URL as a resource you allocate on their infrastructure. Beamd treats it as a function of your local context, created instantly on infrastructure you own.
| Capability | Beamd | ngrok | Cloudflare Tunnel | Tailscale Funnel |
|---|---|---|---|---|
| Stable, meaningful name without pre-reserving it | ✅ derived | ❌ dashboard (paid) | ❌ DNS config | ❌ machine-fixed |
| Name derived from local context (port·dir·repo·branch·worktree) | ✅ unique | ❌ | ❌ | ❌ |
| Per-branch / per-worktree preview URLs, automatic & deterministic | ✅ | ❌ manual | ❌ manual | ❌ |
| Many tunnels up at once from one agent (multi-app dev) | ✅ flat | ⚠️ gated / paid concurrency | ⚠️ multi-hostname via config | ⚠️ per-machine |
| Many identities / edges on one machine (profiles) | ✅ first-class | ⚠️ config juggling | ⚠️ account switch | ⚠️ tailnet switch |
| Self-host the entire edge | ✅ | ❌ SaaS only | ❌ CF network | ❌ Headscale is 3rd-party |
| URLs on a domain you own/brand | ✅ any | ⚠️ custom = paid | ⚠️ must be CF-managed | ❌ *.ts.net |
| Traffic never crosses a third party's infra | ✅ | ❌ | ❌ | ❌ |
| Cost to expose N ephemeral apps | ✅ flat (your VPS) | ❌ per-tunnel/seat metered | ✅ free-ish | ⚠️ per-node |
| Built-in agent interface (MCP) that returns the URL synchronously | ✅ expose_port | ⚠️ API, SaaS-metered | ❌ | ❌ |
| Embeddable as a bundled binary in your own product (--json/--config) | ✅ @beamd/cli | ⚠️ SaaS SDK | ❌ | ❌ |
| Wrap a dev server + auto framework reachability & allowed-hosts | ✅ run | ❌ | ❌ | ❌ |
| Open source · single binary · no external account | ✅ Apache-2.0 | ❌ | ⚠️ connector OSS, needs CF acct | ⚠️ clients OSS, needs tailnet |
The tunnel that thinks like your dev environment and your agents.
The URL is derived, not allocated.
`beamd open 3000 --from worktree` in `~/code/checkout` on `feat/login` becomes `feat-login-checkout-acme.staging.beamd.run`. This makes per-task/per-branch agent previews automatic and repeatable with no registry.
Multi-everything is the design center.
Run multiple isolated profiles (personal, work, client) simultaneously. A single agent process holds many tunnels at once (frontend:3000, api:8080, worker:9090) for a flat cost.
You own the edge, namespace, and data path.
Terminates TLS on :443 and routes purely by Host header with real wildcard certs. N tunnels cost the same as one, traffic never touches a vendor, and URLs are on your domain.
Built for agents and for embedding.
Built-in MCP returns live URLs synchronously to agents. `--json` output and a bundled binary mean products can embed tunneling instead of integrating a SaaS.
One MCP config. Every coding agent.
Beamd ships an MCP server (beamd mcp). Wire it in once and any MCP-aware agent can open tunnels and get a live URL back — no per-agent integration. It's the same protocol everywhere, so a config that works for one works for all.
MCP is optional. The CLI is the API.
Every capability is a plain command with --json output. Agents are fluent in CLIs — it is what most of their training data looks like — so they drive Beamd reliably with or without MCP, and you run the exact same commands by hand.
$ beamd open 3000 --as apiExpose a local port at a name you choose.
$ beamd open 3000 --from branchDerive the name from git branch / worktree / repo / dir.
$ beamd run -- npm run devStart a dev server and expose it in one step.
$ beamd listShow the tunnels you have open.
$ beamd close apiTear a tunnel down by name.
$ beamd statusHealth and details for the current tunnels.
$ beamd login --server beam.example.com --token <token>Point your CLI at an edge.
$ beamd use acmeSwitch edges — many profiles, no logout churn.
$ beamd open 3000 --as api --jsonMachine-readable output for scripts and agents.
$ beamd mcpExpose the same actions as MCP tools over stdio.
Simple programmatic APIs & MCP support
Beamd operates as either a standalone global CLI utility or can be loaded natively into system prompts as an MCP (Model Context Protocol) Server.
Deterministic public URLs
Allow agents to determine exactly which subdomain to map or hook to, letting them consistently output links like review-pr-42-acme.staging.beamd.run automatically.
MCP Server natively built-in
Run beamd mcp (stdio) and agents like Claude Code or Cursor get three tools — expose_port, remove_tunnel, and list_tunnels — that return live URLs synchronously.
// Start the MCP server over stdio: beamd mcp
// Wired into Claude Code / Cursor, the agent gets three tools:
// expose_port(port, name?) · remove_tunnel(name) · list_tunnels()
{
"name": "expose_port",
"description": "Expose a local port as a public HTTPS URL and return it synchronously. Same as: beamd open <port> --as <name>.",
"inputSchema": {
"type": "object",
"properties": {
"port": { "type": "integer", "minimum": 1, "maximum": 65535,
"description": "Local TCP port the app is listening on." },
"name": { "type": "string",
"description": "Optional subdomain label. Defaults to the port number." }
},
"required": ["port"]
}
}The parts that make agent previews actually hold up.
Survives network blips
Run in the foreground like ngrok, or pass -d to detach for a background agent. The client reconnects through dropped wifi and replays your tunnels — the URL stays stable.
Works on :443 only
The client↔edge control link is multiplexed over the public :443 (ALPN), so Beamd reaches your edge from corp networks, hotel wifi, and CI runners where only :443 egress is allowed.
Automatic wildcard HTTPS
One wildcard cert per developer, issued and renewed automatically via Let's Encrypt (ACME DNS-01). Every app you expose reuses it — no per-app cert work.
Framework-aware run
beamd run -- npm run dev picks a free port, sets $PORT and $BEAMD_URL, and fixes Vite/Next allowed-hosts so the tunnel domain just works.
.beamd project config
Commit a .beamd with your edge and naming rule, and open/run need zero flags. It points at a profile, never a token — safe to commit.
Per-developer namespaces
On a shared edge, give each developer a slug so their tunnels live under *.<slug>.<base> — untrusted devs can't collide on names. Flat by default; opt in when you need it.
Quantify the review bottleneck
Effortless code reviews 24/7 on that Mac Mini you bought. Run multiple git worktree builds and share with teammates instantly.
120 hrs
Monthly developer hours saved from staging review apps
$9,000
Estimated monthly value of added productivity
*Calculated using standard blended software engineering wages and contextual build-overhead parameters.
Run your own Beamd Router
We run a hosted edge for quick starts, but Beamd is built to self-host: one binary, your server, your domain. Onboarding a developer mints a token and provisions DNS + a wildcard cert in a single command.
# 1 · run the edge — one binary on a box with a public IP $ beamd serve --config /etc/beamd/beamd.yaml # 2 · onboard a developer (mints token + provisions DNS & wildcard cert) $ beamd add-developer --slug turing # 3 · the developer points their CLI at your edge $ beamd login --server beam.example.com --token <token> $ beamd open 3001 --as api 🔗 https://api.turing.beam.example.com
Prefer containers? Pull the edge image: docker pull ghcr.io/dynamismlabs/beamd:latest