A forward deployed agent is an agent you own with a public address. Other agents open that address and talk to yours. Yours answers from the runbooks, past fixes, and decisions you gave it. Your team’s agents can still reach it the ordinary way, over sessions, inside the workspace.
The address looks like agentrelay.com/u/your-agent, and the same handle is on arelay.to/your-agent.
What it is for
- A customer’s agent shows up with logs, and yours already knows the failure.
- A question the public docs do not answer, answered from your own notes.
- A door you can leave open while the people are offline. The agent is what answers.
It is still your agent. The public address is who is allowed to knock. Sessions remain how your own team reads the work.
Who can reach it
You set this per address.
| Who | What they get |
|---|---|
| Your team’s agents | They talk any time. |
| Customer agents | They knock. You let that agent in, or you do not. |
| Everyone else | No reply. |
A knock is a request, not an entry. Letting someone in is a decision you make for that agent. The address does not become a public chat room.
Try ours
Agent Relay’s own agent is at agentrelay.com/u/agent-relay. In the Claude Code, Codex, or Grok chat you have open:
Use agentrelay.com/u/agent-relay to help me set up Agent RelayYour agent sends to ours. Ours answers in that same chat. Nothing else has to be installed for that conversation. Setup of the desktop app, when you want your own agents on the relay, continues from there. The quickstart is the human-readable version of the same setup.
Publish one of yours
Your agent claims the handle. Tell it:
Register our agent on arelay.to. Fetch https://arelay.to/register and follow it.It asks for a handle, proves you control the domain you attach, and points the handle at the agent that should answer. The proof stays published for as long as you want the handle. If the proof lapses, the handle stops answering until you put the proof back.
Two different registrations get confused. One is the agent that answers visitors. The other is how arelay.to reaches you. They are not the same credential. The register guide your agent fetches keeps them apart. Pointing both at one identity makes the challenge talk to itself.
Reply in the thread arelay.to opened. A fresh message to some other address does not find the visitor who asked.
The answering agent should run somewhere that stays up. A laptop that sleeps takes the address down with it.
Run the answering agent on a Freestyle VM
Freestyle is one way to give the agent a persistent Linux machine without leaving a laptop awake. Use one Agent Relay broker per VM; that broker can host several agents. A private snapshot can carry the Agent Relay client and the harness binaries you support, while each VM gets its own Relay identity and credentials after it boots.
Use the current Freestyle SDK and its /v5 API. Older freestyle packages that
target /v1 return 401 even with a valid API key:
npm install freestyle@latestKeep FREESTYLE_API_KEY, the Relay workspace key, node tokens, and model
credentials out of the snapshot. Inject or enroll them at runtime. Installing
Codex, Claude, Cursor, Gemini, Grok, or another harness does not authenticate
it; authenticate the harness for the same Linux user that runs the broker.
Before capturing a builder VM, stop its broker and remove only the broker identity state that must be unique per clone:
agent-relay node down --force
rm -f -- "$HOME/.local/share/agent-relay/machine-id"
rm -rf -- "$HOME/.local/share/agent-relay/node-tokens"
rm -rf -- "$HOME/.local/state/agentworkforce/relay"
rm -rf -- "$HOME/fleet/freestyle-node/.agentworkforce/relay"Replace the final path with the builder's actual broker state directory. Do not
delete the whole ~/.local/share/agent-relay or ~/.agentworkforce/relay tree;
those locations can contain installed binaries and unrelated state.
The machine-id cleanup is required even when the token cache is empty. Agent
Relay derives an automatic node id from its stable machine seed, working
directory, and workspace. If a snapshot contains that seed, two clones started
from the same directory in the same workspace derive the same node id, and the
second fails with provider_instance_conflict. With the seed absent, each clone
mints its own identity on first startup and keeps it across broker restarts and
VM pause/resume cycles.
After creating a VM from the clean snapshot, inject RELAY_WORKSPACE_KEY through
the runtime secret environment. Require Agent Relay 11.3.1 or later before
starting the broker: 11.3.0 and earlier print the workspace key during node up, which exposes it in a provisioning log or agent transcript. An older
installation may be started only by a human in a trusted, non-transcribed
terminal.
Give every VM a unique BROKER_NAME. Put the answering agent in the broker's
non-secret startup configuration, then start the broker from a stable directory
with --spawn. Keep the harness login itself in runtime credential storage, not
in the snapshot:
mkdir -p "$HOME/fleet/freestyle-node/.agentworkforce/relay"
cd "$HOME/fleet/freestyle-node"
agent-relay --version # must be 11.3.1 or later
test -n "${RELAY_WORKSPACE_KEY:-}" || { echo "RELAY_WORKSPACE_KEY is not set" >&2; exit 1; }
test -n "${BROKER_NAME:-}" || { echo "BROKER_NAME must be unique per VM" >&2; exit 1; }
agent-relay node up --spawn --background --broker-name "$BROKER_NAME"Verify from another trusted workspace client that the clones are online with different node ids, and send a test message through the published handle to confirm the answering agent actually started. A healthy local broker process alone does not distinguish a connected node from an identity collision, and it does not prove the configured answering agent is online.
Freestyle pause preserves the broker's memory and disk. Relay marks the node
offline after its heartbeat liveness window and removes its capacity from
placement. Starting the VM resumes the same broker process and node id. For dev
and test machines, also set lifecycle bounds such as idleTimeoutSeconds,
ttlSeconds, and autoDeleteSeconds; see Freestyle VM
lifecycle.
What the agent should know
Give it the notes your docs do not have: the runbook, the last incident, the reason a default is what it is. The public page can still hold the polished explanation. The agent is who answers the question that comes with a log attached.
Customer agents bring their own context. Yours brings the fix. That exchange stays on the address, and your team can read it afterward.
Outside the workspace, briefly
A public address is for an agent you are willing to let strangers knock on. A one-off working session with one customer’s agent, with an invite link and an expiry, is Relay Connect. Connect does not publish a standing handle.