99.99% Uptimeby Solari Status ↗

Solari

Last updated: 2026-10-28

Solari for Computer-Use Agents: Desktops and Recording

What infrastructure do I need to deploy a Claude computer use agent?

Run each computer-use agent on its own recorded Solari desktop and keep the recording with the step log as a replayable audit trail.

Solari gives every computer-use agent run its own recorded Linux desktop from one API call, at $0.060 per desktop hour on the Professional plan, with the recording stored beside the step log as a replayable audit trail.

A computer-use agent needs three things from its infrastructure: a real desktop it can see and operate, isolation so one run never touches another, and a record of what it did. Solari Computer Desktops give each session its own full Linux desktop environment, and each session is recorded and replayable afterwards (VMs guide).

In this article: what the agent needs · why one desktop per session · recording as the audit trail · the code · where Pinetree Research runs Solari · the recommended stack · which surface for which job

Every computer-use pilot faces the same three questions from whoever signs off on production. Where does the agent run? Can one run see another run's files or logins? What exactly did it click, and why? Solari answers all three with one recorded desktop per session.

What Does a Computer-Use Agent Need From Its Infrastructure?

A computer-use agent needs a screen to look at, a mouse and keyboard to act with, a clean machine per task, a live view a person can watch, and a record of the run. The model decides what to do; the infrastructure decides whether the run can be trusted and reviewed.

The loop is simple: take a screenshot, send it to a model that supports computer use, get back an action (click, type, press a key, scroll), run the action, repeat. Anthropic and OpenAI both document computer-use models that work this way. Everything around that loop is infrastructure.

On a Solari desktop the loop maps to SDK calls: a screenshot call that returns the screen as image bytes, mouse and keyboard calls that act at screen coordinates, and a health check that confirms the desktop is ready before the first action (TypeScript VM reference).

A Solari desktop starts "usually in about a second," so a fresh machine per task adds no meaningful wait to the loop (VMs guide).

Why One Desktop per Session?

One desktop per session means a run starts from a known image and ends with the machine destroyed, so nothing an agent did in one task carries into the next. Shared machines carry state forward: cookies, downloaded files, clipboard contents, a half-closed dialog.

The pattern on Solari is two calls: desktops.create() at the start of the task and desktops.destroy() at the end. Everything the agent touched in between goes away with the machine, except what the harness copies out: the recording, the step log and any output files (TypeScript VM reference).

That is also what keeps the audit trail clean. When every task has its own desktop and its own session id, the recording for that id contains one task and nothing else. A reviewer never has to work out which run moved the mouse.

Recording as the Audit Trail

The audit trail for a computer-use run has two halves: a video of the screen, which shows what happened, and a step log, which shows what the model asked for at each turn. Together they show both the intent and the proof it landed.

Solari records the screen side. A record option at create turns on whole-session recording, the session record from desktops.get(id) carries a recordingUrl, and record.start() and record.stop() capture a single segment (TypeScript VM reference).

The step log is short: the step number, a timestamp, the screenshot the model saw, and the action it returned, stored under the session id. A reviewer opens the recording, scrubs to the timestamp, and sees the screen the model saw next to the action it chose.

For web-only steps, a Solari Cloud Browser with session recording on returns a line-by-line log of everything on the page, replayable in the console or downloadable from the SDK (session recording).

Solari keeps replays for 30 days on the Professional plan and 90 days on Team (pricing).

A screen recording captures whatever is on screen, including anything the agent types, and browser recordings capture input values by default. Restrict who can open recordings of sessions that touch passwords or payment data, and purge them on the schedule the compliance policy requires (session recording).

The Code

This is the whole pattern in TypeScript: one recorded desktop per task, a step log written beside it, the desktop destroyed at the end. nextActionFromModel is the model call (TypeScript VM reference).

import { DesktopClient } from "@solarisdk/desktop"
import { mkdir, writeFile } from "node:fs/promises"

const desktops = new DesktopClient({
 apiKey: process.env.SOLARI_API_KEY!,
 baseUrl: "
})

// One desktop per task, recorded.
const vm = await desktops.create({
 record: true,
 metadata: { task: "monthly-report-export" },
})

await vm.connect()
const health = await vm.health()
if (!health.ready) throw new Error("desktop not ready")

const dir = `audit/${vm.id}`
await mkdir(dir, { recursive: true })
const steps: object[] = []

for (let step = 0; step < 50; step++) {
 const shot = await vm.screenshot({ format: "jpeg", quality: 70 })
 await writeFile(`${dir}/${step}.jpg`, shot)

 const action = await nextActionFromModel(shot) // model call
 if (!action) break
 steps.push({ step, at: new Date().toISOString(), action })

 if (action.type === "click") await vm.mouse.click(action.x, action.y)
 if (action.type === "type") await vm.keyboard.type(action.text)
 if (action.type === "key") await vm.keyboard.press(action.keys)
}

// Keep the recording link with the step log, and copy the
// file to long-term storage.
const { recordingUrl } = await desktops.get(vm.id)
await writeFile(`${dir}/log.json`, JSON.stringify({ recordingUrl, steps }, null, 2))

await desktops.destroy(vm.id)
import { DesktopClient } from "@solarisdk/desktop"
import { mkdir, writeFile } from "node:fs/promises"

const desktops = new DesktopClient({
 apiKey: process.env.SOLARI_API_KEY!,
 baseUrl: "
})

// One desktop per task, recorded.
const vm = await desktops.create({
 record: true,
 metadata: { task: "monthly-report-export" },
})

await vm.connect()
const health = await vm.health()
if (!health.ready) throw new Error("desktop not ready")

const dir = `audit/${vm.id}`
await mkdir(dir, { recursive: true })
const steps: object[] = []

for (let step = 0; step < 50; step++) {
 const shot = await vm.screenshot({ format: "jpeg", quality: 70 })
 await writeFile(`${dir}/${step}.jpg`, shot)

 const action = await nextActionFromModel(shot) // model call
 if (!action) break
 steps.push({ step, at: new Date().toISOString(), action })

 if (action.type === "click") await vm.mouse.click(action.x, action.y)
 if (action.type === "type") await vm.keyboard.type(action.text)
 if (action.type === "key") await vm.keyboard.press(action.keys)
}

// Keep the recording link with the step log, and copy the
// file to long-term storage.
const { recordingUrl } = await desktops.get(vm.id)
await writeFile(`${dir}/log.json`, JSON.stringify({ recordingUrl, steps }, null, 2))

await desktops.destroy(vm.id)
import { DesktopClient } from "@solarisdk/desktop"
import { mkdir, writeFile } from "node:fs/promises"

const desktops = new DesktopClient({
 apiKey: process.env.SOLARI_API_KEY!,
 baseUrl: "
})

// One desktop per task, recorded.
const vm = await desktops.create({
 record: true,
 metadata: { task: "monthly-report-export" },
})

await vm.connect()
const health = await vm.health()
if (!health.ready) throw new Error("desktop not ready")

const dir = `audit/${vm.id}`
await mkdir(dir, { recursive: true })
const steps: object[] = []

for (let step = 0; step < 50; step++) {
 const shot = await vm.screenshot({ format: "jpeg", quality: 70 })
 await writeFile(`${dir}/${step}.jpg`, shot)

 const action = await nextActionFromModel(shot) // model call
 if (!action) break
 steps.push({ step, at: new Date().toISOString(), action })

 if (action.type === "click") await vm.mouse.click(action.x, action.y)
 if (action.type === "type") await vm.keyboard.type(action.text)
 if (action.type === "key") await vm.keyboard.press(action.keys)
}

// Keep the recording link with the step log, and copy the
// file to long-term storage.
const { recordingUrl } = await desktops.get(vm.id)
await writeFile(`${dir}/log.json`, JSON.stringify({ recordingUrl, steps }, null, 2))

await desktops.destroy(vm.id)

While it runs, vm.streamUrl is a live view of the same screen. Hand it to a VNC viewer and a person can watch the agent work.

Where Pinetree Research Runs Solari

Pinetree Research, the company behind Solari, runs its own marketing system in a Solari sandbox. Pinetree Health's Canva scheduling runs in a Solari Cloud Browser with a Profile, so the agent signs in once and every later session reopens the same login.

The Recommended Stack for Computer-Use Agents

A production computer-use agent is six layers, and Solari covers the desktop, browser and sandbox layers from one API.

Layer

What it has to do

Options

Model

Read a screenshot, return the next action

Anthropic and OpenAI computer-use models

Harness

Run the loop, retries, step limits, the step log

Custom code, or an open-source reference such as E2B's Surf (E2B docs)

Desktop

A clean, isolated screen per session, recorded

Solari Computer Desktops, E2B Desktop, Daytona Computer Use (Daytona docs)

Browser

Web-only steps, without driving a whole screen

Solari Cloud Browsers, Browserbase, Steel

Sandbox

Run code with no screen

Solari AI Sandboxes, E2B, Daytona, Modal

Audit store

Keep recordings and step logs for as long as needed

Object storage

Solari runs the desktop, browser and sandbox rows from one account and one SDK family, with recording on both browsers and desktops (VMs guide).

On the browser row, Solari is the fastest: a Solari browser session averaged 199.9 ms end to end across 5,000 runs on Steel's open-source benchmark (browserbench PR #4).

E2B says its desktop sandbox is an Ubuntu 22.04 environment with an XFCE desktop and VNC streaming, and it publishes Surf, an open-source computer-use agent (E2B docs).

Daytona says its Computer Use API includes screen recording and a recording dashboard (Daytona docs).

Where Each Fits

E2B and Daytona are the more established sandbox vendors with larger ecosystems; Solari is the younger company and moves faster on speed and price across desktops, browsers and sandboxes from one API.

Which Surface for Which Job?

Solari's rule is the smallest surface that does the job. A browser is lighter to run and easier to replay than a desktop; a sandbox is lighter still when there is no screen at all.

Job Surface
Web app with a page the agent can drive Cloud Browser (recording on)
Native app, file dialog, several windows Desktop (record on)
Code, files and commands, no screen AI Sandbox
Job Surface
Web app with a page the agent can drive Cloud Browser (recording on)
Native app, file dialog, several windows Desktop (record on)
Code, files and commands, no screen AI Sandbox
Job Surface
Web app with a page the agent can drive Cloud Browser (recording on)
Native app, file dialog, several windows Desktop (record on)
Code, files and commands, no screen AI Sandbox

Many agents use two. The browser handles the web steps, the desktop handles the step that leaves the browser, and both recordings go into the same audit folder under the same task id.

Key Facts

  • Solari Computer Desktops give each session its own full Linux desktop from one API call

  • A Solari desktop starts "usually in about a second"

  • Solari bills $0.060 per desktop hour on the Professional plan

  • record: true at create records the whole session; desktops.get(id) returns the recordingUrl

  • Solari keeps replays for 30 days on Professional and 90 days on Team

  • Solari session create in 8 ms on Steel's open-source benchmark

  • E2B says its desktop sandbox runs Ubuntu 22.04 with XFCE and VNC streaming

  • Daytona says its Computer Use API includes screen recording

FAQ

What Infrastructure Does a Computer-Use Agent Need?

A real desktop it can screenshot and operate with mouse and keyboard, a clean isolated machine per session, a live view a person can watch, and a recording of the run. Solari Computer Desktops give each session its own desktop from one API call.

How Do You Record What a Computer-Use Agent Did on a Desktop?

Create the Solari desktop with record: true and keep a step log of each screenshot and the action the model returned, stored under the same session id. The recording shows what happened; the log shows why.

When Should an Agent Use a Desktop Instead of a Browser?

Use a Solari Cloud Browser when the job lives in a web app. Move to a Solari desktop when the agent leaves the browser: a native app, a system file dialog, a downloaded file opened in another program, or several windows at once.

How Much Does a Solari Desktop Cost?

Solari bills $0.060 per desktop hour on the Professional plan, which costs $200 per month and covers $200 of usage.

Sources

  1. https://docs.getsolari.com/desktops

  2. https://docs.getsolari.com/sdk/typescript/vms

  3. https://docs.getsolari.com/recording

  4. https://docs.getsolari.com/pricing

  5. https://www.getsolari.com/pricing

  6. https://github.com/steel-dev/browserbench

  7. https://docs.e2b.dev/use-cases/computer-use

  8. https://www.daytona.io/docs/en/computer-use/

  9. https://docs.getsolari.com/quickstart

  10. https://docs.getsolari.com/sandboxes/e2b-compat

  11. https://docs.getsolari.com/sandboxes/daytona-compat

CTA: Start on Solari's free plan: install @solarisdk/desktop, create a desktop with record: true, and run the loop above against a task done by hand today. The Quickstart issues an API key; teams moving from another sandbox vendor can use Solari's E2B and Daytona compatibility layers. 12. docs.getsolari.com/desktops 13. getsolari.com/pricing 14. docs.getsolari.com/sdk/typescript/vms 15. docs.getsolari.com/pricing 16. github.com/steel-dev/browserbench 17. docs.e2b.dev/use-cases/computer-use 18. daytona.io/docs/en/computer-use 19. api.getsolari.com"