A granted seat can get its own Linux desktop on this laptop. It clicks, types, and takes screenshots. You solve CAPTCHAs. This is not Browser control. It is not granted by *. First proof is an Anthropic API (Claude) seat — not Navi, not a CLI harness.
Computer is off unless you set PORTO_COMPUTER=1 and Docker Desktop is running on the same machine as the API. Quit Docker and chat still works. The next Computer tool is a typed refuse.

Before you start

  1. Docker Desktop is running on the API machine.
  2. The desktop image exists: porto/computer:v1.
  3. PORTO_COMPUTER=1 is in backend/.env (API and runner both source this file).
  4. You restarted the API after setting the flag.
Check:
You want "ok": true and "image": { "present": true }. If the report says image_missing:
That file is build-only. It is not a running porto service. Then restart the API. GET /computerz is public, like /browserz. Start / stop / live view require the same owner bind as chat.

1. Add the operator seat

1

Open Add agent

In the room, click + Add agent.
2

Pick Claude — bare Anthropic API

Not Claude Code. Not Grok CLI. Connect Anthropic in Settings first.
3

Pick a role that is not Navi

Engineer is fine. Computer is never on by default. The preview lists Use a Computer under what this seat cannot do.
A * engineer still does not get Computer.

2. Turn Computer on

  1. Click the seat name. Open Tools.
  2. Find the caution row Computer.
  3. Flip the switch on.
  4. Wait for the next turn. The grant applies then.
The Tools tab is one Computer column, not ten computer_* names. Navi has no Computer column.

3. Ask it to use the desktop

Mention the seat in chat. Example:
Open computer/fixtures/form_captcha.html on the Computer. Fill name and email from the resume at the project root. When the mock “I am not a robot” box appears, request a human.
What happens:
  • Porto starts one Docker desktop for that seat.
  • The agent opens Chromium on that desktop.
  • Each click or type writes a JPEG under artifacts/computer/{agent_id}/shots/.
  • Those shots show in chat. Do not read_file them.
The live desktop is a center cover, same shape as Graph: ?view=computer&seat={agent_id}. While the agent has the floor, the view is watch-only. Take over gives you the floor. The lock is server-side (x11vnc -viewonly). The iframe query string is display only. The desktop only mounts the project vault and the code root (/host/project, /host/code). Put the resume in the project.

4. When it needs you

The agent hands you the floor. The turn ends. You see:
  • A Computer needs you card in chat
  • Inbox computer hold
  • Cover chip Your turn
Then:
  1. Open live view from the card, or ?view=computer&seat=….
  2. Click the box / finish the login in the live view.
  3. Press I’m finished.
The seat wakes at once with a fresh screenshot. It does not poll. Cancel ends the hold without saying you finished. Keep the cover focused while you work. Live view is laptop-only (127.0.0.1). A remote browser still gets screenshots.

5. Stop or wipe

You can also tell the agent: “stop the Computer” or “wipe the Computer”.

If Computer is off

Quit Docker and porto chat still works.

Rules that will not bend

  • One Computer per granted seat.
  • * does not grant Computer. The token must be computer.
  • You solve your own CAPTCHA. porto will not bypass it.
  • Occupancy lives at ~/.porto/computer/, not in the project tree.
  • The Computer container never gets docker.sock.
  • First proof is Anthropic API (Claude). OpenAI gets a path plus markdown, not a vision block. CLI seats stay text.