v0.0.2 · Open-SourceBeamd is entirely Apache-2.0 licensed. Self-host your own gateway router or use our public endpoint.Get CLI →
Open-source · Apache-2.0 · CLI + MCP for any agent

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.

$npm install -g @beamd/cli

*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 →

Live Map

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.

Claude Code
working

acme-web · names web + api

ship the dashboard + API
:3000beamd open 3000 --as web
:8080beamd open 8080 --as api
Cursor
working

checkout · from preview branch

fix login on feat/login
:3000beamd open 3000 --from branch
Codex
working

prototype · from the port

spin up a quick demo
:5173beamd open 5173
beamd_:443 · TLSone conn · yamux
Preview from anywhere
https://web-acme.staging.beamd.run
https://api-acme.staging.beamd.run
https://feat-login-acme.staging.beamd.run
https://5173-acme.staging.beamd.run

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.

Context-Aware Previews

// 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.

CapabilityBeamdngrokCloudflare TunnelTailscale 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
Legend: ✅ native · ⚠️ partial / paid / config-heavy · ❌ not really
The Beamd Difference

The tunnel that thinks like your dev environment and your agents.

[Pillar 1]

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.

[Pillar 2]

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.

[Pillar 3]

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.

[Pillar 4]

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.

Deliberately focused: Beamd does one thing — turn local apps into named, public preview URLs for agents and multi-app dev. It's not a global anycast CDN/WAF or a VPN mesh, and that's the point: no per-app ceremony, no mesh to enroll, and (self-hosted) no vendor in your data path.
Bring your own agent

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.

Claude Code
OpenAI Codex
Cursor
OpenClaw
Gemini CLI
Cline
Windsurf
OpenCode
+any MCP client
CLI-first

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.

Expose
$ beamd open 3000 --as api

Expose a local port at a name you choose.

$ beamd open 3000 --from branch

Derive the name from git branch / worktree / repo / dir.

$ beamd run -- npm run dev

Start a dev server and expose it in one step.

Manage
$ beamd list

Show the tunnels you have open.

$ beamd close api

Tear a tunnel down by name.

$ beamd status

Health and details for the current tunnels.

Connect
$ beamd login --server beam.example.com --token <token>

Point your CLI at an edge.

$ beamd use acme

Switch edges — many profiles, no logout churn.

Automate
$ beamd open 3000 --as api --json

Machine-readable output for scripts and agents.

$ beamd mcp

Expose the same actions as MCP tools over stdio.

No Config Friction

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"]
  }
}
Built In, Not Bolted On

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.

Value of Added Productivity

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.

Active Developers on the Team4 Devs
Daily Agent Code Runs / Reviews6 Reviews / Day
Average Wait Time per CI / Staging Build15 Minutes
Productivity Gains

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