www.orgo.ai. Any websockify-compatible VNC client connects to it, so you need no Orgo package to embed one. This page uses noVNC.
The connection URL
Both endpoints need your API key, so call them from your server.
Two credentials, and which one goes in the browser
Your server holds the API key, reads the password with it, and returns only the password to your page.
View-only sharing
A client setting such asrfb.viewOnly = true only disables that client’s controls. It does not reduce the permission of a computer password sent to the browser; a visitor can turn the setting off.
For authenticated Orgo workspace viewers, the web proxy enforces view-only access on the server and filters input. Use workspace viewer access for this case. A public anonymous embed with a separate native VNC view-only password is not currently provided by this API.
Embed from any domain
There is no origin allowlist on this path and nothing to register with us. The per-computer password is the credential, and it is the only thing that decides whether a connection is allowed.Embed with noVNC
Two files. First a server route that trades your API key for the two values the browser needs.app/api/computer/route.ts
npm install @novnc/novnc. Earlier versions have no package-root export, so the import below fails on them.
Browser
disconnect event does not carry the close code.
A failed embed is a black screen
The proxy rejects a connection by accepting the WebSocket upgrade and then closing it. noVNC throws nothing, itsdisconnect event reports only clean: false, and the canvas stays black. The code appears only in the socket’s close event and in a noVNC console error. It is the only way to tell a bad password from a stopped computer.
Anything outside 4000-4599 is a standard WebSocket code. The proxy closes with
1000 when its own connection to the computer fails or ends, and with 1001 when it shuts down. 4003, 4007, 4008, 4500, 4502 and 4503 are worth retrying. The rest need an input changed first. A wrong path gets no Orgo code at all: a URL outside /desktops/{id}/ws/ fails the handshake, and the browser reports 1006.
Every long-lived embed eventually hits
4008. After 30 minutes with no human input the proxy closes the connection. The timer measures keyboard, pointer and clipboard input from your page, not pixels, so a computer an agent is driving with nobody watching still counts as idle. Treat 4008 as a clean close and reconnect on the next user action.The orgo-vnc package
For a React component, useorgo-vnc 0.3.0 or later (npm install orgo-vnc). Version 0.3.0, published on 2026-10-03, is the current release. It connects to the URL in The connection URL with ?token=. onClose receives every close code, plus a decoded reason when the package knows the code (null otherwise). onError receives a one-line message for each code it knows.
React
instanceId, but the package puts its value in the same /desktops/{id}/ path, so the computer’s id works there and does not change when a sleeping computer wakes on a new host. Fetch id and password from your server, as in Embed with noVNC.
Versions 0.2.x take a hostname prop and connect to wss://{hostname}/websockify, from when every computer had its own host. That address no longer exists, so 0.2.x cannot connect. 0.3.0 ignores hostname and logs a warning.
Next steps
Quickstart
Full SDK setup
API reference
Control computers programmatically