Skip to content

Remote View

Remote View is a Remote Ops feature for viewing a Guida browser tab from another client. It uses WebView2’s Chrome DevTools Protocol bridge to capture tab frames and a WebSocket stream to send frames and input messages.

Remote View is useful for browser dashboards, lightweight control UIs, and private-network observers that need to see what a Guida node is doing without sitting at the desktop.

  • Remote Ops API must be enabled.
  • The client must be able to reach the Remote Ops bind address and port.
  • Input is accepted only when the session is started with allowInput: true.

Guida does not authenticate Remote View clients separately from Remote Ops. Secure the channel externally.

Call browser.remoteView.start through POST /api/ops/rpc.

{
"jsonrpc": "2.0",
"id": "view-1",
"method": "browser.remoteView.start",
"params": {
"tabId": "optional-tab-id",
"transport": "websocket",
"allowInput": true,
"quality": 75,
"maxFps": 15
}
}

Omit tabId to use the active browser tab.

The result includes sessionId, tabId, webSocketUrl, frameFormat, inputEnabled, availableTransports, nodeId, and nodeName.

Connect to the returned webSocketUrl.

Server-to-client messages include:

  • session.started
  • frame
  • error
  • pong
  • session.stopped

Frame messages contain JPEG data and viewport metadata, including dimensions needed to map client pointer coordinates back to Guida’s input viewport.

Client-to-server messages include:

{ "type": "ping" }
{ "type": "session.stop" }
{ "type": "input.pointer", "event": "down", "x": 120, "y": 80, "button": "left", "clickCount": 1 }
{ "type": "input.pointer", "event": "up", "x": 120, "y": 80, "button": "left", "clickCount": 1 }
{ "type": "input.wheel", "x": 120, "y": 80, "deltaX": 0, "deltaY": -240 }
{ "type": "input.key", "event": "down", "key": "Enter", "code": "Enter" }
{ "type": "input.text", "text": "hello" }

The client must map rendered image coordinates back to the viewport metadata sent with each frame. Do not assume the image element size, JPEG dimensions, and browser input viewport are identical.

This matters especially when:

  • the client fits the frame into a resizable pane
  • Guida is using a desktop fit viewport
  • Guida is using a mobile or tablet device-emulation preset
  • the streamed frame includes browser/device offsets

Keep this mapping in one client-side utility. Pointer input should be sent in Guida’s input coordinate space, not in raw CSS pixels from the surrounding web UI.

When the Guida tab is using a mobile or tablet preset, Guida enables device and touch emulation. Remote View then forwards pointer-style input as CDP touch input where appropriate.

Wheel gestures may be translated into touch-scroll gestures for mobile viewports. Clients should still send the same Remote View protocol messages; Guida decides how to dispatch them to CDP based on the tab’s current viewport mode.

While a Remote View session is active, Guida shows an in-app indicator on the observed tab so the local user can see that the tab is being viewed or controlled.

View-only sessions indicate remote viewing. Input-enabled sessions indicate remote control. The indicator is part of Guida’s browser chrome, not arbitrary page content, and it is removed when the session stops.

Call browser.remoteView.stop:

{
"jsonrpc": "2.0",
"id": "view-stop-1",
"method": "browser.remoteView.stop",
"params": {
"sessionId": "remote-view-session-id",
"reason": "operator closed viewer"
}
}

Use browser.remoteView.status to inspect active sessions.

The first transport is WebSocket because it is simple and works well on private networks such as NetBird. The Remote View command and input protocol are deliberately separate from the transport so a later WebRTC transport can reuse the same session model.