The desktop is exe's control panel. It is a page in your browser, drawn as a Mac OS 9 desk: this machine's virtual machines (VMs), agent sessions, apps and published sites are its icons and windows. It opens on a computer and on a phone.
For you:
A coding agent, such as Claude Code or Codex, does not need the desktop. It drives the same exe over HTTP, the command line and SSH, and Help → Agent Skill Guide… gives you a prompt that teaches it how. Four things an agent or a script does that way show on the desk:
POST /v1/newsfeed with a title and a body puts a note in the Newsfeed of this machine and of every machine joined to it: finished work, or a problem you should see.POST /v1/push).POST /v1/notices).GET /v1/ui/menu and PUT /v1/ui/menu read and replace the right-click menu. An agent changes it only when you ask.The menu bar runs along the top and works like the classic Mac it resembles. The small Mac at its left end is the Apple menu.
| Menu | Item | What it does |
|---|---|---|
| Apple | About This Computer | Shows the machine, its memory and disk, and each running VM. |
| Apple | Software Update… | Moves an installed exe to the newest release. See Updating. |
| Apple | Reload for Update | Reloads the desktop into a new build. It is there only while unsaved work holds that reload back. |
| Apple | The name of an open window | Brings that window to the front. |
| File | New VM… | Makes a VM. See Virtual machines. |
| File | Upload to Workspace… | Puts a file from this device, 100 MB at most, in the Workspace. |
| File | Close Window | Closes the window in front. |
| File | Refresh | Loads the lists of VMs and apps again. |
| Windows | Virtual Machines | The list of VMs. |
| Windows | My Apps | Every address you have published, an icon each. |
| Windows | Chat | The Chat window. It is in the menu once Chat has a model to work with. |
| Windows | Newsfeed | Events from this machine and the machines joined to it. |
| Windows | Icon Editor | Repaints the desktop's icons. |
| Windows | Configuration | Edits exe's settings. See Configuration. |
| Windows | Log Viewer | The daemon's log and the log of requests to the API. |
| Special | Mac OS 9 | Opens a Mac running Mac OS 9. See Mac OS 9. |
| Special | Mac OS X | Opens a Mac running Mac OS X 10.4 Tiger. See Mac OS X. |
| Special | Mac OS X Intel | Opens an Intel Mac running Mac OS X 10.4.11, on Linux on x86-64 only. See Mac OS X Intel. |
| Special | Node Sync… | Pairs this exe with another one. See Joining desks together. |
| Special | Join a Hub… | Joins a hub, a step at a time. See The Hub. |
| Special | Cloudflare Status… | The tunnel's state and its live counters. |
| Special | Cloudflare Setup Wizard… | Sets up the tunnel and the domain. See Publishing to the web. |
| Special | Set API Token… | Asks for the API token this browser sends to exe. |
| Help | Welcome… | exe in six cards. |
| Help | exe Documentation… | This manual. |
| Help | Agent Skill Guide… | A prompt that hands exe to a coding agent. |
Under a rule, the Apple menu lists every open window by name, with a check mark beside the one in front. On a phone, where one window fills the screen, that list is how you go from one open window to another.
A diamond beside the small Mac, and beside Software Update… in its menu, says a newer release is waiting.
At the right end of the bar:
Double-click an icon to open it. A single click selects it.
A link can open an app on the desktop. Put #show=app: and the app's name after the desktop's address:
http://127.0.0.1:7777/#show=app:Ping
The app's window opens, or comes to the front if it is already open. A desktop that is already open does the same when its address changes, so a bookmark or a link from another page works whether the desktop is open or not.
hub, or the folder name of an app you installed, such as Ping. Write a space as %20: World%20Clock. The desktop menu names apps the same way; see Arguments, paths and app names.Windows behave like OS 9 windows. The close box is at the left end of the title bar; the zoom box and the shade box, where a window has them, are at the right end.
| To | Do this |
|---|---|
| Move a window | Drag its title bar. |
| Resize it | Drag its left, right or bottom edge, or the grow box in its bottom-right corner. Not every window can be resized. |
| Collapse it to its title bar | Click the shade box, or double-click the title bar. The same again brings it back. |
| Switch between two sizes | Click the zoom box. A window of one size, such as Welcome, goes back to that size. |
| Close it | Click the close box. File → Close Window closes the window in front. |
| Bring it to the front | Click it, or choose its name in the Apple menu. |
The whole layout is saved on the daemon: positions, stacking, which windows are open. It is mirrored live to every browser looking at this desk, so dragging a window here moves it on your other screens too. A phone shows one window at a time and keeps its own.
Terminal, Claude Code and Codex windows are mirrored the same way. One you open here opens on your other screens, and its close box closes it on all of them. A terminal window keeps the same columns and rows on every screen, so a program in it looks the same on each, even where the font is wider.
Right-click a window's title bar (on a touch screen, press and hold it) and choose Save a Screenshot. A PNG of that window alone lands in the Workspace's Screenshots folder, named for the window and the time: ready for a post or a bug report, and where an agent can read it.
Right-click an empty part of the desktop (on a touch screen, press and hold it) for the desktop menu: a NeXT-style menu at the pointer, with shortcuts to VMs, apps, windows and tools. Choose Customize… to edit it.
The format, every supported action and examples are in the chapter Desktop context menu.
The button with the bare desk on it slides every open window off to the nearest edge of the screen, a sliver of each left showing, so the desktop and its icons are clear to use.
The desktop menu reaches it as showdesk. A phone has no such button.
The button left of the magnifier shrinks every open window into a grid, so you see them all at once.
The desktop menu reaches it as showall. A phone has no such button.
The magnifier opens one box that finds VMs, chat sessions, notes and todos.
Help → Welcome… is exe in six cards: Virtual Machines, Chat, Claude Code and Codex, The Hub, Cloudflare and Apps.
On a new install the window opens with the desktop each time, until you clear Show this window when the desktop opens. That box belongs to this machine, not to the browser. An exe that was installed before the window existed opens it from the menu only.
Help → exe Documentation… opens this manual in a window of the desktop. It opens on its contents and shows a chapter at a time.
To find something, type in the field over the page, Search the manual:
Help → Agent Skill Guide… is for handing exe to a coding agent. Its window gives the address of the skill file, which teaches an agent to create VMs, run commands inside them over SSH and publish their ports, and a prompt to paste into the agent. Copy Prompt copies it. When this browser holds an API token, the prompt includes it and the window says so.
Apple menu → About This Computer is the OS 9 box, about the machine exe runs on.
| Line | What it says |
|---|---|
| Version | The build of exe. |
| System, Machine | The operating system, the processor architecture and the number of CPUs; the machine's model and its name. |
| Addresses | Its addresses on the local network and on Tailscale. Click one to copy it. |
| Built-in Memory | The machine's memory. |
| VM Memory | How much of it is allotted to running VMs. |
| Disk Space | The space free on the disk where VM disks live. |
| Largest Unused Block | The memory the host could still hand a new VM. |
Below the rule, one memory bar per running VM shows its allotment, scaled so the largest fills the column. exe's own footprint is the first row. The window refreshes every few seconds while it is open.
The Control Strip in the bottom-left corner is OS 9's tray: a row of small modules, each with a live figure about this machine. Click a module for its menu.
| Module | Its tile shows | It is there |
|---|---|---|
| Cloudflare | A lamp for the tunnel and, on a computer, the bytes a second going out. | Always. |
| Tailscale | A panel of lamps for the tailnet. | On a machine with Tailscale installed. |
| Solana ticker | A token's coin and its dollar price. | Always. |
| Agent usage meter | The tokens Claude Code or Codex used today, or how full its plan's usage window is. | Once Claude Code or Codex is installed. |
| Activity | A chart of CPU, memory, GPU, network or disk, and its figure now. | On Linux. |
The tab at the right end hides the strip down to the tab alone; click it again to bring the strip back. The arrows at its two ends scroll the row a module at a time when it holds more than it shows. This browser remembers whether the strip is hidden and what you chose for each tile.
The lamp on the cloud is green while the tunnel is healthy, yellow when it needs attention or is not set up yet, and grey while it is still checking.
On a computer, the figure beside the lamp is how many bytes a second this machine's connector is sending out: its answers, what visitors download. A phone's tile is the lamp alone.
The menu shows:
How to read the figures:
On a machine with Tailscale installed, the module is a panel of nine lamps.
| Lamps | What they say |
|---|---|
| Tailscale's four are lit | The tailnet is connected. |
| The four are blue | The machine's traffic leaves through an exit node. |
| The four are yellow | Something needs attention: a health warning, a login due. |
| All are dim | Tailscale is off. |
The menu's first lines say which machine this is and how many devices are online. Under them:
| Item | What it does |
|---|---|
| Tailscale Active, Tailscale Inactive | Turn Tailscale on and off. |
| Log In… | Stands in place of that pair when Tailscale needs a login, and opens the login link. |
| Desktop over HTTPS | Serves this desktop at https://<this machine's name>/ on the tailnet, through Tailscale Serve, and stops again. Only the tailnet's devices reach it, and over HTTPS the desktop installs as an app. While it is on, the line under it is the address. |
| Copy Desktop Address | Copies the desktop's address on the tailnet: the HTTPS one while it is on, else the daemon's own port where it listens on the tailnet. |
| Exit Node | Picks one of the devices that offer one, or None. Allow LAN Access is in the same submenu. |
| Devices | Lists the devices that are online. Pick a row to copy its address. |
| Serve | Lists the Tailscale Serve rules. Pick a row to copy its address. |
| Accept Routes, Use Tailscale DNS, Shields Up, Tailscale SSH | Switch each setting on or off. Rest the pointer on one for what it does. |
| Admin Console… | Opens Tailscale's admin console. |
| Check Now | Asks Tailscale again. |
The rows from Desktop over HTTPS to Tailscale SSH are there while Tailscale is connected.
Desktop over HTTPS changes only its own Serve rule, the one for the address's root. It stays greyed, with the reason on the line under it, in two cases:
The first visit after it is turned on can wait several seconds while Tailscale fetches the certificate; exe asks the address once itself, so that wait is usually over by the time you open it.
Four changes ask first, because the desktop could go with them: turning Tailscale off or raising the shields while the desktop is itself reached through Tailscale, turning Desktop over HTTPS off from a window that came in through that address, and choosing an exit node while you reach the desktop over the local network with Allow LAN Access off.
The daemon asks the tailscale CLI on the machine and changes only those settings and that one Serve rule (GET /v1/tailscale, POST /v1/tailscale/set). It runs as Tailscale's operator user, so it needs no sudo. If it is not the operator, the menu says so and gives the command that makes it one: sudo tailscale set --operator=<user>, run once at the machine.
The tile shows a token's coin and its dollar price: SOL, PUMP, MET or SKR. Pick the one the tile wears from its menu.
The menu lists all four with their day change, and PUMP, MET and SKR with their price in SOL as well. Its first line names the source of the prices and their time, and Update Now fetches them again.
A long run of zeros after the point folds into a small sunk count, so PUMP's 0.00003717 SOL reads 0.0₄3717 SOL, MET's 0.002404 SOL reads 0.0₂2404 SOL, and the column lines up. A price in SOL folds from two zeros, a dollar price from three.
The figures are Coinbase's public spot prices, fetched once a minute by the daemon and shared by every desktop open on this machine. Jupiter's prices stand in for a token Coinbase cannot quote, or when Coinbase does not answer; the menu's first line then names Jupiter. A Jupiter API key from portal.jup.ag goes in jupiter.api_key of ~/.exe/config.json.
The same menu turns notifications on. Notifications: turn them on, further down, says how. Open Solana… opens the Solana app on the token the tile wears: its chart (the chapter Solana). A line of Recent Moves opens the app on that move.
The agent usage meter shows how many tokens Claude Code or Codex has used on this machine today. From its menu:
46% wk). Show Tokens Today puts the tokens back.The menu lists both agents with today's tokens and their five-hour and weekly windows. The windows stand in columns, so one agent's week is under the other's; a window an agent lacks stays blank.
Each agent's submenu has the detail:
The daemon counts from the CLIs' own logs, Claude Code's transcripts and Codex's rollouts, so every session on the machine is in, not only the ones opened from this desktop (GET /v1/agents/usage). Claude Code's usage windows are as fresh as its last reply in a Claude Code window here. Codex's are read live on the ChatGPT sign-in.
An agent has its row once it is installed and has left figures. One that is installed and has left none is named with the words installed, no usage on record. With neither agent installed, the tile stays away.
The activity module, at the end of the strip, charts this machine: CPU, memory, GPU, network and disk, a sample every two seconds.
23%, or 1.2 MB/s for network and disk, both directions added. Its icon says which: a chip for CPU, a memory stick, a graphics card, a network port, a hard disk.| Row | Its words |
|---|---|
| CPU | Its share of all cores, and its hottest sensor's temperature. |
| Memory | Memory in use: the total less what the kernel says is available. |
| GPU | Its use, temperature and power, from nvidia-smi. A host with more than one card has a row for each, GPU 1, GPU 2 and on, in nvidia-smi's order. A host without nvidia-smi has no GPU row. |
| Network | Bytes a second in and out over the physical network interfaces. |
| Disk | Bytes a second read and written on the physical disks. |
Percentages fill their chart at 100%. Rates fill it at their busiest moment in view, with two-way rates stacked. Counting only physical interfaces and disks counts every byte once: a VM's traffic crosses its tap, the bridge and the NIC.
The daemon samples only while a desktop reads (GET /v1/host/monitor). The figures start when the strip opens and stop ten minutes after the last desktop folds it away or goes hidden, and the daemon keeps the last ten minutes. It reads Linux so far; on another system the tile stays away.
exe can send push notifications to this device: a browser on a computer, or, on a phone, the desktop added to the Home Screen (Install the desktop as an app, further down).
The menu item again turns them off. That one switch covers everything in the four sections that follow: none of them has a setting of its own.
On iPhone and iPad Home Screen apps (iOS 18.4 or later), and Safari on Mac (18.5 or later), notifications include a browser-readable fallback. An agent-finished alert, for example, can still appear and open its session if the desktop's background worker cannot run. Open the desktop once after updating so it can refresh the subscription's address. Other browsers keep receiving the same notifications through the background worker. Permission, connectivity and the device's notification settings still apply.
You hear when SOL, PUMP, MET or SKR makes a move that is rare for it, within an hour or within a day:
| Token | In an hour | In a day |
|---|---|---|
| SOL | 2.5% | 6% |
| PUMP | 5% | 12% |
| MET | 6% | 15% |
| SKR | 8% | 25% |
There are never more than four per token in 24 hours. A move that qualifies while the four are spent is counted into the next one. Each move is also a notice on the desktop, with the time of the move, which stays until you close it; a newer move of the same token takes its place. Recent Moves in the ticker's menu lists the last eight. Click the words of a notice, and the Solana app opens on that move: the chart, the move ringed.
With notifications on, the daemon also watches the sky over the first city in the Weather app, the row your drag put on top. Reorder the Weather list and the watcher follows.
| Push | When it comes |
|---|---|
| Rain possible soon, or Rain likely when the chance is high | Open-Meteo's quarter-hour forecast puts rain in the next 60 minutes. |
| Next hour looks dry | A fresh forecast clears the rain. |
| Dangerous heat | A feels-like temperature of 105°F. |
| High wind | Gusts of 35 mph. |
| Fire weather | Humidity at or under 15% meets those gusts. |
The heat, wind and fire lines are the National Weather Service's own. A fire-weather hour is a red-flag hour, and it keeps the plain wind push quiet, so a Santa Ana taps once.
Each push names the city, and each hazard clears with its own easing push. There are at most four warnings per hazard in 24 hours. They speak °F and mph for a US city, °C and km/h elsewhere.
The same switch tells you when an agent is done.
| Push | When it comes |
|---|---|
| Claude Code finished or Codex finished, with the session's title | A turn ends in a session of a Claude Code or Codex window. |
| Chat finished, with the chat's title | A Chat run ends on its own. A VM's Agent tab starts one too. |
| Chat stopped, with the error that ended it | A Chat run ends in an error. |
For a chat pinned to a VM the push says Chat with and the VM's name. Tap the notification and the desktop opens that window on that session or chat, whether it was already open or has to be loaded first.
Some turns stay quiet:
claude run in a shell of your own carries none of the desktop's hooks.One notification stands per session: a later turn's replaces the earlier one.
A script on the exe machine can send its own words the same way:
$ curl -s 127.0.0.1:7777/v1/push -d '{"title":"Backup","body":"Done."}'
It reaches every browser that turned notifications on. A title and a body are both needed.
tag makes a later push with the same tag replace the earlier one.url (a path, such as /) is what a tap opens. /#show=app:Ping opens the Ping app (Open an app from a link).Only callers on the machine itself are accepted; the same request over Tailscale is refused.
A notice is a toast that waits for you. It shows above the Control Strip on every desk and phone that has exe open, and it stays there, through reloads and restarts, until you press its close box on any one of them. Stacked notices share the same small gap as the space above the Control Strip. The collapse box at its lower left folds it to a thin strip on that screen; it opens again when its words change. Claude's hub watcher puts one up when Claude's login expires or a usage limit stops its turns: it holds the posts it was given and posts nothing in their threads. A big price move of the Solana ticker's tokens puts one up too.
A script on the exe machine puts one up like this:
$ curl -s 127.0.0.1:7777/v1/notices -d '{"id":"backup","title":"Backup failed","body":"The disk is full."}'
id (lower-case letters, digits and dashes) makes a later notice with the same id change the one that is up, instead of adding another.at (Unix time in milliseconds) puts the time of what the notice tells of before its body, in each reader's own clock.GET /v1/notices lists the ones that are up, and DELETE /v1/notices/<id> closes one, as its close box does.Only callers on the machine itself can put one up. At most eight stay up at once; a ninth takes the place of the oldest.
On a phone the desktop becomes a home screen of icons, and windows go fullscreen, one at a time. They cannot be moved or resized there.
Over HTTPS (a Tailscale Serve address, say) the desktop installs as an app:
It then opens in a window of its own, with the menu bar right under the status bar.
Running exe on more than one computer? Give each its own icon, so you can tell them apart on the Home Screen and in the browser's tabs:
The browser tab shows the new icon at once. A phone keeps the icon a desktop had when it was added, so remove the desktop from the Home Screen and add it again.
When the daemon is not answering, because it is restarting or the device is offline, the desktop shows an alert in place of the browser's error page and comes back by itself once the daemon does.
An app can keep a copy of what it shows on the device, to be read meanwhile; Notes and Projects do. The alert names the apps that have one and has a button for each: Open and the app's name. The app opens in a new tab, beside the alert, or in the alert's place when exe is installed as an app, which has no tabs. It shows what the daemon last had, says how old its copy is, and dims whatever would change something until the daemon answers again. The copy is renewed each time the desktop is opened and each time a notification arrives, so it is as old as the last time the device heard from the daemon.
Updates arrive by themselves. When the daemon restarts with a new desktop or new system apps, an open desktop notices and reloads: a few seconds after the daemon is back, and at once in a tab you are not looking at. A restart that changes nothing the browser runs leaves your windows alone.
Returning to the installed app on an iPhone or iPad checks for a new desktop and refreshes the app list, even when the phone resumes an old page. If the connection is still waking up, it tries again while open. There is no need to force-close the app to pick up an update.
The reload waits:
Blue Pencil saves its drafts as you type, so its text never holds an update. While unsaved work holds the reload back, the Apple menu shows Reload for Update to take the update anyway.
This is the open desktop catching up with a daemon that has restarted. Moving exe itself to a newer release is Software Update…; see Updating.
Every system icon is hand-plotted pixel art, and Windows → Icon Editor lets you repaint it.
The gallery lists each one: the VM Mac, folders, documents, the Trash, built-in apps such as Mac OS 9, the minis in search results, even the Apple menu. Double-click one to open it in a fat-bits editor.
New Icon… adds icons of your own on a 32×32 or 16×16 grid: draw them, copy their SVG for use anywhere, delete them when done. System icons can only be repainted, never deleted.
An editor left open is restored with the rest of the layout, in its position, stacking and shaded state.