Seat Computer is a Linux desktop for one granted seat. Setup is the flag, a Docker engine, and the image porto/computer:v1. Default: Docker on the same machine as the API. Optional: the same image on a VPS, so the desktop keeps running with the laptop shut. This page is setup. After the host is up, grant Computer on a seat: Seat Computer.
Set PORTO_COMPUTER=1 in backend/.env for both the API and the runner. Restart both. Unset the flag, or take Docker down, and chat still works. The next Computer tool is a typed refuse.

Desktop app (beta)

The Computer panel shows Computer is off. This is correct for a new install. Computer runs the agent’s desktop in a Docker container. The app does not include this container. Download it one time. Each step has a check. Before you start: install Docker Desktop. Start it.
1

Download the desktop image

This file is the Linux desktop that the agent uses. It includes Chromium and a terminal. It is large; the download takes some minutes.
Check: ls -lh /tmp/porto-computer.tar.gz shows a size near 400 MB.
2

Load it into Docker

Check: docker images porto/computer:v1 shows one row, near 1.7 GB.
3

Set the flag

The app reads its settings from ~/.porto/desktop.env. The app made this file at first launch. Add one line:
Check: tail -1 ~/.porto/desktop.env shows PORTO_COMPUTER=1.
4

Restart Porto

In the menu bar, select Stack → Stop Porto. When the window says Porto is stopped, select Stack → Start Porto.Check: the Computer panel does not show “off”. Give the Computer grant to a seat (how). The panel shows the live desktop.
If a check fails, read the Computer panel. It shows the missing item and the correction.

Local Docker

This is the default.
1

Run Docker on the API machine

Docker Desktop or Docker Engine. The API process must see docker on PATH.
2

Build the desktop image

That file is build-only. It is not a running porto service.The image is Debian 13 + XFCE (bottom panel: Chromium, Thunar, Terminal). Rebuild in place as porto/computer:v1. Existing seats keep the previous image until Stop then a new start, or Remove.
3

Turn the flag on

In backend/.env:
Leave PORTO_COMPUTER_HOST unset (or set local_docker). Restart the API and the runner.
4

Check

You want "ok": true, "host": "local_docker", "live_view": "loopback", and "image": { "present": true }.
GET /computerz is public, like /browserz. Start, stop, and live view need the same owner bind as chat. Do not run the API inside Compose if you want Computer. The native API talks to host Docker. See Docker Compose.

VPS

Same desktop. Different engine. Occupancy, grants, screenshots, and the human floor stay. Live view is screenshots, not a loopback iframe.
Interactive remote watch is not in this release. You see screenshots in chat and in the Computer panel. Take over still hands you the floor.

What you need

  • A VPS with Docker Engine running
  • SSH (or TLS Docker TCP) from the API machine to that engine
  • The image porto/computer:v1 on the VPS engine
  • The docker CLI on the API machine
The API still runs where porto already runs. It drives the VPS with the Docker CLI (DOCKER_HOST). It never puts docker.sock in the Computer container.

1. Reach the engine

From the user that runs the API and runner, this must work with no password prompt:
Load the SSH key in that user’s agent, or use a key with no passphrase. A prompt at start means Computer fails as vps_not_reachable. Chat still works. Do not expose an unauthenticated Docker TCP port.

2. Put the image on the VPS

Build on the VPS, or load an image you already built:

3. Point porto at it

In backend/.env (API and runner):
PORTO_COMPUTER_HOST also accepts remote or cloud. Both mean VPS. Occupancy stays on the API machine (PORTO_COMPUTER_DATA_DIR, default ~/.porto/computer). Use the same path in API and runner. Restart the API and the runner.

4. Check

You want "ok": true, "host": "vps", "live_view": "screenshots", and "image": { "present": true }.

What a VPS desktop does not get

Put files the seat needs on Drive, or fetch them from the desktop itself.

Switch back to this machine

Unset PORTO_COMPUTER_HOST (or set local_docker). Unset PORTO_COMPUTER_DOCKER_HOST. Restart the API and the runner. Local Docker is the default.

Fail reasons

Env vars: Environment. HTTP: GET /computerz.