Live view
Three WebSocket streams let people watch a machine and take over. They're used by the dashboard and can be embedded in your own UI.
| Stream | Path | Protocol |
|---|---|---|
| Desktop | /api/machines/{id}/vnc |
RFB (VNC) over binary WebSocket — works with noVNC |
| Window events | /api/machines/{id}/events |
JSON messages with window geometry |
| Browser | /api/machines/{id}/browser |
Binary JPEG/PNG frames + JSON input messages |
Streams are authenticated by the dashboard session. For embedding in your own app, proxy them from your backend with your API key.
#Single-app view
The events stream sends the window list whenever it changes:
{ "t": "windows", "screen": "1440x900",
"windows": [{ "id": "0x00800003", "title": "GIMP", "class": "gimp.Gimp",
"x": 120, "y": 80, "w": 1024, "h": 700, "focused": true }] }
Crop the desktop stream to a window's rectangle to show just that app. Send {"t": "focus", "id": "0x00800003"} to raise it, or {"t": "launch", "app": "gimp"} to open an app.
#Browser stream
Frames arrive as binary messages, each preceded by a JSON meta message:
{ "t": "meta", "url": "https://example.com/", "title": "Example", "mime": "image/jpeg",
"tabs": [{ "index": 0, "url": "https://example.com/", "title": "Example", "active": true }] }
Input messages:
| Message | Effect |
|---|---|
{"t":"click","x":100,"y":200,"button":"left","count":1} |
Click in page coordinates |
{"t":"wheel","dx":0,"dy":400} |
Scroll |
{"t":"text","text":"hello"} / {"t":"key","key":"Enter"} |
Keyboard |
{"t":"nav","url":"example.com"} |
Navigate |
{"t":"back"}, {"t":"forward"}, {"t":"reload"} |
History |
{"t":"tab","index":1}, {"t":"newtab"}, {"t":"closetab","index":1} |
Tabs |
{"t":"login"} |
Fill the login form from the vault |