---
title: "A Linux desktop in your browser"
description: "Run a Linux desktop with Google Chrome on an exe.dev VM, open it from any browser tab, and code on it with Claude Code, Codex, and other agents."
url: https://exe-staging.dev/deploy/linux-desktop
category: "Developer tools"
updated: 2026-10-30
---

# A Linux desktop in your browser

Xfce, Chrome, and coding agents on a VM you open in a browser tab.

- **Software:** Linux desktop (https://kasm.com/kasmvnc)
- **Source:** https://github.com/kasmtech/KasmVNC
- **License:** KasmVNC GPL-2.0, Xfce GPL-2.0; Chrome and the coding agents under their own terms
- **Time:** 5 minutes
- **Example VM name:** `my-linux-desktop` (yours will differ; on the VM, `hostname` prints it)
- **Machine-readable:** https://exe-staging.dev/deploy/linux-desktop/manifest.json
- **File:** https://exe-staging.dev/deploy/linux-desktop/setup.sh

## What you get

- An Xfce desktop with Google Chrome at `https://<vm>.exe.xyz:8444/`, behind exe.dev login, sized to your browser window
- The desktop running all the time, so windows stay open when you close the tab, and back on its own after a reboot
- Launchers on the desktop for Claude Code, Codex, OpenCode and Pi, starting in `~/code`
- Claude Code and Codex connected to exe.dev's LLM integration, with no API key on the VM

Running on the VM:

- **Xfce desktop**: Ubuntu 24.04's Xfce, on KasmVNC's X server, display :1, data in `~/Desktop`
- **KasmVNC 1.5**: streams the desktop to a browser tab, through exe.dev's HTTPS proxy, port 8444
- **Google Chrome**: the desktop's default browser, data in `~/.config/google-chrome`
- **Coding agents**: Claude Code, Codex, OpenCode and Pi, through exe.dev's LLM integration, data in `~/code`

How it is reached:

- https://my-linux-desktop.exe.xyz:8444/ (private): the desktop, for you and people you share the VM with
- ssh my-linux-desktop.exe.xyz (private): a terminal on the same machine, and file copies with scp

## Deploy with Shelley

Open https://exe-staging.dev/new?prompt=Set%20up%20Linux%20desktop%20on%20this%20VM%20by%20following%20the%20exe.dev%20recipe%20at%20https%3A%2F%2Fexe-staging.dev%2Fdeploy%2Flinux-desktop.md%20from%20top%20to%20bottom.%0A%0AThe%20recipe%27s%20example%20VM%20name%20is%20my-linux-desktop.%20This%20VM%27s%20name%20is%20the%20output%20of%20%60hostname%60%3A%20use%20it%20wherever%20the%20recipe%20writes%20my-linux-desktop.%20Skip%20the%20step%20that%20creates%20the%20VM%3B%20you%20are%20on%20it.%0A%0AYou%20are%20done%20when%20all%20of%20these%20are%20true.%20Check%20each%20one%20yourself%3A%0A-%20An%20Xfce%20desktop%20with%20Google%20Chrome%20at%20%60https%3A%2F%2F%3Cvm%3E.exe.xyz%3A8444%2F%60%2C%20behind%20exe.dev%20login%2C%20sized%20to%20your%20browser%20window%0A-%20The%20desktop%20running%20all%20the%20time%2C%20so%20windows%20stay%20open%20when%20you%20close%20the%20tab%2C%20and%20back%20on%20its%20own%20after%20a%20reboot%0A-%20Launchers%20on%20the%20desktop%20for%20Claude%20Code%2C%20Codex%2C%20OpenCode%20and%20Pi%2C%20starting%20in%20%60~%2Fcode%60%0A-%20Claude%20Code%20and%20Codex%20connected%20to%20exe.dev%27s%20LLM%20integration%2C%20with%20no%20API%20key%20on%20the%20VM%0A%0ARun%20%22Set%20up%20by%20hand%22%20from%20%22On%20the%20VM%22%20%28skip%20creating%20the%20VM%29%2C%20then%0Acheck%20it%20with%20the%20commands%20at%20the%20end%20of%20that%20section.%20Don%27t%20open%0AChrome%20or%20the%20coding%20agents%20on%20the%20desktop%3A%20their%20first-run%20screens%0A%28Chrome%27s%20terms%2C%20Claude%20Code%27s%20theme%20and%20folder%20trust%29%20are%20the%20owner%27s%0Ato%20answer.%20If%20Claude%20Code%20or%20Codex%20settings%20already%20exist%2C%20leave%20them%0Aalone.%20Never%20make%20the%20VM%20public%20or%20point%20port%208000%20at%20the%20desktop%3A%20it%0Ahas%20no%20password%20of%20its%20own.%20Finish%20with%20the%20desktop%27s%20URL%2C%20using%20this%0AVM%27s%20name%2C%20and%20what%20to%20try%20first%20from%20%22Open%20your%20desktop%22.%0A%0AFinish%20with%20the%20URLs%20I%20should%20open.%0A to create a VM whose agent, Shelley, follows this recipe. From a terminal:

```sh
curl -fsSL https://exe-staging.dev/deploy/linux-desktop/prompt.txt | ssh exe.dev new --prompt=/dev/stdin
```

Or follow the steps below by hand.

Sometimes you want a whole computer, not a terminal: a browser that stays
signed in, windows you leave open overnight, a GUI app, or an agent's work
you want to look at. This recipe turns an exe.dev VM into that computer.
It's an Xfce desktop with Google Chrome, running all the time, that you
open in a browser tab from any computer. Close the tab and everything
keeps running; open it again tomorrow, from somewhere else, and your
windows are where you left them.

The coding agents that come with every exe.dev VM are on the desktop too:
Claude Code, Codex, OpenCode and Pi, each a double-click away, connected
to models through exe.dev's [LLM integration](/docs/integrations-llm) with
no API key to paste. They can open what they build in the desktop's
Chrome, where you see it. The desktop streams through
[KasmVNC](https://github.com/kasmtech/KasmVNC), which resizes it to your
window and syncs the clipboard, behind exe.dev's login.

## Open your desktop

Open `https://my-linux-desktop.exe.xyz:8444/` and sign in to exe.dev if
asked. The desktop fills the tab, with Chrome, a home folder, and a
launcher per coding agent down the left. A panel opens on the left edge
the first time; the small tab on the edge opens and closes it again.

<figure>
<img src="https://exe-staging.dev/deploy/linux-desktop/desktop.webp" alt="The Xfce desktop in a browser tab: on the left a terminal where Claude Code has written a clock page, on the right Google Chrome showing that page" width="1440" height="900" loading="lazy">
<figcaption>Claude Code (left) wrote a page and opened it in the desktop's Chrome (right), all in one browser tab.</figcaption>
</figure>

Double-click **Google Chrome**. The first time, Chrome asks you to accept
Google's terms and whether to sign in; signing in to Chrome syncs your
bookmarks and passwords to this VM, which you may or may not want. What
you do in it stays on the VM: the profile, its cookies and signed-in
sites live in `~/.config/google-chrome`, and downloads go to
`~/Downloads`.

The side panel has what a browser tab can't do on its own:

- **Clipboard**: in Chrome or Edge on your computer, copy and paste
  between your computer and the desktop work as usual (allow clipboard
  access when your browser asks). In other browsers, paste into the box
  here to send text to the desktop.
- **Fullscreen**: the desktop takes the whole screen.
- **Keys**: Ctrl, Alt, Esc and the Windows key as buttons, and an
  on-screen keyboard on phones and tablets.
- **Settings**: on a Mac, turn on *Translate keyboard shortcuts* so
  Cmd+C and Cmd+V become Ctrl+C and Ctrl+V on the desktop.

The desktop follows the size of your tab. Resize the window and it
resizes too.

> [!WARNING]
> The desktop has no password of its own; exe.dev login is the lock.
> Never point the VM's main port at it (`share port`) or make the VM
> public, or anyone could use it, terminal and `sudo` included.

## Code with an agent

Double-click **Claude Code**. A terminal opens in `~/code` and starts
Claude Code, already connected to Claude through the LLM integration. The
first time, it asks for a color theme and whether you trust the folder.
Then give it something it can show you:

```text
Make ~/code/clock.html, a page with a big live clock, then open it in Google Chrome.
```

Claude writes the page and runs `google-chrome`, and a Chrome window
opens on the desktop with the clock. Agents in a terminal here can open
anything they make, a web app on `localhost:3000`, an image, a PDF, and
you look at it the way you would on your own computer.

The other launchers work the same way:

| Launcher | Runs | Connected through |
| --- | --- | --- |
| **Claude Code** | `claude` | the LLM integration (`exeuntu configure claude`) |
| **Codex** | `codex` | the LLM integration (`exeuntu configure codex`) |
| **OpenCode** | `opencode` | OpenCode's own free models; the [OpenCode recipe](/deploy/opencode) connects it to the LLM integration |
| **Pi** | `pi` | the LLM integration, through its exe.dev extension |

When an agent exits, its terminal stays open at a shell. They are the same
programs you reach over SSH (`ssh my-linux-desktop.exe.xyz`), with the same
settings and files, so you can start work in one and look in on it from the
other. To use your own Claude or ChatGPT subscription instead of the LLM
integration, see the [Claude Code](/deploy/claude-code) and
[Codex](/deploy/codex) recipes.

## Share it

To work on the desktop with someone else, share the VM with them, on your
computer:

```bash
ssh exe.dev share add my-linux-desktop teammate@example.com
```

They sign in to exe.dev and open the same address. You both see the same
screen, and you can both move the mouse and type. Remove them with
`ssh exe.dev share remove my-linux-desktop teammate@example.com`.

## Move files

The desktop is the VM, so its files are the VM's files: `~/Desktop`,
`~/Downloads`, and `~/code` are in `/home/exedev`. Copy them with `scp`,
on your computer:

```bash
scp my-linux-desktop.exe.xyz:Downloads/report.pdf .        # from the desktop
scp notes.txt my-linux-desktop.exe.xyz:Desktop/             # to the desktop
```

A file copied to `~/Desktop` shows up on the desktop straight away. For
text, copy and paste is quicker.

## The nuts and bolts

Deploy sets all this up. The commands are here to do it by hand, and for
later.

<details id="create-the-vm" data-manual-setup class="dp-details">
<summary>Set up by hand</summary>

On your computer, create a VM and connect. Pick any free name; if you've
already clicked Deploy or have a VM, skip the first command and use its
name:

```bash
ssh exe.dev new --name=my-linux-desktop
ssh my-linux-desktop.exe.xyz
```

On the VM, read [setup.sh](https://exe-staging.dev/deploy/linux-desktop/setup.sh),
then run it:

```bash
curl -fsSL https://exe-staging.dev/deploy/linux-desktop/setup.sh | bash
```

It takes about two minutes. It installs Xfce from Ubuntu,
[KasmVNC](https://github.com/kasmtech/KasmVNC/releases) 1.5.2 from its
GitHub release, and Google Chrome from Google (which adds Google's apt
repository, so Chrome updates with the rest of the system). Then it:

- writes KasmVNC's settings to `~/.vnc/kasmvnc.yaml`: plain HTTP on port
  8444, since exe.dev's proxy adds HTTPS, and a desktop that resizes to
  your window;
- writes `~/.vnc/xstartup`, which starts Xfce;
- adds `exedev` to the `ssl-cert` group and makes a KasmVNC user with a
  random password: KasmVNC insists on both, even though the desktop
  serves plain HTTP and the service turns KasmVNC's own login off;
- makes Chrome the default browser and puts launchers for the coding
  agents on the desktop and in the menu (**Applications → Development**);
- runs `exeuntu configure claude` and `exeuntu configure codex`, which
  connect Claude Code and Codex to the LLM integration;
- writes the `desktop` systemd service, which runs
  `vncserver :1 -fg -autokill -DisableBasicAuth` as `exedev`, starts at
  boot, and starts a fresh desktop two seconds after the old one ends,
  if you log out of Xfce, say.

It ends with `active`, `HTTP/1.1 200 OK`, and the desktop's address. To
check it again later:

```bash
systemctl is-active desktop
curl -s -o /dev/null -w '%{http_code}\n' localhost:8444/
```

`active` and `200` mean it's up. Running the script again is safe; it
restarts the desktop, which closes its windows.

</details>

<details id="back-up-and-restore" class="dp-details">
<summary>Back up and restore</summary>

Everything worth keeping is in `/home/exedev`: your files, Chrome's
profile with its signed-in sessions, and the agents' settings. The
simplest backup is a copy of the whole VM, on your computer:

```bash
ssh exe.dev cp my-linux-desktop my-linux-desktop-backup
```

The copy is a working desktop of its own, at
`https://my-linux-desktop-backup.exe.xyz:8444/`. To keep a backup off
exe.dev, archive your files and Chrome's profile on the VM, with Chrome
closed:

```bash
tar -C ~ -czf ~/desktop-backup.tgz Desktop Documents Downloads code .config/google-chrome
```

and copy it to your computer with
`scp my-linux-desktop.exe.xyz:desktop-backup.tgz .`. Leave out folders
you don't have. The archive holds your browser's cookies, so keep it
somewhere private. To restore, set up a new desktop, copy the archive
back, close Chrome there, and unpack it with
`tar -C ~ -xzf ~/desktop-backup.tgz`.

</details>

<details id="update" class="dp-details">
<summary>Update</summary>

On the VM, Xfce and Chrome update with the system:

```bash
sudo apt-get update && sudo apt-get upgrade -y
```

Restart Chrome after an update (close it and open it again). For a newer
KasmVNC, run the setup again with its version, from
[KasmVNC's releases](https://github.com/kasmtech/KasmVNC/releases):

```bash
curl -fsSL https://exe-staging.dev/deploy/linux-desktop/setup.sh | KASMVNC_VERSION=1.5.2 bash
```

The agents update with `exeuntu update claude` (or `codex`, `opencode`,
`pi`).

</details>

<details id="troubleshooting" class="dp-details">
<summary>Something not working?</summary>

- **The tab says it can't connect, or exe.dev shows an error for port
  8444.** The desktop isn't running: `systemctl status desktop` on the
  VM, and `journalctl -u desktop -n 50` for why. KasmVNC's own log is in
  `~/.vnc/*.log`.
- **A grey or black screen with no panel.** Xfce stopped; restart the
  whole desktop with `sudo systemctl restart desktop`.
- **Everything is frozen.** Reload the tab. If it stays frozen, restart
  the desktop as above; it closes open windows, but files are safe.
- **Copy and paste doesn't reach the desktop.** Your browser blocked
  clipboard access: allow it in the site's settings (the icon left of
  the address), or use the side panel's **Clipboard** box.
- **A shortcut goes to your computer instead of the desktop.** Your
  browser or operating system keeps some keys for itself (Alt+Tab, Cmd+Q,
  Ctrl+W). Use the side panel's **Keys** for those.

</details>

## Frequently asked questions

### Who can use my desktop?

You, and people you share the VM with. Port 8444 goes through exe.dev's [HTTPS proxy](/docs/proxy), which asks for an exe.dev login, and ports other than the main one can never be made public. The desktop has no password of its own, so anyone you share the VM with can use it, and they get the VM's terminal and `sudo` with it.

### Does it keep running when I close the tab?

Yes. The desktop lives on the VM, not in your tab: close the tab, shut your laptop, open it from another computer, and the same windows are there. A long build or an agent working in a terminal on the desktop carries on while you're away.

### Which browsers work?

Chrome, Edge, and other Chromium browsers work best: copy and paste between your computer and the desktop just works. Firefox works too, with copy and paste through the clipboard box in the side panel. KasmVNC doesn't officially support Safari. Phones and tablets work, with an on-screen keyboard from the side panel's **Keys**.

### Is there sound?

No. KasmVNC streams the picture and takes your mouse and keyboard; videos in the desktop's Chrome play silently.

### Can an AI agent use the desktop instead of me?

Yes, that's the [computer use](/deploy/computer-use) recipe: the same kind of desktop, with Chrome's DevTools port and Playwright MCP for coding agents and Claude's computer use tool for clicking through any app, while you watch. Here, the agents work in terminals and you drive the desktop.

### How do I set my time zone?

The VM runs on UTC. On the VM, run `sudo timedatectl set-timezone Europe/Berlin` (any name from `timedatectl list-timezones`), then `sudo systemctl restart desktop`, which closes the desktop's windows.

### How much memory does it need?

About 850 MB with Chrome open on a new tab and Claude Code running, and almost no CPU while the screen is still. Each Chrome tab adds what it would on your own computer. If you open many, give the VM more memory with a bigger plan.


## Related

- [A desktop and browser for your AI agent](https://exe-staging.dev/deploy/computer-use.md): A Linux desktop your agent drives and you can watch, from any browser.
- [VS Code in your browser, with code-server](https://exe-staging.dev/deploy/code-server.md): Your editor in a tab. Your projects right where you left them.
- [Run Claude Code on a remote server](https://exe-staging.dev/deploy/claude-code.md): A computer for Claude. A breather for your laptop.
- [Run Codex on a remote server](https://exe-staging.dev/deploy/codex.md): A computer for Codex. An early night for your laptop.
- [Use exe.dev as a remote Docker host](https://exe-staging.dev/deploy/docker-host.md): Keep the docker CLI. Send the builds, the containers, and the fan noise to a VM.
- [Dev, Test, Prod: Choose One, Two, or Three](https://exe-staging.dev/deploy/dev-test-prod.md): You can build, test, and deploy on exe.dev.
