Browser
Chrome automation as REST API—control browsers programmatically, scrape data, run tests.
Your desktop applications are URLs. Run VS Code, browsers, LibreOffice, any GUI program—accessible from your phone, tablet, laptop, or TV. Just open the URL.
Every Hoody container includes hoody-display, transforming your entire Linux desktop into a web-native interface with zero client installation.
hoody-display provides complete desktop access through HTTP:
Official Technical Reference:
For complete endpoint documentation with all parameters, responses, and examples:
Web Client Interface:
dark_mode, decorations, toolbar, floating_menu, titleencoding, bandwidth_limit, video, qualitykeyboard_layout, swap_keys, clipboard, keyboardsharing, steal, reconnect, readonlysound, file_transfer, printingdebug_main, debug_network, debug_keyboard, debug_mouseScreenshot & Thumbnail API:
System Information:
Mouse Control:
Keyboard Control:
Window Management:
Compound Actions (Computer Use):
Every container can run multiple display instances—one per application:
https://{project}-{container}-display-1.{server}.containers.hoody.icuhttps://{project}-{container}-display-2.{server}.containers.hoody.icuhttps://{project}-{container}-display-3.{server}.containers.hoody.icuRecommended pattern: One display per application
display-1 - Your main IDE (VS Code)display-2 - Web browser (Firefox/Chrome)display-3 - Office applications (LibreOffice)display-4 - Graphics editor (GIMP)display-5 - Database toolsWhy separate displays matter:
Each display runs independently with its own:
Access any display from any browser—phone, tablet, laptop, TV. No installation. No configuration. Just open the URL.
Terminal integration: When you use terminal-5, it automatically connects to display-5 (:5 in X11 terms). This makes GUI programs work seamlessly—run firefox in terminal-5, and it appears in display-5.
Manual display selection: Set the DISPLAY environment variable to target a specific display:
# In any terminalexport DISPLAY=:5
# Now GUI programs open in display-5firefox & # Opens in display-5code . # Opens in display-5This flexibility lets you organize applications across displays while controlling them from any terminal.
Your phone is now a full computer:
Same URL on different devices:
Because everything is HTTP, device capabilities don’t limit you. Your phone didn’t get more powerful—it became a window into infinite compute.
Share the URL and everyone sees/controls the same desktop:
https://{project}-{container}-display-1.{server}.containers.hoody.icu/?sharing=trueMultiple users connecting:
Perfect for:
See: Multiplayer by Default → for collaboration philosophy.
Configure the entire experience via URL parameters:
# Read-only dashboard?readonly=true&decorations=false&toolbar=false&reconnect=true
# Low-bandwidth mode?encoding=jpeg&bandwidth_limit=1000000&video=false&sound=false
# Collaborative session?sharing=true&steal=false
# macOS user setup?swap_keys=true&keyboard_layout=us
# Dark mode with floating menu?floating_menu=true&dark_mode=trueOver 50 parameters control UI, performance, input, features, and behavior.
See: Web Client Interface → for complete customization reference.
Programmatically capture desktop state:
# Capture current screenshotGET /screenshot?displayId=1
# Get as base64 for AI visionGET /screenshot?base64=true
# Lightweight thumbnailGET /thumbnail/lastUse cases:
See: Screenshot API →
Because displays are URLs, they’re <iframe>able:
<!-- Embed desktop in webpage --><iframe src="https://{project}-{container}-display-1.{server}.containers.hoody.icu" width="1280" height="720" />
<!-- Multiple displays in one page --><iframe src="https://prod-container-display-1.hoody.icu" /><iframe src="https://staging-container-display-1.hoody.icu" /><iframe src="https://dev-container-display-1.hoody.icu" />Build custom dashboards by composing iframes. Your infrastructure IS the UI.
See: Embeddability Revolution →
RDP Client (installed) → RDP Server (configured) → Desktop (complex)Problems:
Any Browser → Display URL → Desktop (immediately)Advantages:
<iframe src="display-url" />)Your phone can now run:
// Phone browser opens display URLhttps://{project}-{container}-display-1.{server}.containers.hoody.icu
// Inside that desktop:- Full VS Code IDE- Chrome browser with DevTools- Terminal sessions- Database tools- Any Linux GUI applicationThe device doesn’t matter. The URL is the computer.
This is where Hoody gets dangerous. Full programmatic control of any desktop over HTTP — mouse, keyboard, windows, compound actions. Dozens of endpoints. Every one of them a REST call.
AI agents, automation scripts, remote operators — anything that can make an HTTP request can now drive a GUI application with the precision of a human, at the speed of software.
Pixel-precise cursor control at any speed:
# Move cursor to positionhoody display move --x 640 --y 480 --display-id 10 -c <container-id>
# Click at current positionhoody display click --button 1 --display-id 10 -c <container-id>
# Double-clickhoody display double-click --button 1 --display-id 10 -c <container-id>
# Scroll downhoody display scroll --direction down --clicks 5 --display-id 10 -c <container-id>import { HoodyClient } from '@hoody-ai/hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.icu', token: process.env.HOODY_TOKEN });const containerClient = await client.withContainer({ id: CONTAINER_ID, project_id: PROJECT_ID, server: SERVER });
// Move cursor to positionawait containerClient.display.input.mouseMove({ x: 960, y: 540 }, { displayId: 10 });
// Click the left mouse buttonawait containerClient.display.input.mouseClick({ button: 1 }, { displayId: 10 });
// Double-clickawait containerClient.display.input.mouseDoubleClick({ button: 1 }, { displayId: 10 });
// Scroll downawait containerClient.display.input.mouseScroll({ direction: 'down', clicks: 3 }, { displayId: 10 });
// Get current cursor positionconst location = await containerClient.display.input.mouseLocation({ displayId: 10 });# Click the left mouse buttoncurl -X POST "https://{project}-{container}-display-1.{server}.containers.hoody.icu/api/v1/display/mouse/click" \ -H "Content-Type: application/json" \ -d '{"button": 1}'
# Double-clickcurl -X POST ".../api/v1/display/mouse/double-click" \ -d '{"button": 1}'
# Move cursor to absolute positioncurl -X POST ".../api/v1/display/mouse/move" \ -d '{"x": 960, "y": 540}'
# Move cursor by relative offsetcurl -X POST ".../api/v1/display/mouse/move-relative" \ -d '{"x": 50, "y": -20}'
# Press and hold mouse button (for drag setup)curl -X POST ".../api/v1/display/mouse/down" \ -d '{"button": 1}'
# Release held mouse buttoncurl -X POST ".../api/v1/display/mouse/up" \ -d '{"button": 1}'
# Scroll downcurl -X POST ".../api/v1/display/mouse/scroll" \ -d '{"direction": "down", "clicks": 3}'
# Get current cursor positioncurl ".../api/v1/display/mouse/location"Available mouse buttons: 1 (left), 2 (middle), 3 (right)
Type text and send any key combination the OS understands:
# Type texthoody display type --text "Hello, World!" --delay 50 --display-id 10 -c <container-id>
# Press key combinationhoody display key --keys "ctrl+s" --display-id 10 -c <container-id>
# Hold keyhoody display key-down --key "Shift_L" --hold-ms 2000 --display-id 10 -c <container-id>// Type a string of textawait containerClient.display.input.keyboardType({ text: 'Hello, world!' }, { displayId: 10 });
// Press key combinations (X11 keysym notation)await containerClient.display.input.keyboardKey({ keys: ['ctrl+c'] }, { displayId: 10 });await containerClient.display.input.keyboardKey({ keys: ['ctrl+shift+t'] }, { displayId: 10 });
// Hold a key downawait containerClient.display.input.keyboardKeyDown({ key: 'shift' }, { displayId: 10 });
// Release a held keyawait containerClient.display.input.keyboardKeyUp({ key: 'shift' }, { displayId: 10 });# Type a string of textcurl -X POST "https://{project}-{container}-display-1.{server}.containers.hoody.icu/api/v1/display/keyboard/type" \ -H "Content-Type: application/json" \ -d '{"text": "Hello, world!"}'
# Press key combinations (X11 keysym notation)curl -X POST ".../api/v1/display/keyboard/key" \ -d '{"keys": ["ctrl+c"]}'
curl -X POST ".../api/v1/display/keyboard/key" \ -d '{"keys": ["ctrl+shift+t"]}'
curl -X POST ".../api/v1/display/keyboard/key" \ -d '{"keys": ["super+l"]}'
# Hold a key down (for sustained modifier keys)curl -X POST ".../api/v1/display/keyboard/key-down" \ -d '{"key": "shift"}'
# Release a held keycurl -X POST ".../api/v1/display/keyboard/key-up" \ -d '{"key": "shift"}'Enumerate, target, and fully control any window on the desktop:
# List visible windowshoody display list --only-visible --display-id 10 -c <container-id>
# Focus a windowhoody display focus --window-id 83886081 --display-id 10 -c <container-id>
# Move a windowhoody display move --window-id 83886081 --x 100 --y 100 --display-id 10 -c <container-id>
# Resize a windowhoody display resize --window-id 83886081 --width 1024 --height 768 --display-id 10 -c <container-id>
# Search for windows by namehoody display search --pattern "Firefox" --name --only-visible --display-id 10 -c <container-id>// List all windowsconst windows = await containerClient.display.listWindows({ displayId: 10 });
// Get the currently active window IDconst activeId = await containerClient.display.input.windowActive({ displayId: 10 });
// Search windows by title patternconst matches = await containerClient.display.input.windowSearch({ pattern: 'Visual Studio Code' }, { displayId: 10 });
// Focus/activate a windowawait containerClient.display.input.windowFocus({ windowId: 12345678 }, { displayId: 10 });
// Move a window to new positionawait containerClient.display.input.windowMove({ windowId: 12345678, x: 100, y: 50 }, { displayId: 10 });
// Resize a windowawait containerClient.display.input.windowResize({ windowId: 12345678, width: 1280, height: 800 }, { displayId: 10 });
// Close a windowawait containerClient.display.input.windowClose({ windowId: 12345678 }, { displayId: 10 });# List all windowscurl "https://{project}-{container}-display-1.{server}.containers.hoody.icu/api/v1/display/windows"
# Get the currently active window IDcurl ".../api/v1/display/window/active"
# Search windows by title patterncurl -X POST ".../api/v1/display/window/search" \ -H "Content-Type: application/json" \ -d '{"pattern": "Visual Studio Code"}'
# Focus/activate a windowcurl -X POST ".../api/v1/display/window/focus" \ -d '{"windowId": 12345678}'
# Move a window to new positioncurl -X POST ".../api/v1/display/window/move" \ -d '{"windowId": 12345678, "x": 100, "y": 50}'
# Resize a windowcurl -X POST ".../api/v1/display/window/resize" \ -d '{"windowId": 12345678, "width": 1280, "height": 800}'
# Minimize a windowcurl -X POST ".../api/v1/display/window/minimize" \ -d '{"windowId": 12345678}'
# Raise window to top of z-ordercurl -X POST ".../api/v1/display/window/raise" \ -d '{"windowId": 12345678}'
# Close a windowcurl -X POST ".../api/v1/display/window/close" \ -d '{"windowId": 12345678}'
# Get window position and sizecurl ".../api/v1/display/window/12345678/geometry"
# Get window titlecurl ".../api/v1/display/window/12345678/name"
# Get extended window propertiescurl ".../api/v1/display/window/12345678/properties"The high-level interface for computer use workflows. These endpoints combine multiple primitives into single atomic operations — exactly what AI agents need:
# Click at specific positionhoody display click-at --x 640 --y 480 --button 1 --display-id 10 -c <container-id>
# Type at positionhoody display type-at --x 300 --y 400 --text "Hello" --delay 50 --display-id 10 -c <container-id>
# Drag between positionshoody display drag --start-x 100 --start-y 100 --end-x 300 --end-y 300 --button 1 --steps 50 --display-id 10 -c <container-id>
# Execute action with screenshothoody display act --action "mouse/click" --params '{"button":1}' --screenshot --screenshot-delay 200 --display-id 10 -c <container-id>// Click at specific positionawait containerClient.display.input.clickAt({ x: 960, y: 540, button: 1 }, { displayId: 10 });
// Move, click, and type — fill a form fieldawait containerClient.display.input.typeAt({ x: 450, y: 320, text: 'user@example.com' }, { displayId: 10 });
// Drag from one position to anotherawait containerClient.display.input.drag({ startX: 100, startY: 200, endX: 500, endY: 200 }, { displayId: 10 });
// Execute action with post-action screenshotconst result = await containerClient.display.input.act({ action: 'mouse/click', params: { button: 1 }, screenshot: true,}, { displayId: 10 });
// Execute a sequence of actions in one callawait containerClient.display.input.batch({ actions: [ { action: 'mouse/click', params: { button: 1 } }, { action: 'wait', params: { ms: 500 } }, { action: 'keyboard/type', params: { text: 'https://hoody.icu' } }, { action: 'keyboard/key', params: { keys: ['Return'] } }, { action: 'wait', params: { ms: 2000 } }, { action: 'screenshot' }, ],}, { displayId: 10 });
// Emergency: release all held inputsawait containerClient.display.input.reset({ displayId: 10 });# Move cursor and click in one callcurl -X POST "https://{project}-{container}-display-1.{server}.containers.hoody.icu/api/v1/display/input/click-at" \ -H "Content-Type: application/json" \ -d '{"x": 960, "y": 540, "button": 1}'
# Move, click, and type — all in one operation# Perfect for filling form fieldscurl -X POST ".../api/v1/display/input/type-at" \ -d '{"x": 450, "y": 320, "text": "user@example.com"}'
# Drag from one position to anothercurl -X POST ".../api/v1/display/input/drag" \ -d '{"startX": 100, "startY": 200, "endX": 500, "endY": 200}'
# Select a range via click + shift-clickcurl -X POST ".../api/v1/display/input/select" \ -d '{"x": 200, "y": 150, "endX": 800, "endY": 150}'
# Execute a single action with optional post-action screenshotcurl -X POST ".../api/v1/display/input/act" \ -d '{"action": "mouse/click", "params": {"button": 1}, "screenshot": true}'
# Wait (with optional screenshot to observe state)curl -X POST ".../api/v1/display/input/wait" \ -d '{"ms": 1500, "screenshot": true}'
# Execute a sequence of actions in one HTTP callcurl -X POST ".../api/v1/display/input/batch" \ -H "Content-Type: application/json" \ -d '{ "actions": [ {"action": "mouse/click", "params": {"button": 1}}, {"action": "wait", "params": {"ms": 500}}, {"action": "keyboard/type", "params": {"text": "https://hoody.icu"}}, {"action": "keyboard/key", "params": {"keys": ["Return"]}}, {"action": "wait", "params": {"ms": 2000}}, {"action": "screenshot"} ] }'
# Emergency: release all held inputs (buttons, keys)curl -X POST ".../api/v1/display/input/reset"
# Get display dimensionscurl ".../api/v1/display/input/display-geometry"AI agent opens a browser, navigates, fills a form, submits:
const base = 'https://{project}-{container}-display-1.{server}.containers.hoody.icu';
// 1. Find the browser windowconst windows = await fetch(`${base}/api/v1/display/windows`).then(r => r.json());const browser = windows.find(w => w.name.includes('Firefox'));
// 2. Focus itawait fetch(`${base}/api/v1/display/window/focus`, { method: 'POST', body: JSON.stringify({ windowId: browser.id })});
// 3. Navigate to URL via address barawait fetch(`${base}/api/v1/display/input/batch`, { method: 'POST', body: JSON.stringify({ actions: [ { action: 'keyboard/key', params: { keys: ['ctrl+l'] } }, // Focus address bar { action: 'wait', params: { ms: 200 } }, { action: 'keyboard/type', params: { text: 'https://app.example.com/login' } }, { action: 'keyboard/key', params: { keys: ['Return'] } }, { action: 'wait', params: { ms: 2000 } }, // Wait for page load { action: 'screenshot' } // Verify it loaded ] })});
// 4. Fill in login formawait fetch(`${base}/api/v1/display/input/type-at`, { method: 'POST', body: JSON.stringify({ x: 640, y: 380, text: 'user@example.com' })});
await fetch(`${base}/api/v1/display/input/type-at`, { method: 'POST', body: JSON.stringify({ x: 640, y: 450, text: 'supersecretpassword' })});
// 5. Submit and capture resultconst result = await fetch(`${base}/api/v1/display/input/act`, { method: 'POST', body: JSON.stringify({ action: 'keyboard/key', params: { keys: ['Return'] }, screenshot: true })}).then(r => r.json());
// result.screenshot contains base64 PNG — send to vision model to verify login successThis is full computer use. Not CLI wrappers. Not browser automation. Actual pixel-level GUI control over HTTP, on any Linux application, in any window, driven by anything that can make a curl request.
Access your full dev environment from any device:
# Laptop: Configure displayhttps://dev-container-display-1.hoody.icu/?fontSize=14&swap_keys=true
# Phone (later): Same URL, same environmenthttps://dev-container-display-1.hoody.icu/?fontSize=14&swap_keys=true
# Tablet (during presentation): Same environmenthttps://dev-container-display-1.hoody.icu/?fontSize=16One computer. Accessible from phone, laptop, tablet, TV. Not synced—actually the same running instance.
Multiple users working in same desktop:
// Setup: Create collaborative sessionconst displayUrl = 'https://{project}-{container}-display-1.{server}.containers.hoody.icu';const collaborativeUrl = `${displayUrl}/?sharing=true&steal=false`;
// Share URL with team// Everyone sees same desktop// Everyone can:// - Open files in shared VS Code// - Type in shared terminal// - Click in shared browser// - Edit in shared applications
// Real-time collaboration like Google Docs, but for your entire desktopSupport agent helps customer by joining their desktop:
# Customer shares display URLhttps://customer-issue-container-display-1.hoody.icu/?sharing=true
# Support agent opens URL on phone during commute# Sees customer's desktop# Types fix directly# Issue resolved in 2 minutes
# No screen share setup# No "can you see my screen?"# Just shared desktop statePresent live desktop to team:
# Presenter URL (full control)?sharing=true&steal=false&readonly=false
# Viewers URL (watch only)?sharing=true&steal=false&readonly=truePresenter controls desktop. Viewers watch in real-time. Perfect for:
Let AI see and analyze your desktop:
// 1. Capture screenshot via HTTPconst response = await fetch( 'https://{project}-{container}-display-1.{server}.containers.hoody.icu/screenshot?base64=true');const { image, info } = await response.json();
// 2. Send to a vision model via Hoody AI (any provider you've configured)const analysis = await ai.chat.completions.create({ model: 'your-vision-model', messages: [{ role: 'user', content: [ { type: 'text', text: 'What errors do you see in this IDE?' }, { type: 'image_url', image_url: { url: `data:image/png;base64,${image.data}` }} ] }]});
// 3. AI describes what it seesconsole.log(analysis.choices[0].message.content);// "I see a syntax error on line 23: unclosed bracket..."AI can now see your desktop and provide visual debugging, UI analysis, and accessibility testing.
Embed multiple displays in monitoring dashboard:
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem;"> <!-- Production --> <iframe src="https://prod-container-display-1.hoody.icu/?readonly=true&toolbar=false" />
<!-- Staging --> <iframe src="https://staging-container-display-1.hoody.icu/?readonly=true&toolbar=false" />
<!-- Development --> <iframe src="https://dev-container-display-1.hoody.icu/?readonly=true&toolbar=false" /></div>Live view of all environments. No switching tabs. All visible at once.
Work from café, beach, airport, hotel—anywhere with internet. Your desktop isn’t on your laptop—it’s in the URL. Laptop breaks? Use any device. Travel light, work heavy.
20 brand accounts, one desktop, five team members:
One container runs multiple browsers, each logged into different social accounts. All team members open the display URL. Everyone sees all 20 browsers. Coordinate without “whose turn to post?” or credential sharing.
One computer is shared control center. No individual logins. No syncing. Just shared desktop state.
Start coding on laptop. Continue on tablet during commute. Finish on phone at café. Same VS Code. Same terminal. Same files. Not synced—same actual desktop.
AI agent joins your display URL:
AI and human as peers on same desktop. Not AI suggesting—AI executing.
Instructor’s desktop URL shared with 30 students. Everyone sees the same screen. Instructor demonstrates. Students can take control when invited. Interactive learning at scale.
Customer has issue. Shares display URL. Support agent opens URL on ANY device. Sees customer’s desktop. Types fix. Issue resolved. No Zoom. No “can you click here?”. Just shared desktop via URL.
On fast connection:
?encoding=h264&quality=90&video=trueOn slow/metered connection:
?encoding=jpeg&quality=60&video=false&bandwidth_limit=500000Prevent accidental input during demos:
?readonly=true&steal=false&sharing=trueViewers can’t type or click. Perfect for presentations or monitoring dashboards.
macOS users need key swap:
?swap_keys=true&keyboard_layout=usMaps Cmd to Ctrl automatically, preserving muscle memory for copy/paste.
Auto-reconnect on network interruption:
?reconnect=trueEssential for mobile use (switching WiFi/cellular) or unreliable networks.
Build monitoring views with lightweight previews:
// Get thumbnail (small, fast)const thumb = await fetch('.../thumbnail/last');
// Full screenshot only when neededconst full = await fetch('.../screenshot/last');Thumbnails are 320px wide vs full 1920px—dramatically less bandwidth.
Turn off unused features:
?sound=false&printing=false&clipboard=false&file_transfer=falseReduces bandwidth and CPU usage. Enable only what you need.
Yes! Your phone’s browser becomes a window into a full Linux desktop. Run VS Code, LibreOffice, GIMP, browsers—any GUI application. The phone isn’t running the apps—it’s displaying a desktop that runs in the container. The heavy lifting happens on your server.
Each number is a separate desktop environment. display-1 might show VS Code, display-2 shows monitoring tools, display-3 shows browsers. Each isolated, each accessible via its own URL. One container can have multiple desktops.
The display protocol synchronizes state automatically. When User A types, it updates the display server, which broadcasts to all connected clients including User B. Input is serialized (one keystroke at a time), but visual updates are instant for everyone. Like Google Docs for desktops.
Yes — fully. The Computer Use API provides complete programmatic mouse and keyboard control over HTTP. AI agents can: 1) Capture screenshots via GET /screenshot to see desktop state, 2) Move and click the mouse at exact coordinates, 3) Type text and press key combinations, 4) Manage windows (focus, resize, move, close), 5) Chain compound actions via POST /api/v1/display/input/batch for complex multi-step workflows. This is one of Hoody’s most powerful capabilities — see Computer Use API below.
With ?reconnect=true (default), the client automatically reconnects when your connection returns. The desktop keeps running on the server—you just lost the view temporarily. When reconnected, you see current state (not what it was when you disconnected).
Yes! The HTML5 client adapts to touch input automatically. Tap = click, pinch = zoom, two-finger scroll = scroll. Virtual keyboard available via ?keyboard=true. Full desktop control from touch-only devices.
Extensively. Control: floating menu style, window decorations, toolbar visibility, dark mode. All via URL parameters. Build your perfect visual environment.
See: UI Theming →
Depends on encoding and activity. H264 video: 2-5 Mbps for smooth graphics. JPEG static updates: 100-500 Kbps. Configure via: ?encoding=jpeg&quality=60&bandwidth_limit=1000000 to cap at 1 Mbps.
Absolutely! Use iframes to embed container displays directly. Common patterns: dashboards showing live server states, documentation with interactive examples, customer portals with diagnostic desktops.
Keep in mind that this isn’t our priority for now, but we promise total smoothness with Displays, soon. As of now, typically 50-200ms depending on distance to server and network quality. H264 encoding optimized for smooth interaction. Good enough for coding, document editing, web browsing—not recommended for gaming or high-frequency trading.
Check container is running:
curl "https://api.hoody.icu/api/v1/containers/{container_id}?runtime=true" \ -H "Authorization: Bearer $HOODY_TOKEN"Verify runtime_info.displays shows active display with PID.
Common causes:
Container stopped - Start it:
curl -X POST "https://api.hoody.icu/api/v1/containers/{container_id}/start" \ -H "Authorization: Bearer $HOODY_TOKEN"Display service not started - Wait 30-60 seconds after container start for services to initialize
Wrong display number - Check container’s runtime_info.displays for available display IDs
Enable reconnect:
?reconnect=trueReduce quality for stability:
?quality=50&encoding=jpeg&video=falseCheck network:
For macOS users:
?swap_keys=true&keyboard_layout=usFor other layouts:
?keyboard_layout=gb # UK?keyboard_layout=de # German?keyboard_layout=fr # FrenchEnable virtual keyboard on touch devices:
?keyboard=trueEnable clipboard if disabled:
?clipboard=trueCheck browser permissions:
Some browsers restrict clipboard for security. Copy/paste within the remote desktop always works.
Optimize encoding:
# Fast connection?encoding=h264&quality=90
# Slow connection?encoding=jpeg&quality=40&video=falseReduce bandwidth:
?bandwidth_limit=500000 # 500 Kbps maxDisable high-bandwidth features:
?sound=false&video=falseCheck server load:
# Query system resourcesGET /api/v1/system/resourcesCheck URL parameter:
?readonly=false # Enable controlVerify permissions:
Use session sharing:
?sharing=true&steal=falseWithout this:
sharing=false allows only one usersteal=true (default) lets new users kick old ones outFor collaboration, enable sharing.
Explore other visual services:
Browser
Chrome automation as REST API—control browsers programmatically, scrape data, run tests.
Terminals
Execute shell commands via HTTP—your terminal as an API, accessible everywhere.
Code
VS Code instances via HTTP—spawn IDEs on-demand, share coding sessions.
Master display configuration:
Your desktop is a URL.
Access from any device.
Share instantly.
Embed everywhere.
This is how desktops work in the HTTP era.