Join Machines as Nodes

Orchestration runs agents on your machines. A machine joins your hosted nfltr.xyz account once, as a node; the node starts Claude Code agents on demand when a hub spawns work there, and stops them when the work ends.


Join a machine

Run this on the machine, with NFLTR_API_KEY in the environment or a key saved with nfltr config add-api-key (never on the command line), and the Claude token in the environment (see Credentials):

$ nfltr node join --max-agents 4 --allow-all-tools \
    --workspace ~/src/app \
    --allow-repo 'github.com/your-org/*' \
    --machine-description "GPU box on the corp VPN; has the eval dataset in /data" \
    --machine-resources gpu.a100,vpn.corp,dataset.eval

Leave it running (a service manager, tmux or screen). --max-agents is required: the most agent processes this node runs at once, a number or cores.

Or join one over SSH

From your terminal, nfltr orch nodes add ssh starts a node on a remote host over ssh; it copies this nfltr binary when the remote OS and architecture match (or use --remote-bin). Node flags go after --.

$ nfltr orch nodes add ssh --max-agents 2 user@build-host -- --workspace /srv/app --allow-all-tools
$ nfltr orch nodes list
$ nfltr orch nodes stop

nodes list shows every node, its bound and its running agents. nodes stop stops the local node the zero-setup hub started on this machine; stop a joined node by ending its nfltr node join process. --ssh-command "ssh -p 2222" passes ssh options; --wait bounds how long to wait for the node to join.

nfltr node join flags

FlagMeaning
--max-agents N|coresRequired. Most agent processes at once.
--allow-all-toolsLet agents run commands without approval (shell, tests, git push, files outside the task checkout). Off: agents only edit files.
--workspace DIRThe checkout agents work in (default: the current directory).
--allow-repo GLOBRepositories agents may clone when a spawn names one that is not the workspace checkout; repeatable. None: never clone.
--machine-description TEXTWhat this machine gives access to (hosts, VPNs, GPUs, datasets). The hub reads it.
--machine-resources a,bResource tokens, e.g. gpu.a100,vpn.corp.
--labels k=v,…Labels the launched agents carry; spawns can require them.
--harness claude-code|codexOffer only this harness (repeatable). Default: every harness CLI found on PATH, and spawns then name one.
--agent-linger DKeep an agent process after its task so a continuation reuses it (default 0: it exits).
--agent-claim-timeout DExit a launched agent no task reached (default 2m).
--hub-absence-bound DAn agent whose results no hub collected for D frees its slot and waits to deliver them (default 10m; 0 = never).
--inherit-host-claude-configOpt in: agents use this machine's own Claude Code setup.
--allow-cross-session-messagingOpt in: agents may reach this machine's other Claude sessions.
--name IDNode id on the relay (default node-<machine id>).
--state-dir DIRWhere the node keeps its agent registry and logs.

Tools are opt-in

Without --allow-all-tools, agents can edit files in their checkout but every command that needs approval is refused, and the turn completes as tools_not_allowed, naming the node and the flag. Join with --allow-all-tools only on machines where you want agents to run commands.

Repositories

A spawn can name a repository and ref. A node whose --workspace checkout is that repository works in a fresh worktree of it. Otherwise the node takes it only if it matches an --allow-repo glob (matched on the normalized URL, so git@, ssh:// and https:// spellings of one remote match); it clones once into its cache and fetches refs on demand, using the machine's own git credentials. Changes come back as a branch and commit.

Describe the machine

The hub routes by what you tell it. Put what is only on this machine in --machine-description and --machine-resources: "has the production logs", "on the staging VPN", "runs the exporter service". A goal can then say "on the machine with the logs" without naming it.

Credentials and a clean Claude config

Agents run with a clean Claude config: none of the machine's user settings, hooks, CLAUDE.md, memory, plugins or MCP servers load (the task repository's own project settings still apply). So a keychain-only claude login is not read; put CLAUDE_CODE_OAUTH_TOKEN (from claude setup-token) or ANTHROPIC_API_KEY in the node's environment. The node checks this before joining and refuses with clean Claude config not established otherwise. --inherit-host-claude-config opts into the machine's own setup.

Session isolation

Agents cannot reach the machine's other Claude Code sessions (yours included): the node verifies this before any task and refuses to join if it cannot. --allow-cross-session-messaging opts out, only for machines where agents must talk to those sessions.

Agent lifetime and continuations

By default an agent process exits when its task ends. Continuing a finished agent (send_message) starts a new process on the same machine, in the same worktree and session, with its uncommitted edits restored. --agent-linger 10m keeps the process around for faster continuations. A session cannot move between machines.

When a node dies

The node owns its agents; if it is killed, its running agents end as node_lost, which the hub receives as a completion. Task worktrees the agents held are removed; branches they pushed stay. Run the same nfltr node join to bring the machine back: a spawn waiting for that machine then runs there. If the hub itself goes away instead, agents keep running and deliver their results when it reattaches.

$ nfltr orch nodes list

Related: Many agents across machines · Troubleshooting · Hub tools reference.