Skip to main content
Every cloud session on one screen, grouped by whether Devin is working, needs you, or done. A Next.js app: the server holds one connection to Devin, the browser watches the board move. Each card is one session — its title, where it was started and on which repos, the one thing you have to do (when there is one), what Devin is doing right now, the last thing it said, and its pull requests. Clicking a card opens the session in the Devin web app.
Session board: three columns of session cards labelled needs you, working and done, each card showing the session title, repos, current activity and pull requests

The board: needs you, working and done columns

How it works

  • One createDevin() connection, on the server, shared by every tab. listSessionsPage() seeds a card per session from the _meta each entry carries (statusEnum, userActionRequired, pendingRequest, currentActivity, sessionRepos, sessionPRs, …), so the board is right before any live update arrives.
  • devin.attach(id) joins each session and session.events() yields every update for it as typed events, from turns started in the web app, Slack, or another script alike. A status event moves the card and names the ask; activity and tool_call say what Devin is doing; message_delta keeps the last thing Devin said; pull_request marks a PR as changed until the next scan refreshes it; a permission_request tool call turns into “Approve …” until it is answered.
  • Every 30 s listSessionsPage({ updatedAfter }) runs again to attach to sessions created or updated since, following pagination to the end, and repairs any transition the board missed while disconnected. Live session events need no polling.
  • Observers leave onPermission unset: an observer’s answer to a permission request is a real decision, and the client driving the session should keep it.
  • /api/board/stream sends the current board as a snapshot, then a card per change. EventSource reconnects on its own and every connection starts with a fresh snapshot, so the browser keeps no bookkeeping.
Attached sessions are cheap: one WebSocket and a few megabytes for hundreds of them; idle sessions send nothing. The board stays attached after the last tab closes, so a tab that opens later gets a current snapshot at once.

Run

Start a turn in one of the listed sessions from the web app and watch its card move.

Deploy

One long-running process — the WebSocket to Devin lives in it — so it wants a host that keeps a container up (a VM, ECS, Fly, Railway), not serverless. The Dockerfile builds it:
This is a single-user demo: there is no login, and anyone who can reach the board sees every session DEVIN_API_KEY can see. Run it on your own machine, or put it behind your own auth or network before sharing a URL.

Watching sessions

attach(), events() and the status metadata the board is built on.