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 11 | Ubuntu Desktop | |
|---|---|---|
| Boot | seconds (snapshot restore) | seconds (snapshot restore) |
| Default shell | PowerShell | bash |
| Default browser | Chrome (no sign-in prompts) | Firefox + Chromium |
| Preinstalled | Node, npm, Postgres, ffmpeg, Git, VS Code, LibreOffice, GIMP, VLC | Node, npm, Postgres, ffmpeg, Git, VS Code, GIMP, VLC |
| Permissions | runs as Administrator (UAC/Defender/firewall/update nags disabled) | runs as a sudoer (no prompts) |
| Accessibility tree | Windows UIAutomation via ui_tree() | AT-SPI tree via ui_tree() |
accessibility.* (axe schema) | not available | not available |
| Mouse / keyboard / screenshot / recording / file up-download | identical to macOS | identical 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.accessibilityis 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.