CLI reference
Every roomler command — status, peers, why, netcheck, forwards, routes, exec, ssh and diagnostics — with the flags that actually exist.
- reference
- cli
- commands
- tunnels
- diagnostics
roomler is the command-line tool. On a machine that also runs the agent it is
a thin shim onto the agent’s own command surface, so the two can never disagree
about their version.
`--agent` takes the hex device id
--agent on forward, socks5 and route add takes the hex device id from
the dashboard; a name is not resolved there, and passing one fails in a way that
looks like the device is missing rather than like a bad argument. The target of
exec, ssh and ping is different: it takes a device name, a dashboard
display name or the hex id — see Remote access below.
Status and inspection
| Command | Does |
|---|---|
roomler status |
This machine: id, version, mode, mesh address, server connection — and the mesh state per organization |
roomler peers |
Every peer the local agent sees, with its live connection type |
roomler peers --display-name |
The same table, with the dashboard display name in NAME where one is set (--json gains a display_name per peer) |
roomler peers <name>… |
Only those peers — each a device name or a display name, in the order given |
roomler why <peer> |
Why one peer rides the path it does: the ladder, each tier’s eligibility, and any hold-down overriding the ranking |
roomler netcheck |
This machine’s measured network capability: reachability, relay verdict, floor health, NAT class |
roomler flows |
Flows the local agent is currently running |
roomler logs --tail <n> |
Tail the agent’s log, resolved by the agent — the path differs per process and platform |
roomler ping <peer> |
Reachability over the mesh — by device name, display name or overlay address |
`why` is the command to reach for on a relay question
peers tells you a pair is relayed. why tells you which tier was eligible,
what it scored, and whether something is holding the decision down — which is
the difference between knowing and guessing.
`roomler logs --grep` reads a bounded tail
It searches a slice of the end of the log, not all of it. A negative result is not proof of absence.
Tunnels
roomler forward --agent <id> --local 5432 --remote localhost:5432
roomler forward --agent <id> --local 5432 --remote db.internal:5432 --daemon
roomler socks5 --agent <id> --local 1080
roomler socks5 --local 1080 # mesh mode: omit --agent
roomler kill <flow-id>| Flag | Means |
|---|---|
--agent |
Hex device id of the far end. On socks5, omitting it selects mesh mode |
--local |
Local port to listen on, bound to loopback |
--remote |
host:port the far end dials |
--daemon |
Hand the flow to the local agent so it outlives this command |
Both commands stay in the foreground without --daemon; Ctrl-C tears down.
Declared routes
Forwards the agent re-establishes on every start:
roomler route add --agent <id> --local 5432 --remote localhost:5432
roomler route ls
roomler route enable <id>
roomler route disable <id>
roomler route rm <id>Remote access
roomler exec <device> -- <command> # <device>: device name, display name or hex id
roomler ssh <device>
roomler ping <device>
roomler proxy <host> <port> # for OpenSSH ProxyCommandHow a device selector is read
A hex id or an address is used as is. A device name — the one the machine
reported, or the admin-set name — is resolved by the server, as it always was.
A dashboard display name is resolved by the CLI from your org’s device list,
only when no device name matches it (exactly first, then ignoring case), and
when two devices share one the command refuses and lists both rather than
guessing. roomler proxy resolves device names and MagicDNS names only.
On Windows, quote-containing arguments to `exec` can be lost
An argument with spaces can arrive at the far end empty. The tell is a blank
line or a zero-byte file rather than an error. Prefer roomler ssh when the
command has arguments that need quoting.
roomler proxy is for OpenSSH’s ProxyCommand — transport and name resolution
only. It cannot supply an identity or a host key, so it uses keys you
manage. For a session where the account is resolved by policy and the host key
is verified for you, use roomler ssh.
Diagnostics
roomler diag host # evidence bundle from one device
roomler diag pair <other-agent-id> # both ends, side by side
roomler diagnose --agent <id> # probe MTU, candidates and relay status from HERE`diag` and `diagnose` are different tools
diagnose probes from this machine. diag runs a canned, OS-appropriate
evidence set on the target devices — adapters, routes, firewall posture,
carrier state, recent warnings — which is what a “why is this pair relayed?”
question actually needs.
Configuration and identity
roomler config ls
roomler config set <key> <value>
roomler config clear <key>
roomler rename <new-name>
roomler enroll --server <url> --token <token> --name <name>
roomler self-update`self-update` refuses on a machine that runs the agent
There the installer owns the whole node stack and roomler is a shim with
nothing of its own to update. It is the real updater only on tunnel-only
machines.
Organizations
roomler org ls
roomler org overlay <org> tun
roomler org set-primary <org>
roomler org rm <org>Agent sessions you run in a terminal
roomler hive adopt # mirror the Claude Code sessions you run in a terminal into Roomler
roomler hive unadopt # take the hooks out againadopt adds three hooks to your own user-level Claude Code settings
(~/.claude/settings.json, or $CLAUDE_CONFIG_DIR/settings.json) and leaves
every other setting and hook in that file as it was; unadopt takes out
exactly those three. Each session you then run in a terminal is mirrored by
this machine and listed for you alone in Roomler, read-only: nobody prompts it
from there, and you may name readers. Nothing happens until this machine’s
owner turns on hive_adopt and maps your account in hive_accounts
(configuration). Stop mirroring in
Roomler stops watching that terminal run; the terminal goes on. A
claude --resume of it later is mirrored afresh, as a new session.
What leaves the machine
The server keeps that a session exists, its folder and its turns’ sizes — never what you typed or what came back. The transcript stays on this machine and reaches your browser over a direct, encrypted peer.
Getting help
Every command takes --help, and that is authoritative for the version you have
installed:
roomler --help
roomler forward --help