Advanced
macOS / Linux / Windows (WSL2) / Self-hosted
Estimated time: 18 min

OpenClaw Remote Browser Setup: Gateway on One Machine, Browser on Another

Choose a stable remote-browser topology for OpenClaw, pin the right browser-capable node, and verify that gateway routing, relay startup, and browser takeover all land on the machine you intended.

Implementation Steps

The gateway can live on a VPS, but the browser should usually live on the machine that actually owns Chrome and your local session state.

One of the easiest ways to confuse yourself in OpenClaw is this setup:

  • the gateway runs on a VPS or another machine,
  • your browser lives on your laptop,
  • and more than one node can potentially proxy browser actions.

When this setup is stable, it feels magical.

When it is not, the symptoms all look similar:

  • browser takeover fails,
  • the extension relay never seems to start,
  • 127.0.0.1:18792 is not listening,
  • or the CLI/UI looks like it is talking to the wrong machine.

This guide is about making that topology boring.

What this guide helps you finish

By the end of this guide, you should be able to:

  • tell which machine owns the gateway path and which machine owns the browser path
  • pin one intentional browser-capable node when the setup stops being trivial
  • separate relay startup failures from routing mistakes
  • verify that browser control still lands on the machine you intended after refreshes or service restarts

Who this is for (and not for)

This guide is for operators who:

  • run the OpenClaw gateway on a VPS, NAS, or always-on machine
  • keep Chrome, Brave, or Edge on their laptop or desktop
  • use a node host to bridge browser control back to that local browser machine

This is not the right page if:

  • everything runs on one machine and the browser is local there too
  • your main symptom is generic browser timeout without any remote-node topology involved
  • you are still deciding whether remote browser automation is worth enabling at all

If the topology only became flaky after an upgrade, validate the upgrade boundary first:

If you are already seeing a generic browser timeout, also check:


1) The right mental model

Think of remote browser automation as two separate paths:

  1. the client path to the gateway,
  2. the gateway path to the browser-capable node.

Those are different problems.

If you debug them as one blob, you get a lot of “it says unreachable” confusion.

Recommended topology:

  • keep the gateway on the always-on machine,
  • keep Chrome/Brave/Edge on the machine where you actually use the browser,
  • run a node host on that browser machine,
  • and let the gateway proxy browser actions to that node.

If that same node host is also used for host-side command execution, remember that browser routing and command approvals are different systems:


Before you change config: collect these four facts

Before you debug anything, write down:

  1. which machine currently runs the gateway
  2. which machine actually has the browser profile and extension relay
  3. whether more than one node can proxy browser actions
  4. whether the failure is “wrong target,” “relay never starts,” or “browser control times out after routing”

This step matters because remote-browser problems often look identical from the UI while coming from different layers.


2) First prove which gateway you are actually probing

Start here:

openclaw gateway status

What you are looking for:

  • is the CLI in local mode or remote mode,
  • which URL it thinks the gateway lives at,
  • whether the gateway you are probing is the one you intended.

This matters because a local service and a remote gateway can both exist at the same time, and the symptoms look deceptively similar.

If this part is already confused, fix it first:


3) Prefer one intentional browser-capable node

If the gateway runs remotely but the browser is local, the clean setup is:

  • one browser machine,
  • one node host on that machine,
  • and one obvious route for browser control.

The setup gets fragile when you have multiple browser-capable nodes connected at once, for example:

  • a macOS app node,
  • and a CLI node host,
  • both able to proxy browser actions.

At that point, “auto” is no longer your friend.


4) Pin browser routing before you call it flaky

When multiple nodes can handle browser proxying, pin the target explicitly.

Use config like this conceptually:

{
  gateway: {
    nodes: {
      browser: {
        mode: "manual",
        node: "my-browser-node"
      }
    }
  }
}

Practical rule:

  • if there is only one browser-capable node, auto can be fine,
  • if there are two or more, pin the node.

Why this helps:

  • it removes routing ambiguity,
  • it makes failures reproducible,
  • and it prevents “sometimes the relay starts, sometimes it doesn’t” behavior caused by the wrong node being selected.

5) Distinguish a dead relay from a wrong routing decision

If takeover fails, do not jump straight to “the extension is broken.”

Ask two different questions:

5.1 Is the chosen browser node correct?

  • Did the gateway route to the node you expected?
  • Are multiple browser-capable nodes present?
  • Did you actually pin one?

5.2 Did the local relay start on the browser machine?

On the browser machine, check whether the extension relay is listening:

lsof -nP -iTCP:18792 -sTCP:LISTEN

If nothing is listening there, that usually means the browser-side relay path never initialized on the intended machine.

That is a routing/topology clue, not just a generic timeout clue.


Use this order every time:

  1. confirm the gateway target with openclaw gateway status
  2. confirm the correct browser node is paired and healthy
  3. pin gateway.nodes.browser.node when more than one node can proxy
  4. restart the affected services if you changed config
  5. test one tiny browser action before trying a full takeover workflow

That order saves a lot of time because it separates:

  • gateway reachability,
  • node routing,
  • browser relay startup,
  • and page-level automation problems.

7) Verification: prove the setup is really stable

Treat one successful takeover as a smoke test, not full proof.

For a setup to feel operationally stable, verify all of these:

  • openclaw gateway status still points at the intended gateway after you reopen the shell
  • the browser-capable node remains the one you intended after reconnects or restarts
  • the relay listens on the browser machine before you attempt a larger workflow
  • one small browser action succeeds before you try a full takeover or automation chain
  • a second attempt from the same setup still lands on the same browser machine instead of drifting

If the setup only works once and then becomes ambiguous again, the topology is still under-specified.


8) Security and reliability defaults that age well

For long-lived remote setups:

  • keep the gateway and node hosts tailnet-only,
  • use a dedicated browser profile instead of your daily-driver profile,
  • do not expose relay/control ports publicly,
  • and disable browser proxy routing entirely when you do not need it.

If you also use the node host for command execution, keep the approvals posture explicit rather than assuming “trusted browser node” automatically means “trusted exec node”:

This setup is not just about security — it also reduces mysterious cross-machine state drift.


The CLI/UI seems to hit the wrong machine

Read:

Browser runs time out in general

Read:

Windows node-host behavior itself is unstable

Read:


10) What to keep stable after it works

Once the topology is behaving, resist the urge to keep “improving” it casually.

The setups that age well usually keep these things stable:

  • one browser-capable node with a clear role
  • one predictable gateway target
  • one intentional routing mode once the topology is no longer trivial
  • one browser profile used for automation rather than a shifting daily-driver environment

Most “it used to work” reports are not about the browser tool itself. They come from silent topology drift.


Quick checklist

  • openclaw gateway status points at the gateway you intended
  • The browser machine has exactly one intentional browser-capable node, or you pinned one
  • gateway.nodes.browser.node is set when multiple nodes are connected
  • gateway.nodes.browser.mode is not left ambiguous for a non-trivial setup
  • The relay actually listens on the browser machine before you blame page automation

Verification & references

  • Reviewed by:CoClaw Editorial Team
  • Last reviewed:March 14, 2026
  • Verified on: macOS · Linux · Windows (WSL2) · Self-hosted

Related Resources

Need live assistance?

Ask in the community forum or Discord support channels.

Get Support