Source:
session-board
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_metaeach entry carries (statusEnum,userActionRequired,pendingRequest,currentActivity,sessionRepos,sessionPRs, …), so the board is right before any live update arrives. devin.attach(id)joins each session andsession.events()yields every update for it as typed events, from turns started in the web app, Slack, or another script alike. Astatusevent moves the card and names the ask;activityandtool_callsay what Devin is doing;message_deltakeeps the last thing Devin said;pull_requestmarks a PR as changed until the next scan refreshes it; apermission_requesttool 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
onPermissionunset: an observer’s answer to a permission request is a real decision, and the client driving the session should keep it. /api/board/streamsends the current board as asnapshot, then acardper change.EventSourcereconnects on its own and every connection starts with a fresh snapshot, so the browser keeps no bookkeeping.
Run
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. TheDockerfile builds it:
Watching sessions
attach(), events() and the status metadata the board is built on.
