Four people, one agent in the middle. The host runs it on their machine with their own key, and everyone else joins from a terminal or a browser.
The client is one full-screen binary. The conversation is on the left, the room on the right. Every tool call is one line you can open, and anything that waits for the host shows up as a card.
Plural is event-sourced. Every prompt, tool call and decision is appended to one log, so a teammate who joins late, reconnects or audits afterwards sees exactly what happened and who did it.
| seq | time | actor | event | what it means |
|---|---|---|---|---|
| 0001 | 12:00:02 | vlad | participant.joined | The host opens the room in their project. The first line is an invite. |
| 0002 | 12:00:40 | alia | participant.joined | A teammate joins from her terminal with the invite. |
| 0003 | 12:01:05 | alia | prompt.accepted | "the login test fails on ci". In open mode it goes straight to the agent, with her name on it. |
| 0004 | 12:01:05 | host | run.started | The run carries a guest prompt, so every write and command in it will ask the host. |
| 0005 | 12:01:07 | agent | tool.started | read tests/test_login.py. Reads run without asking. |
| 0006 | 12:01:09 | agent | approval.requested | edit src/auth/login.py. A card appears for vlad: allow once, for the session, reject or block. |
| 0007 | 12:01:21 | vlad | approval.resolved | Allowed once. The decision is in the log with his name. |
| 0008 | 12:01:22 | agent | tool.ended | +2 −2. Everyone sees the numbered diff. |
| 0009 | 12:01:30 | bek | participant.joined | Late, but he gets a snapshot and the replay, so he sees the whole session. |
| 0010 | 12:01:41 | agent | run.ended | Done. Bek's queued prompt starts the next run. |
macOS and Linux, arm64 and x64, Windows through WSL. Without a key the host runs a scripted demo agent.
curl -fsSL https://raw.githubusercontent.com/Plural-Organization/Plural/main/install.sh | shcd your-project && pluralyou hostplural join "ws://…"a teammate joins