use.computer

Windows & Ubuntu (Beta)

Windows 11 and Ubuntu Desktop VM sandboxes with mouse, keyboard, screenshot, in-guest shell, and VNC.

Ubuntu is live; Windows is coming soon. Ubuntu sandboxes are available on customer keys today, metered against your credit. Windows is still in admin-only beta. Drop your email below and we'll let you know the moment Windows opens.

Overview

Full Windows 11 and Ubuntu Desktop sandboxes that start in a few seconds (restored from a memory snapshot, like the macOS sandboxes) and are driven by the same use.computer SDK and API. The two platforms share an almost identical surface; choose with type="windows" or type="ubuntu".

Windows 11Ubuntu Desktop
Bootseconds (snapshot restore)seconds (snapshot restore)
Default shellPowerShellbash
Default browserChrome (no sign-in prompts)Firefox + Chromium
PreinstalledNode, npm, Postgres, ffmpeg, Git, VS Code, LibreOffice, GIMP, VLCNode, npm, Postgres, ffmpeg, Git, VS Code, GIMP, VLC
Permissionsruns as Administrator (UAC/Defender/firewall/update nags disabled)runs as a sudoer (no prompts)
Accessibility treeWindows UIAutomation via ui_tree()AT-SPI tree via ui_tree()
accessibility.* (axe schema)not availablenot available
Mouse / keyboard / screenshot / recording / file up-downloadidentical to macOSidentical to macOS

How they differ from macOS

  • No SSH. Commands run in-guest through the sandbox agent (sandbox.run(...) / sandbox.shell) instead of over SSH. PowerShell or cmd on Windows, bash on Ubuntu.
  • Accessibility. ui_tree() returns the native UIAutomation tree on Windows and the AT-SPI tree on Ubuntu. The macOS axe-schema .accessibility is not available on either.
  • Mouse / keyboard / screenshot / recording / file upload-download are identical to macOS.

Quickstart (Python SDK)

from use_computer import Computer

# Windows
with Computer().create(type="windows") as win:
    print(win.run("$env:COMPUTERNAME").stdout)      # PowerShell by default
    win.run("Start-Process notepad")
    win.keyboard.type("hello from use.computer")
    open("win.png", "wb").write(win.screenshot.take_full_screen())

# Ubuntu
with Computer().create(type="ubuntu") as ubu:
    print(ubu.run("hostname").stdout)               # bash
    ubu.run("gnome-terminal &")
    ubu.keyboard.type("hello from use.computer")
    open("ubu.png", "wb").write(ubu.screenshot.take_full_screen())

AsyncWindowsSandbox and AsyncUbuntuSandbox mirror the same surface with await.

Seeding: typed steps

setup() is a typed seeding step that works the same on Windows and Ubuntu. It applies in order: host redirects → files → script → open_urls → open_apps.

from use_computer import Computer, HostRedirect

# Same call shape; only `script` and paths differ between platforms.
with Computer().create(type="windows") as win:
    win.upload("gmail.tar.gz", r"C:\gmail.tar.gz")
    win.setup(
        script=r"tar -xf C:/gmail.tar.gz -C C:\ProgramData\clones; "
               r"powershell -File C:\ProgramData\clones\gmail\setup.ps1",
        hosts=[HostRedirect("mail.google.com", ip="127.0.0.3", port=8090)],
        open_urls=["http://mail.google.com"],
    )

with Computer().create(type="ubuntu") as ubu:
    ubu.upload("gmail.tar.gz", "/home/user/gmail.tar.gz")
    ubu.setup(
        script="tar -xf /home/user/gmail.tar.gz -C /opt/clones && "
               "bash /opt/clones/gmail/setup.sh",
        hosts=[HostRedirect("mail.google.com", ip="127.0.0.3", port=8090)],
        open_urls=["http://mail.google.com"],
    )

HostRedirect(host, ip="127.0.0.1", port=None) writes the /etc/hosts entry (host → ip). With a port, it also forwards :80 and :443 → 127.0.0.1:port (netsh portproxy on Windows, iptables nat on Ubuntu) and flushes DNS, so a browser hitting http(s)://mail.google.com lands on a local server. To map several domains at once, give each a distinct loopback IP (127.0.0.2, 127.0.0.3, …). open_urls opens them in the default browser; open_apps launches apps by name/path. script is the escape hatch for anything else (PowerShell on Windows, bash on Ubuntu); files drops base64 content first.

Verifiers

A verifier is just a script you upload, run, and read back: write a reward to a file and download it.

# Windows: verifier.ps1
$reward = if (Test-Path C:\app\output.csv) { 1 } else { 0 }
New-Item -ItemType Directory -Force C:\reward | Out-Null
"$reward" | Out-File C:\reward\reward.txt -Encoding ASCII -NoNewline
# Ubuntu: verifier.sh
[ -f /home/user/app/output.csv ] && echo 1 > /tmp/reward.txt || echo 0 > /tmp/reward.txt
# Windows
win.upload("verifier.ps1", r"C:\verifier.ps1")
win.run(r"powershell -ExecutionPolicy Bypass -File C:\verifier.ps1")
reward = win.run("Get-Content C:\\reward\\reward.txt").stdout.strip()

# Ubuntu
ubu.upload("verifier.sh", "/tmp/verifier.sh")
ubu.run("bash /tmp/verifier.sh")
reward = ubu.run("cat /tmp/reward.txt").stdout.strip()

VNC

Both platforms' create() returns a vnc_url: a public, no-auth noVNC viewer you can open in a browser to watch (and drive) the desktop live.

Evals (runner)

Windows and Ubuntu tasks run through the runner with platform="windows" or platform="ubuntu" and a platform-native agent; pre_command and graders are authored in PowerShell / bash respectively. See the runner.

On this page