tobi/wrapvm
DevOps & Self-hostingA containerized XFCE desktop with shared Chrome and agent tools, bootable as a smolvm machine or Docker container.
What it does
wrapvm packages a full desktop environment for AI agents into a single container image. It is built on wrap's desktop image and adds Xvfb on display :1 with XFCE, a persistent Google Chrome instance exposed over CDP on port 9222, and two agent CLIs: agent-browser for browser automation and agent-desktop for computer use through AT-SPI. The browser is also wired as the default system browser, with its sandbox left on, and sound is routed through PulseAudio into a null sink for streaming and ffmpeg recording.
The image is published by CI as ghcr.io/tobi/wrapvm:desktop, and a Smolfile boots it as a smolvm machine. This is aimed at people who want a disposable, inspectable desktop where agents can click, type and browse rather than at general-purpose remote desktop users.
Quick start
The repository ships two entry paths. For a smolvm machine bound to the current directory, run:
./wrapvm
This creates the machine, opens a zsh shell inside it, and prints the browser viewer sign-in link. Alternatively, run the published image as a container with the viewer port bound locally:
docker run -d -p 127.0.0.1:6080:6080 ghcr.io/tobi/wrapvm:desktop
docker exec <id> wrap-desktop url
The desktop is then reachable in a browser on port 6080 via voxl; the printed URL includes the password. The wrapvm script also reads WRAPVM_DESKTOP_PORT to use a different host port when creating the machine.
Agent configuration
Every environment sets AGENT_BROWSER_CONFIG=/home/user/workspace/agent-browser.json. If that file does not exist, wrap-desktop start and each login shell write {"headed": true, "autoConnect": true} to it; an existing file is never overwritten. This replaces the normal ~/.agent-browser/config.json. The desktop and browser skills under ~/.agents/skills point agents at the two CLI guides.
Development and constraints
Building and testing locally uses make test, which runs a podman build and the desktop test suite; CONTAINER_ENGINE=docker selects Docker instead. To boot a local build, use make image.tar && WRAPVM_IMAGE=$PWD/wrapvm.tar ./wrapvm. The Containerfile is based on wrap's desktop configuration at commit c562a7d with wrapvm-specific blocks marked wrapvm:, and Dockerfile is a symlink for docker build .. No license is declared in the repository, so reuse and redistribution terms are unclear.
HotRepo's take
wrapvm entered HotRepo's new-project list on 2026-11-10 with 33 stars gained in a window of roughly 1.5 hours; it has not appeared on the all-language daily rank. The project is young (created 2026-11-04) and the repository's primary language is Dockerfile. Its value comes from combining a desktop image, a persistent Chrome CDP endpoint and two agent-facing CLIs into one bootable unit, but the README does not document the publisher identity or the CI pipeline linking the published image to the committed source, so the image's provenance is worth checking before running it.
Written by AI from the project's README, updated . The project's own docs are the source of truth.