Diagram types
Every diagram type sketch draws, as a picture, as text and as Mermaid source.
sketch draws 33 diagram types: every type that pele draws. This page shows 32 of them. It leaves out info, which only shows the version of pele.
Each diagram has three tabs:
- Picture is the SVG from
sketch.Render, drawn bysketch/rasterin the theme of this site. - Text is the drawing from
sketch/text, astuios mermaid --format textprints it in an 80-column terminal. It is real text: you can select it and copy it. - Source is the Mermaid source of both.
The tabs on this page work together. Select Text on one diagram, and every diagram shows its text drawing. The page keeps your choice.
The pictures, the text drawings and the sources come from the same build of sketch. A script makes them again when sketch changes. Nobody draws them by hand.
Read a text drawing
- Lines and arrows are grey, boxes are cyan, and notes are yellow. Titles are bold. The data series of a chart take blue, yellow, green, red, cyan and magenta.
- A terminal shows these 16 ANSI colours in its own palette. This page shows them in the palette of the site.
- A drawing wider than 80 columns says so under it. Scroll a drawing sideways when it does not fit the page.
Summary
| Type | Mermaid keyword | Goldens that match | Text drawing |
|---|---|---|---|
| Flowchart | flowchart | 114 of 114 | The layout of the SVG, mapped to cells |
| State | stateDiagram-v2 | 22 of 22 | The layout of the SVG, mapped to cells, with composite states as frames |
| Class | classDiagram | 38 of 38 | The layout of the SVG, mapped to cells, with the members in each box |
| Entity relationship | erDiagram | 25 of 25 | The layout of the SVG, mapped to cells, with the attributes in each box |
| Block | block | 30 of 30 | Drawn as a flowchart is |
| Architecture | architecture-beta | 6 of 6 | Drawn as a flowchart is |
| Requirement | requirementDiagram | 9 of 9 | Drawn as a flowchart is |
| C4 | C4Context | 6 of 6 | Drawn as a flowchart is |
| Use case | usecase-beta | 24 of 24 | Drawn as a flowchart is |
| Agent flow | agentflow-beta | 12 of 12 | Drawn as a flowchart is |
| Swimlane | swimlane-beta | 13 of 13 | A flowchart with its lanes as bands |
| Sequence | sequenceDiagram | 38 of 38 | The layout of the SVG, mapped to cells: lifelines run down, and messages run across |
| Gantt | gantt | 11 of 11 | Bars on a date axis |
| Timeline | timeline | 14 of 14 | It runs across, and runs down when it does not fit the columns |
| User journey | journey | 1 of 1 | It runs across, and runs down when it does not fit the columns |
| Git graph | gitGraph | 35 of 35 | It runs down, one row for each commit, with the oldest commit at the top |
| Event model | eventmodeling | 12 of 12 | Swimlanes in time order, or a list of frames when it is narrow |
| Pie | pie | 2 of 2 | One bar for each slice, with its percentage and value |
| XY chart | xychart | 8 of 8 | Bars and lines drawn with plot |
| Quadrant chart | quadrantChart | 3 of 3 | A box in four parts, with the points as dots |
| Sankey | sankey | 8 of 8 | Columns of boxes joined by lines |
| Radar | radar-beta | 3 of 3 | A table with one bar for each curve on each axis |
| Treemap | treemap-beta | 8 of 8 | Nested boxes, or an indented tree when the boxes are too small |
| Venn | venn-beta | 8 of 8 | A table of the sets and their overlaps |
| Packet | packet | 4 of 4 | Rows of bit fields |
| Mindmap | mindmap | 13 of 13 | A tree |
| Tree view | treeView-beta | 13 of 13 | Drawn as the tree command draws a folder |
| Ishikawa | ishikawa-beta | 1 of 1 | A spine with the causes as bones, or an indented tree when it is narrow |
| Kanban | kanban | 3 of 3 | Columns side by side, in more rows when they do not fit |
| Cynefin | cynefin-beta | 3 of 3 | A grid of the four domains |
| Wardley map | wardley-beta | 19 of 19 | A grid of visibility by evolution, or a table when it is narrow |
| Railroad | railroad-ebnf-beta | 14 of 14 | The tracks in cells, or the rules as EBNF text when they do not fit |
The goldens are the SVG files that pele drew from the 522 sources of its documentation corpus. sketch must write the same file, byte for byte. Fidelity and tests says how.
A Mermaid type that pele does not draw, such as zenuml, gives an error with the code unsupported-diagram.
Graphs
Boxes joined by lines. sketch works out the layout in layers, as pele does. sketch/text maps that layout to cells.
Flowchart
- Keyword:
flowchart,graphorflowchart-elk, with a direction such asTBorLR. - Goldens: 114 of 114 match pele.
- Text: The layout of the SVG, mapped to cells. When it does not fit, sketch asks for a narrower layout: a flowchart that runs across turns to run down, and columns that hold only gaps close up.
╭───────────────╮ │ Key press │ ╰───────────────╯ │ ▼ ╱──────────────╲ < Mode? > ╲──────────────╱ ┌─────────────────────────────┘ │ └───────────────────────────────┐ │ │ │ Terminal Prefix Window │ │ │ ┌─ Inside the pane ──────────┐ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────────────┐ │ │ │ │ │ Write to the PTY │ │ │ │ │ └──────────────────────┘ │ │ │ │ │ │ │ │ │ ▼ │ ▼ ▼ │ ┌───────────────┐ │ ╱─────────────────╲ ┌───────────────────┐ │ │ VT emulator │ │ < Leader key > │ Window action │ │ └───────────────┘ │ ╲─────────────────╱ └───────────────────┘ │ │ │ │ │ │ │ │ ▼ │ │ │ │ │ │ ╭───────────╮ │ │ │ │ │ │ │ Cell grid │ │ │ │ │ │ │ ╰───────────╯ ┌──┼───────────────┘ │ └───────────────────┐ │ │ ┃ │ │ │ │ │ └──────────────╋──────────┼──┘ │ │ │ ┃ │ │ │ │ ┃ c [ w │ ┃ │ │ │ │ ┃ ▼ ▼ ▼ │ ┃ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │ ┃ │ New pane │ │ Copy mode │ │ Workspace │ │ ┃ └─────────────┘ └──────────────┘ └──────────────┘ │ ┃ │ │ │ │ ┃ └────────────────────┴─────────┬─┐ ┌─┬────┴───────────┘ ┃ ▼ ▼ ▼ ▼ ┃ ┌──────────┐ ┃ │ Layout │ ┃ └──────────┘ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━┛ ▼ ▼ ╭───────╮ │ Frame │ ╰───────╯
93 columns, 49 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
flowchart TB
key([Key press]) --> mode{Mode?}
mode -->|Terminal| pty[/Write to the PTY/]
mode -->|Prefix| prefix{{Leader key}}
mode -->|Window| wm[[Window action]]
subgraph pane [Inside the pane]
pty --> vt[VT emulator]
vt --> grid[(Cell grid)]
end
prefix -->|c| new[New pane]
prefix -->|"["| copy[Copy mode]
prefix -->|w| ws[Workspace]
wm & new & copy & ws --> layout[Layout]
grid & layout ==> frame((Frame))
classDef input fill:#3b82f62e,stroke:#3b82f6,stroke-width:2px
classDef inner fill:#22c55e2e,stroke:#22c55e,stroke-width:2px
classDef action fill:#a855f72e,stroke:#a855f7,stroke-width:2px
classDef out fill:#f973162e,stroke:#f97316,stroke-width:2px
class key,mode input
class pty,vt,grid inner
class prefix,wm,new,copy,ws,layout action
class frame out
style pane fill:#22c55e0d,stroke:#22c55e,stroke-dasharray:6 4
linkStyle 13,14 stroke:#f97316,stroke-width:3pxState
- Keyword:
stateDiagram-v2orstateDiagram. - Goldens: 22 of 22 match pele.
- Text: The layout of the SVG, mapped to cells, with composite states as frames.
● │ ▼ ╭───────╮ │ Idle │ ╰───────╯ │ ▲ ┌───────────────────────────────────┘ └───────────────────────────────────────┐ │ │ task │ │ │ ▼ │ ┌─ Working ──────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ ● │ │ │ │ │ │ │ ▼ │ │ │ ╭────────────╮ │ │ │ │ Thinking │ │ │ │ ╰────────────╯ │ │ │ ┌────┘ ▲ │ │ │ │ └────┐ │ │ │ call a tool result │ │ │ └─────┐┌────┘ │ │ │ ▼│ │ │ │ ┌─ Tool ────────────────────────────────┴───────────────────────────────────┐ │ │ │ │ │ │ │ │ │ ╭────────────╮ ╭───────────╮ ╭───────────╮ │ │ │ │ │ ● ─────►│ Reading │──────►│ Editing │──────►│ Testing │─────► ◉ │ │ │ │ │ ╰────────────╯ ╰───────────╯ ╰───────────╯ │ │ │ │ └───────────────────────────────────────────────────────────────────────────┘ │ │ └────────────────────────────────────────┬─┬─────────────────────────────────────┘ │ │▲│▲ │ ┌────────────────────────────┬──┴┘└┴────────┬──────────────────────────────────────────────┐ │ │ │ │ │ │ plan has parts │ │ stop │ │ │ │ │ │ │ │ │ ▼ │ ▼ │ │ ╱╲ │ ━━━━━━━━━━━━━━━ │ reply ╲╱ retry ││ │ │ │││ │ ││ │ │ ┌─────────────────────────────────────┘│└────────────┐ │ ││ │ │ │ │ │ │ ││ │ │ needs input finished error │ ││ │ └┐ │ │ │ │ ┌──────────┘└──────────┐ │ ┌┼──────┘ │ │ │ ▼ ▼ │ ▼│ ▼ ▼ │ ╭───────────────╮ ╭───────────────╮ │ ╭───────────╮ ┌────────────────────┐ ╭─────────╮ ╭──────────╮ │ SubagentA │ │ SubagentB │ merge │ Waiting │┄┄┄┄┄┄│ Shows in the Inbox │ │ Done │ │ Failed │ ╰───────────────╯ ╰───────────────╯ │ ╰───────────╯ └────────────────────┘ ╰─────────╯ ╰──────────╯ │ │ │ │ └───────────────────┐┌┬┴────────────────┘ │ ▼▼│ │ ━━━━━━━━━━━━━━━ ▼ ◉
134 columns, 55 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
stateDiagram-v2
direction TB
state spread <<fork>>
state gather <<join>>
state check <<choice>>
[*] --> Idle
Idle --> Working: task
state Working {
[*] --> Thinking
Thinking --> Tool: call a tool
Tool --> Thinking: result
state Tool {
direction LR
[*] --> Reading
Reading --> Editing
Editing --> Testing
Testing --> [*]
}
}
Working --> spread: plan has parts
spread --> SubagentA
spread --> SubagentB
SubagentA --> gather
SubagentB --> gather
gather --> Working: merge
Working --> check: stop
check --> Waiting: needs input
check --> Done: finished
check --> Failed: error
Waiting --> Working: reply
Failed --> Idle: retry
Done --> [*]
note right of Waiting
Shows in the Inbox
end note
classDef busy fill:var(--pele-series-6),fill-opacity:0.18,stroke:var(--pele-series-6),stroke-width:2px
classDef wait fill:var(--pele-series-3),fill-opacity:0.18,stroke:var(--pele-series-3),stroke-width:2px
classDef good fill:var(--pele-series-4),fill-opacity:0.18,stroke:var(--pele-series-4),stroke-width:2px
classDef bad fill:var(--pele-series-1),fill-opacity:0.18,stroke:var(--pele-series-1),stroke-width:2px
classDef sub fill:var(--pele-series-7),fill-opacity:0.18,stroke:var(--pele-series-7),stroke-width:2px
class Thinking,Reading,Editing,Testing busy
class Waiting wait
class Done good
class Failed bad
class SubagentA,SubagentB subClass
- Keyword:
classDiagram. - Goldens: 38 of 38 match pele.
- Text: The layout of the SVG, mapped to cells, with the members in each box.
┌─────────────────────────┐ │ «interface» │ │ Agent │ ┌─────────────────────┐ ├─────────────────────────┤ │ One per machine. │ ├─────────────────────────┤ │ Panes live here. │ │ +State() : AgentState │ └─────────────────────┘ │ +Reply(text string) │ ┆ └─────────────────────────┘ ┆ ▲ 0..1 △△ ┆ ┆ │ ┆┆ └┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┐ ┆ │ ┆┆ ┆ ┆ ┌──────────────────────┘ ┆┆ reports ┆ │ ┆┆ ┆ ┆ │ ┆┆ ▼ ┌───────────────────────────────────┐ │ ┆┆ ┌─────────────────┐ │ «service» │ │ ┌┄┄┄┄┄┄┄┄┄┄┄┘└┄┄┄┄┄┄┄┄┄┐ │ «enumeration» │ │ Daemon │ │ ┆ ┆ │ AgentState │ ├───────────────────────────────────┤ │ ┌──────────────────┐ ┌──────────┐ ├─────────────────┤ │ -sessions map<string, Session> │ runs │ ClaudeCode │ │ Codex │ │ Working │ │ -hosts List<Host> │ │ └──────────────────┘ └──────────┘ │ Waiting │ ├───────────────────────────────────┤ │ │ Done │ │ +Attach(client Client) : error │ │ └─────────────────┘ │ +Upgrade(binary string) : error │ │ └───────────────────────────────────┘ │ ◆ 1 ◇ 1 │ │ │ │ ┌───────────────────────────────────┘ └─────────────┐ │ │ │ │ owns links to │ │ │ │ │ * │ │ ┌───────────────────────────────┐ │ * │ │ Session │ ┌────────────────┐ │ ├───────────────────────────────┤ │ Host │ │ │ +Name string │ ├────────────────┤ │ │ +Workspaces [9]Workspace │ │ +Name string │ │ ├───────────────────────────────┤ ├────────────────┤ │ │ +Panes() : List<Pane> │ │ +Link() : Link │ │ └───────────────────────────────┘ └────────────────┘ │ ◆ 1 │ │ └────────┐ │ │ holds │ │ │ ┌─────────────────────────────────────────────┘ │ │ │ 1 │ * ┌────────────────────────┐ │ Pane │ ├────────────────────────┤ │ +ID int │ │ +Title string │ │ -pty PTY │ ├────────────────────────┤ │ +Write(data []byte) │ │ +Snapshot() : Screen │ └────────────────────────┘
125 columns, 56 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
classDiagram
direction TB
class Daemon {
<<service>>
-sessions map~string, Session~
-hosts List~Host~
+Attach(client Client) error
+Upgrade(binary string) error
}
class Session {
+Name string
+Workspaces [9]Workspace
+Panes() List~Pane~
}
class Pane {
+ID int
+Title string
-pty PTY
+Write(data []byte)
+Snapshot() Screen
}
class Agent {
<<interface>>
+State() AgentState
+Reply(text string)
}
class ClaudeCode
class Codex
class AgentState {
<<enumeration>>
Working
Waiting
Done
}
class Host {
+Name string
+Link() Link$
}
Daemon "1" *-- "*" Session : owns
Daemon "1" o-- "*" Host : links to
Session "1" *-- "*" Pane : holds
Agent "0..1" <-- "1" Pane : runs
Agent <|.. ClaudeCode
Agent <|.. Codex
Agent ..> AgentState : reports
note for Daemon "One per machine.<br/>Panes live here."
classDef core fill:var(--pele-series-6),fill-opacity:0.18,stroke:var(--pele-series-6),stroke-width:2px
classDef agent fill:var(--pele-series-2),fill-opacity:0.18,stroke:var(--pele-series-2),stroke-width:2px
classDef data fill:var(--pele-series-4),fill-opacity:0.18,stroke:var(--pele-series-4),stroke-width:2px
cssClass "Daemon,Session,Pane" core
cssClass "Agent,ClaudeCode,Codex" agent
cssClass "AgentState,Host" dataEntity relationship
- Keyword:
erDiagram. - Goldens: 25 of 25 match pele.
- Text: The layout of the SVG, mapped to cells, with the attributes in each box.
┌──────────────────────┐ ┌────────────────────┐ ┌─────────────────────────────────────────────┐ │ HOST │ │ USER │ │ AGENT │ ├──────────────────────┤ ├────────────────────┤ ├─────────────────────────────────────────────┤ │ string name PK │ │ string login PK │ │ int pane FK │ │ string address UK │ │ string theme │ │ string harness claude or codex │ │ string version │ └────────────────────┘ │ string state working, waiting, done │ └──────────────────────┘ │ 1 │ 1 └─────────────────────────────────────────────┘ │ 1 │ │ │ 1 │ 0..1 │ 1 │ ┌───────┘ └──────┐ ┌──────────────┘ │ └───────────┐ │ │ │ │ │ │ │ │ │ │ ┌─┘ │ runs attaches to answers asks │ saves │ │ │ │ │ │ └┐ ┌────────────┘ └─────┐ ┌─┘ │ │ │ 0..* │ 0..* │ 0..* │ 0..* │ │ 0..* ┌────────────────────────┐ ┌───────────────────────┐ │ ┌─────────────────────┐ │ SESSION │ │ APPROVAL │ │ │ CHECKPOINT │ ├────────────────────────┤ ├───────────────────────┤ │ ├─────────────────────┤ │ string name PK │ │ int id PK │ runs in │ string id PK │ │ string host FK │ │ string command │ │ │ string commit │ │ datetime started │ │ bool allowed │ │ └─────────────────────┘ └────────────────────────┘ └───────────────────────┘ │ │ 1 │ │ │ holds │ │ │ └─────────────────────────┐ ┌───────────────────────────────────┘ │ 1..* │ 1 ┌──────────────────────┐ │ PANE │ ├──────────────────────┤ │ int id PK │ │ string cwd │ │ string program │ └──────────────────────┘
118 columns, 35 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
erDiagram
HOST ||--o{ SESSION : runs
USER ||--o{ SESSION : "attaches to"
SESSION ||--|{ PANE : holds
AGENT |o--|| PANE : "runs in"
AGENT ||--o{ APPROVAL : asks
USER ||--o{ APPROVAL : answers
AGENT ||--o{ CHECKPOINT : saves
HOST {
string name PK
string address UK
string version
}
SESSION {
string name PK
string host FK
datetime started
}
PANE {
int id PK
string cwd
string program
}
AGENT {
int pane FK
string harness "claude or codex"
string state "working, waiting, done"
}
APPROVAL {
int id PK
string command
bool allowed
}
CHECKPOINT {
string id PK
string commit
}
USER {
string login PK
string theme
}
classDef machine fill:#3b82f62e,stroke:#3b82f6
classDef live fill:#22c55e2e,stroke:#22c55e
classDef agent fill:#f973162e,stroke:#f97316
classDef person fill:#a855f72e,stroke:#a855f7
class HOST,SESSION machine
class PANE live
class USER person
class AGENT,APPROVAL,CHECKPOINT agentBlock
- Keyword:
blockorblock-beta. - Goldens: 30 of 30 match pele.
- Text: Drawn as a flowchart is. A block arrow shows an arrow character.
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ Terminal │ │ Web │ │ SSH │ │ Phone │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ ┌──────────────────────────────────────────────────────────┐ │ ↓ attach │ └──────────────────────────────────────────────────────────┘ ┌────────────────────────────────────────────────────────────┐ │ │ │ ╱───────────────────────────────────────────────────────╲ │ │ < Wire protocol > │ │ ╲───────────────────────────────────────────────────────╱ │ │ │ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │ │ │ Sessions │ │ Panes │ │ Agents │ │ │ └────────────────┘ └────────────────┘ └────────────────┘ │ └────────────────────────────────────────────────────────────┘ ╭───────────────────────────╮ ╭────────────╮ ╭────────────╮ │ VT and scrollback │ │ PTY │ │ Host links │ ╰───────────────────────────╯ ╰────────────╯ ╰────────────╯
62 columns, 22 rows, drawn for 80 columns.
block
columns 4
tui["Terminal"] web["Web"] ssh["SSH"] phone["Phone"]
attach<["attach"]>(down):4
block:daemon:4
columns 3
wire{{"Wire protocol"}}:3
sessions["Sessions"] panes["Panes"] agents["Agents"]
end
vt[("VT and scrollback")]:2 pty(["PTY"]) links(["Host links"])Architecture
- Keyword:
architecture-beta, orarchitecture. - Goldens: 6 of 6 match pele.
- Text: Drawn as a flowchart is. A service with no title shows the name of its icon.
┌─ Laptop ──────────────────────────────────────────┐ ┌─ Build server ─────────────────────────┐ │ │ │ │ │ │ │ ┌─────────┐ │ │ ┌──────────────────┐ ┌────────────────┐ │ │ │ Remote │ ┌──────────────┐ │ │ │ Terminal client │───────►│ tuios daemon │◄──┼───────┼──►│ daemon │──────►│ Build cache │ │ │ └──────────────────┘ └────────────────┘ │ │ └─────────┘ └──────────────┘ │ │ │ │ │ ▲ │ │ │ │ │ │ │ │ │ │ └────────┼───────────────────────────────┘ │ │ │ │ │ ▼ │ │ │ ┌────────────────┐ │ ┌───────┐ │ │ Session state │ │ │ Phone │ │ └────────────────┘ │ └───────┘ │ │ └───────────────────────────────────────────────────┘
104 columns, 16 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
architecture-beta
group laptop(server)[Laptop]
service client(internet)[Terminal client] in laptop
service daemon(server)[tuios daemon] in laptop
service state(disk)[Session state] in laptop
group build(cloud)[Build server]
service remote(server)[Remote daemon] in build
service cache(database)[Build cache] in build
service phone(internet)[Phone]
client:R --> L:daemon
daemon:B --> T:state
daemon:R <--> L:remote
remote:R --> L:cache
phone:T --> B:remoteRequirement
- Keyword:
requirementDiagram, orrequirement. - Goldens: 9 of 9 match pele.
- Text: Drawn as a flowchart is.
┌────────────────────┐ │ «Element» │ │ e2e │ │ Type: E2E test │ │ Doc Ref: e2e/tui │ └────────────────────┘ ┆ «verifies» ┆ ▼ ┌──────────────────────────────────────────────┐ ┌───────────────────────────┐ │ «Requirement» │ │ «Element» │ │ live_upgrade │ │ handoff │ │ ID: 1 │ │ Type: Go package │ │ Text: A new daemon binary takes over │ │ Doc Ref: internal/session │ │ without ending pane programs. │ └───────────────────────────┘ │ Risk: High │ ┆ │ Verification: Test │ ┆ └──────────────────────────────────────────────┘ ┆ ● ● ● ┆ │ │ │ ┆ ┌────────────────────────────────┘ │ └──────────────────────────────────────────────────────┐ ┆ │ │ │ «satisfies» «contains» «contains» «contains» ┆ │ │ │ └┄┄┄┄┐ ┌───────────────────┘ │ │ ▼ │ │ │ ┌──────────────────────────────────────────────────┐ ┌────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────────────┐ │ «Functional Requirement» │ │ «Performance Requirement» │ │ «Interface Requirement» │ │ keep_ptys │ │ short_gap │ │ same_wire │ │ ID: 1.1 │ │ ID: 1.2 │ │ ID: 1.3 │ │ Text: The old daemon hands every PTY to │ │ Text: Clients see a gap of less than 200 ms. │ │ Text: Old clients attach to the new daemon. │ │ the new one. │ │ Risk: Medium │ │ Risk: Low │ │ Risk: High │ │ Verification: Analysis │ │ Verification: Inspection │ │ Verification: Test │ └────────────────────────────────────────────────────┘ └───────────────────────────────────────────────────┘ └──────────────────────────────────────────────────┘
173 columns, 36 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
requirementDiagram
requirement live_upgrade {
id: 1
text: A new daemon binary takes over without ending pane programs.
risk: high
verifymethod: test
}
functionalRequirement keep_ptys {
id: 1.1
text: The old daemon hands every PTY to the new one.
risk: high
verifymethod: test
}
performanceRequirement short_gap {
id: 1.2
text: Clients see a gap of less than 200 ms.
risk: medium
verifymethod: analysis
}
interfaceRequirement same_wire {
id: 1.3
text: Old clients attach to the new daemon.
risk: low
verifymethod: inspection
}
element handoff {
type: "Go package"
docref: internal/session
}
element e2e {
type: "E2E test"
docref: e2e/tui
}
live_upgrade - contains -> keep_ptys
live_upgrade - contains -> short_gap
live_upgrade - contains -> same_wire
handoff - satisfies -> keep_ptys
e2e - verifies -> live_upgradeC4
- Keyword:
C4Context,C4Container,C4Component,C4DynamicorC4Deployment. - Goldens: 6 of 6 match pele.
- Text: Drawn as a flowchart is.
- Known difference: At some widths an edge label writes over a box border or a boundary title. The drawing at 80 columns is clean.
╭───────────────────────────────╮ │ «person» │ │ Developer │ │ Works in panes and answers │ │ agents │ ╰───────────────────────────────╯ │ Types into │ ▼ ┌───────────────────────────────┐ │ «system» │ │ tuios │ │ Multiplexer, window manager │ ┌►│ and agent cockpit │─┐ ┌─┘ └───────────────────────────────┘ └─┐ │ │ │ │ Runs in panes │ │ │ │ │ ▼ │ │ ┌───────────────────────────────┐ │ │ │ «external system» │ │ │ │ Coding agents │ │ │ │ Claude Code, Codex and others │ │ │ └───────────────────────────────┘ │ │ │ │ │ Pushes branches to Links to │ │ │ │ ▼ │ │ ┌───────────────────────────────┐ │ Attaches over │ «external system» │ │ SSH │ │ Git host │ │ │ │ Pull requests and CI │ │ │ └───────────────────────────────┘ │ │ │ │ ┌───────────────────────────────┐ ┌─┘ │ │ «external system» │◄┘ │ │ Other machines │ │ │ Remote tuios daemons │ │ └───────────────────────────────┘ │ └┐ ╭───────────────────────────────╮ └──│ «person» │ │ Developer on a phone │ │ Approves from anywhere │ ╰───────────────────────────────╯
58 columns, 46 rows, drawn for 80 columns.
C4Context
title tuios in its surroundings
Person(dev, "Developer", "Works in panes and answers agents")
System(tuios, "tuios", "Multiplexer, window manager and agent cockpit")
System_Ext(agents, "Coding agents", "Claude Code, Codex and others")
System_Ext(git, "Git host", "Pull requests and CI")
System_Ext(hosts, "Other machines", "Remote tuios daemons")
Person(phone, "Developer on a phone", "Approves from anywhere")
Rel(dev, tuios, "Types into")
Rel(phone, tuios, "Attaches over SSH")
Rel(tuios, agents, "Runs in panes")
Rel(agents, git, "Pushes branches to")
Rel(tuios, hosts, "Links to")Use case
- Keyword:
usecase-beta. - Goldens: 24 of 24 match pele.
- Text: Drawn as a flowchart is.
- Known difference: The edges of an actor start a few cells to the right of the figure and join into one line. It can be hard to see which actor goes where.
┌─ tuios ─────────────────────────────────────────────────────────────────┐ │ │ │ ╭──────────────────────╮ │ ┌────┼─────►│ Split and tile panes │ │ │ │ ╰──────────────────────╯ │ │ │ │ │ │ ╭─────────────────╮ │ ├────┼────────►│ Start an agent │ │ │ │ ╰─────────────────╯ │ o ────┤ │ │ /|\ ────┘ │ │ / \ ────┐ │ ╭────────────────────────╮ │ Developer ────┼────┼────►│ Approve a command │┄┄┄┄ «include» ┄┄┄┐ │ │ │ ╰────────────────────────╯ ┆ │ │ │ ┆ │ │ │ ┆ ╭───────────────────╮ │ │ │ └►│ Ask for approval │ │ o │ │ ╭──────────────────╮ ┌►│ │ │ /|\ ──┴┬───┼───────►│ Review the diff │ │ ╰───────────────────╯ │ / \ ───┤ │ ╰──────────────────╯ │ │ Coding agent │ │ │ │ ├───┼─────────────────────────────────────────────────┘ │ │ │ │ │ │ ╭──────────────────╮ │ └───┼───────►│ Push a branch │ │ │ ╰──────────────────╯ │ └─────────────────────────────────────────────────────────────────────────┘
99 columns, 27 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
usecase-beta
direction LR
actor Dev("Developer")
actor Agent("Coding agent")
systemBoundary tuios["tuios"]
Split("Split and tile panes")
Start("Start an agent")
Approve("Approve a command")
Review("Review the diff")
Ask("Ask for approval")
Push("Push a branch")
end
Dev --> Split
Dev --> Start
Dev --> Approve
Dev --> Review
Agent --> Ask
Agent --> Push
Approve ..> : include AskAgent flow
- Keyword:
agentflow-beta. - Goldens: 12 of 12 match pele.
- Text: Drawn as a flowchart is.
- Known difference: A note link whose name starts with two backslashes is written as pele writes it. The scheme stays https, so the link allowlist holds.
┌─────────────────────┐ │ Bug report │ └─────────────────────┘ │ ▼ ┌─ Fixer agent ───────────┐ │ │ │ ╭──────────────────╮ │ │ │ Reproduce the │ │ │ │ bug │ │ │ ╰──────────────────╯ │ │ │ │ │ ▼ │ │ ┌────────────────────┐ │ │ │ go test │ │ │ └────────────────────┘ │ │ │ │ │ ▼ │ │ ╭──────────────────╮ │ │ │ Write the fix │ │ │ ╰──────────────────╯ │ │ ┆ │ │ ┌───────────────────┐ │ │ │ AGENTS.md │ │ │ └───────────────────┘ │ └─────────────┬───────────┘ │ ▼ ┌─ Review agent ────────┐ │ │ │ ╭──────────────────╮ │ │ │ Read the diff │ │ │ ╰──────────────────╯ │ │ │ │ │ ▼ │ │ ╱─────────────────╲ │ │ < Fix is right? > │ │ ╲─────────────────╱ │ │ │ │ └────────────┼──────────┘ │ yes │ ▼ ╱──────────────────────╲ < Open the pull > │ request │ ╲──────────────────────╱
28 columns, 48 rows, drawn for 80 columns.
agentflow-beta TB
issue["Bug report"]@{ shape: input }
flow fixer["Fixer agent"]
repro["Reproduce the bug"]@{ shape: task }
tests["go test"]@{ shape: tool }
patch["Write the fix"]@{ shape: task }
guide["AGENTS.md"]@{ shape: refdoc }
repro --> tests --> patch
patch -.- guide
end
flow reviewer["Review agent"]
read["Read the diff"]@{ shape: task }
ok["Fix is right?"]@{ shape: decision }
read --> ok
end
pr["Open the pull request"]@{ shape: action }
issue --> fixer
fixer --> reviewer
ok -- yes --> prSwimlane
- Keyword:
swimlane-beta. - Goldens: 13 of 13 match pele.
- Text: A flowchart with its lanes as bands.
┌─ Agent ──────────────────┐┌─ CI ──────────────────┐┌─ You ─────────────────┐ │ ││ ││ │ │ ┌───────────────────┐ ││ ││ │ │ │ Make a worktree │ ││ ││ │ │ └───────────────────┘ ││ ││ │ │ │ ││ ││ │ │ ▼ ││ ││ │ │ ┌───────────────────┐ ││ ││ │ │┌─►│ Write the change │◄─┼┼───────────────────────┼┼────────────┐ │ ││ └───────────────────┘ ││ ││ │ │ ││ │ ││ ││ │ │ ││ ▼ ││ ││ │ │ ││ ┌───────────────────┐ ││ ││ │ │ ││ │ Push the branch │──┼┼───────────┐ ││ │ │ ││ └───────────────────┘ ││ │ ││ │ │ ││ ││ │ ││ │ │ ││ ││ ▼ ││ │ │ ││ ││ ┌────────────────┐ ││ changes │ ││ ││ │ Run the tests │ ││ │ │ ││ ││ └────────────────┘ ││ │ │ ││ ││ │ ││ │ │ ││ ││ ▼ ││ │ │ ││ ││ ╱──────────────╲ ││ │ │ │└───────────── no ────────┼┼───< Green? > ││ │ │ │ ││ ╲──────────────╱ ││ │ │ │ ││ │ ││ │ │ │ ││ │ ││ ┌─────────────────┐ │ │ ││ └───── yes ─┼┼──►│ Review the diff │ │ │ ││ ││ └─────────────────┘ │ │ ││ ││ │ │ │ ││ ││ approve │ │ ││ ││ ▼ │ │ ││ ││ ┌─────────┐ │ │ ││ ││ │ Merge │ │ │ ││ ││ └─────────┘ │ └──────────────────────────┘└───────────────────────┘└───────────────────────┘
79 columns, 36 rows, drawn for 80 columns.
swimlane-beta LR
subgraph Agent
branch[Make a worktree]
code[Write the change]
push[Push the branch]
end
subgraph CI
test[Run the tests]
green{Green?}
end
subgraph You
review[Review the diff]
merge[Merge]
end
branch --> code --> push --> test --> green
green -->|no| code
green -->|yes| review
review -->|changes| code
review -->|approve| mergeTime and order
Diagrams that run along time, or along the order of events.
Sequence
- Keyword:
sequenceDiagram. - Goldens: 38 of 38 match pele.
- Text: The layout of the SVG, mapped to cells: lifelines run down, and messages run across.
┌─────┐ │ You │ └─────┘ ┌──────────┐ ┌──────────────┐ ┌────────────┐ ┌─────────┐ │ │ Inbox │ │ Daemon │ │ claude │ │ git │ │ └──────────┘ └──────────────┘ └────────────┘ └─────────┘ │ │ │ │ │ │ Start an agent in a worktree │ │ │ │ ──────────────────────────┼─────────────────────────►│ │ │ │ │ │ │ │ │ │ │ Spawn in a new pane │ │ │ │ │──────────────────────────────► │ │ ┌ loop [Until the task is done] ───┼──────────────────────────┼────────────────────────────────┼────────────────────────────┼──┐ │ │ │ │ │ │ │ │ │ │ │ │ Read and edit files │ │ │ │ │ │ │ ──────────────────────────►│ │ │ ┌ opt [A risky command] ─────────┼──────────────────────────┼────────────────────────────────┼────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Ask to run rm -rf build/ │ │ │ │ │ │ │ │ │◄───────────────────────────── │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Add an approval │ │ │ │ │ │ │ │ │◄──────────────────────── │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Notify │ │ │ │ │ │ │ │ │◄──────────────────────────│ │ │ │ │ │ │ │ ┌ alt [You approve] ───────────┼──────────────────────────┼────────────────────────────────┼──┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Allow once │ │ │ │ │ │ │ │ │ │ │ ─────────────────────────►│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Allowed │ │ │ │ │ │ │ │ │ │┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄► │ │ │ │ │ │ │ ├┄ [You refuse] ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┤ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Deny, with a note │ │ │ │ │ │ │ │ │ │ │ ─────────────────────────►│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Denied │ │ │ │ │ │ │ │ │ │ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄► │ │ │ │ │ │ │ └──┼───────────────────────────┼──────────────────────────┼────────────────────────────────┼──┘ │ │ │ │ └────┼───────────────────────────┼──────────────────────────┼────────────────────────────────┼────┘ │ │ │ │ │ │ │ │ │ └──────┼───────────────────────────┼──────────────────────────┼────────────────────────────────┼────────────────────────────┼──┘ │ │ │ │ │ │ │ │ │ Commit │ │ │ │ │ ──────────────────────────►│ │ │ │ │ │ │ │ │ Done │ │ │ │ │◄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ The worktree keeps the diff for review │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ Show the diff │ │ │ │◄──────────────────────────┼───────────────────────── │ │ │ │ │ │ │ │ ┌─────┐ ┌──────────┐ ┌──────────────┐ ┌────────────┐ ┌─────────┐ │ You │ │ Inbox │ │ Daemon │ │ claude │ │ git │ └─────┘ └──────────┘ └──────────────┘ └────────────┘ └─────────┘
131 columns, 59 rows. No layout fits in 80 columns, so it is drawn at its full width. It shrinks to fit the page. Select Full size to read it at full size.
sequenceDiagram
autonumber
box rgba(168,85,247,0.12) You
actor You
participant Inbox
end
box rgba(59,130,246,0.12) Laptop
participant Daemon
participant Agent as claude
participant Repo as git
end
You->>Daemon: Start an agent in a worktree
Daemon->>+Agent: Spawn in a new pane
loop Until the task is done
Agent->>Repo: Read and edit files
opt A risky command
Agent->>Daemon: Ask to run rm -rf build/
Daemon->>Inbox: Add an approval
Inbox->>You: Notify
alt You approve
You->>Inbox: Allow once
Inbox-->>Agent: Allowed
else You refuse
You->>Inbox: Deny, with a note
Inbox-->>Agent: Denied
end
end
end
Agent->>Repo: Commit
Agent-->>-Daemon: Done
Note over Daemon,Repo: The worktree keeps the diff for review
Daemon->>You: Show the diffGantt
- Keyword:
gantt. - Goldens: 11 of 11 match pele.
- Text: Bars on a date axis.
tuios 1.0 Design ··┆· ··┆· ··┆· ·┆·· ·┆·· ·┆·· Agent cockpit ░░░░░░░░░░ ··┆· ··┆· ·┆·· ·┆·· ·┆·· Plugin API ··┆· ░░░░░░░░░░ ··┆· ·┆·· ·┆·· ·┆·· Design review ··┆· ··┆· ◆ ··┆· ·┆·· ·┆·· ·┆·· Build ··┆· ··┆· ··┆· ·┆·· ·┆·· ·┆·· Inbox and replies ··┆· ··┆· ▘▘▘▘▘▘▘▘▘▘▘▘ ·┆·· ·┆·· ·┆·· Plugin runtime ··┆· ··┆· ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ·┆·· ·┆·· Live upgrade ··┆· ··┆· ··┆· ▚▚▚▚▚▚▚▚▚▚▚▚▚▚▚▚▚▚ ·┆·· Phone client ··┆· ··┆· ··┆· ·┆··█████████████ ·┆·· Ship ··┆· ··┆· ··┆· ·┆·· ·┆·· ·┆·· Freeze ··┆· ··┆· ··┆· ·┆·· ·┆··◆ ·┆·· Release candidate ··┆· ··┆· ··┆· ·┆·· ·┆··▓▓▓▓▓▓▓┆·· Docs and videos ··┆· ··┆· ··┆· ·┆·· ·┆·· ██████████ 1.0 release ··┆· ··┆· ··┆· ·┆·· ·┆·· ·┆·◆ ────┼─────────┼─────────┼────────┼─────────┼─────────┼──── Oct 04 Oct 11 Oct 18 Oct 25 Nov 01 Nov 08 █ task ▒ active ░ done ▓ critical ▚ critical, active ▘ critical, done ◆ milestone · excluded
79 columns, 21 rows, drawn for 80 columns.
gantt
title tuios 1.0
dateFormat YYYY-MM-DD
axisFormat %b %d
tickInterval 1week
excludes weekends
todayMarker off
section Design
Agent cockpit :done, d1, 2026-10-01, 5d
Plugin API :done, d2, after d1, 4d
Design review :milestone, m1, after d2, 0d
section Build
Inbox and replies :crit, done, b1, after d2, 6d
Plugin runtime :active, b2, after d2, 9d
Live upgrade :crit, active, b3, after b1, 8d
Phone client :b4, after b2, 6d
section Ship
Freeze :milestone, m2, after b3, 0d
Release candidate :crit, s1, after b3, 4d
Docs and videos :s2, after b4, 5d
1.0 release :milestone, m3, after s1, 0dTimeline
- Keyword:
timeline. - Goldens: 14 of 14 match pele.
- Text: It runs across, and runs down when it does not fit the columns.
A release week ┌──────────────────────────────────────┐ │ Freeze │ └──────────────────────────────────────┘ ┌───────────┐ │ Monday ├─┬─ Cut the release branch └───────────┘ └─ Move the library pins ┌───────────┐ │ Tuesday ├─┬─ Run the full E2E suite └───────────┘ └─ Fuzz overnight ┌──────────────────────────────────────┐ │ Check │ └──────────────────────────────────────┘ ┌───────────┐ │ Wednesday ├─── Fix what the fuzzer └───────────┘ found ┌───────────┐ │ Thursday ├─┬─ Release candidate on └───────────┘ │ every platform └─ Write the release notes ┌──────────────────────────────────────┐ │ Ship │ └──────────────────────────────────────┘ ┌───────────┐ │ Friday ├─┬─ Tag the release └───────────┘ ├─ Homebrew, AUR and │ Docker └─ Post the clips
40 columns, 36 rows, drawn for 80 columns.
timeline
title A release week
section Freeze
Monday : Cut the release branch
: Move the library pins
Tuesday : Run the full E2E suite
: Fuzz overnight
section Check
Wednesday : Fix what the fuzzer found
Thursday : Release candidate on every platform
: Write the release notes
section Ship
Friday : Tag the release
: Homebrew, AUR and Docker
: Post the clipsUser journey
- Keyword:
journey. - Goldens: 1 of 1 match pele.
- Text: It runs across, and runs down when it does not fit the columns.
Your first hour with tuios ┌────────────────────────────┐ │ Install │ └────────────────────────────┘ ┌──────────────────────┐ │ Run the install │ ●●●●● │ script │ │ You │ └──────────────────────┘ ┌────────────────────────────┐ │ Panes │ └────────────────────────────┘ ┌──────────────────────┐ │ Split and tile panes │ ●●●●● │ You │ └──────────────────────┘ ┌──────────────────────┐ │ Learn the leader │ ●●●○○ │ key │ │ You │ └──────────────────────┘ ┌────────────────────────────┐ │ Agents │ └────────────────────────────┘ ┌──────────────────────┐ │ Start an agent │ ●●●●● │ You, Agent │ └──────────────────────┘ ┌──────────────────────┐ │ Wait for an │ ●●○○○ │ approval │ │ You, Agent │ └──────────────────────┘ ┌──────────────────────┐ │ Approve from the │ ●●●●● │ Inbox │ │ You, Agent │ └──────────────────────┘ ┌────────────────────────────┐ │ Away │ └────────────────────────────┘ ┌──────────────────────┐ │ Detach and close │ ●●●●○ │ the laptop │ │ You │ └──────────────────────┘ ┌──────────────────────┐ │ Attach from the │ ●●●●● │ phone │ │ You, Agent │ └──────────────────────┘
30 columns, 52 rows, drawn for 80 columns.
journey
title Your first hour with tuios
section Install
Run the install script: 5: You
section Panes
Split and tile panes: 5: You
Learn the leader key: 3: You
section Agents
Start an agent: 5: You, Agent
Wait for an approval: 2: You, Agent
Approve from the Inbox: 5: You, Agent
section Away
Detach and close the laptop: 4: You
Attach from the phone: 5: You, AgentGit graph
- Keyword:
gitGraph. - Goldens: 35 of 35 match pele.
- Text: It runs down, one row for each commit, with the oldest commit at the top.
┌┄main ┆ ┌┄feat/inbox ┆ ┆ ┌┄fix/attach-race ● ┆ ┆ v0.8.0 [v0.8.0] ● ┆ ┆ fix scrollback ├─● ┆ inbox model ┆ ● ┆ reply composer ├─┼─■ fix the race ○─┼─┤ ┆ ● ┆ paste chips ○─┤ ┆ ● ┆ ┆ release notes ● ┆ ┆ v0.9.0 [v0.9.0] ┆ ┆ ┆
22 columns, 14 rows, drawn for 80 columns.
gitGraph
commit id: "v0.8.0" tag: "v0.8.0"
commit id: "fix scrollback"
branch feat/inbox
checkout feat/inbox
commit id: "inbox model"
commit id: "reply composer"
checkout main
branch fix/attach-race
checkout fix/attach-race
commit id: "fix the race" type: HIGHLIGHT
checkout main
merge fix/attach-race
checkout feat/inbox
commit id: "paste chips"
checkout main
merge feat/inbox
commit id: "release notes"
commit id: "v0.9.0" tag: "v0.9.0"Event model
- Keyword:
eventmodeling. - Goldens: 12 of 12 match pele.
- Text: Swimlanes in time order, or a list of frames when it is narrow.
UI/Automation ┌ 01 ───────┐ │ AgentPane │ └───────────┘ ▼ Command/Read Model ┌ 02 ─────────────┐ │ RunTool │ │ command: string │ └─────────────────┘ ▼ Events ┌ 03 ───────────┐ │ ApprovalAsked │ │ tool: string │ └───────────────┘ ▼ Command/Read Model ┌ 04 ───┐ │ Inbox │ └───────┘ ▼ UI/Automation ┌ 05 ────────┐ │ InboxPanel │ └────────────┘ ▼ Command/Read Model ┌ 06 ─────────┐ │ Approve │ │ allow: bool │ └─────────────┘ ▼ Events ┌ 07 ─────────────┐ │ ApprovalGranted │ │ by: string │ └─────────────────┘ ▼ UI/Automation ┌ 08 ──────────┐ │ AgentResumer │ └──────────────┘ ▼ Events ┌ 09 ───────┐ │ ToolRan │ │ exit: int │ └───────────┘
19 columns, 49 rows, drawn for 80 columns.
eventmodeling
tf 01 ui AgentPane
tf 02 cmd RunTool { command: string }
tf 03 evt ApprovalAsked { tool: string }
tf 04 rmo Inbox ->> 03
tf 05 ui InboxPanel
tf 06 cmd Approve { allow: bool }
tf 07 evt ApprovalGranted { by: string }
tf 08 pcr AgentResumer
tf 09 evt ToolRan { exit: int }Charts
Numbers drawn as shapes. In text, most charts become bars, grids or tables.
Pie
- Keyword:
pie.showDatashows the values. - Goldens: 2 of 2 match pele.
- Text: One bar for each slice, with its percentage and value. As in pele, a slice under 1% is left out of the pie.
Where a week of CI minutes goes E2E suite ████████████████████████████████████████ 32% 412 Ghostty backend ██████████████████████▉ 18% 236 Unit tests ██████████████████▎ 15% 188 Fuzz, nightly ███████████████▉ 13% 164 Release builds ███████████▊ 9% 121 WebAssembly ███████▏ 6% 74 Lint and vet █████ 4% 52 Docs site ███▊ 3% 38
67 columns, 10 rows, drawn for 80 columns.
pie showData
title Where a week of CI minutes goes
"E2E suite" : 412
"Ghostty backend" : 236
"Unit tests" : 188
"Fuzz, nightly" : 164
"Release builds" : 121
"WebAssembly" : 74
"Lint and vet" : 52
"Docs site" : 38XY chart
- Keyword:
xychartorxychart-beta. - Goldens: 8 of 8 match pele.
- Text: Bars and lines drawn with plot. Categories turn into rows when they do not fit across. Point labels and bar values go where they cover nothing.
Idle CPU of a session, by release Wakeups per minute 1400 ┐ │ 1200 ┤ ██████⡀ │ ██████⠈⠒⠤⣀ 1000 ┤ ██████ ▅▅▅▅▅▅ │ ██████ ██████⢄ 800 ┤ ██████ ██████ ⠑⠤⡀ │ ██████ ██████ ▁▁▁▁▁▁ 600 ┤ ██████ ██████ ██████⣀ │ ██████ ██████ ██████ ⠑⠢⣀ 400 ┤ ██████ ██████ ██████ ▃▃▃▃▃▃ │ ██████ ██████ ██████ ██████⠒⠤⣀ 200 ┤ ██████ ██████ ██████ ██████ ▂▂▂▂▂▂⣀ │ ██████ ██████ ██████ ██████ ██████ ⠉▄▄▄▄▄▄ 0 ┴────┬───────┬───────┬───────┬───────┬───────┬─── v0.4 v0.5 v0.6 v0.7 v0.8 v0.9
54 columns, 19 rows, drawn for 80 columns.
xychart
title "Idle CPU of a session, by release"
x-axis [v0.4, v0.5, v0.6, v0.7, v0.8, v0.9]
y-axis "Wakeups per minute" 0 --> 1400
bar [1200, 960, 610, 340, 120, 45]
line [1200, 960, 610, 340, 120, 45]Quadrant chart
- Keyword:
quadrantChart. - Goldens: 3 of 3 match pele.
- Text: A box in four parts, with the points as dots.
Which bug to fix first ┌─────────────────────────────────┬─────────────────────────────────┐ │ Plan a fix │ Fix now │ │ │ │ │ ● Lost scrollback on upgrade │ Large harm │ │ │ │ ● Dead pane on resize │ │ │ │ Slow first frame ● │ │ │ │ │ │ Flaky attach test ● │ ├─────────────────────────────────┼─────────────────────────────────┤ │ │ │ │ │ ● Mouse drag in nvim │ │ │ │ Small harm │ │ ● Wrong glyph width │ │ │ │ │ ● Theme flicker │ │ │ │ ● Typo in help │ │ Leave it │ Quick win │ └─────────────────────────────────┴─────────────────────────────────┘ Rare Common
80 columns, 22 rows, drawn for 80 columns.
quadrantChart
title Which bug to fix first
x-axis Rare --> Common
y-axis Small harm --> Large harm
quadrant-1 Fix now
quadrant-2 Plan a fix
quadrant-3 Leave it
quadrant-4 Quick win
Lost scrollback on upgrade: [0.35, 0.9]
Flaky attach test: [0.8, 0.55]
Wrong glyph width: [0.7, 0.25]
Slow first frame: [0.9, 0.7]
Mouse drag in nvim: [0.66, 0.38]
Theme flicker: [0.25, 0.15]
Dead pane on resize: [0.15, 0.75]
Typo in help: [0.6, 0.08]Sankey
- Keyword:
sankeyorsankey-beta. - Goldens: 8 of 8 match pele.
- Text: Columns of boxes joined by lines. When two lines would join, when lines cross more than three times, or when the columns do not fit, it is a table of flows: source, target and value.
┌────────────┐ ┌───────────────┐ ┌───▶│ Shell ├─47─────▶│ Pane redraw │ │ │ 47 │ ┌───▶│ 77 │ ┌─────────────┐ │ └────────────┘ │ └───────────────┘ │ Key presses ├─47─┘ │ │ 100 ├─35───┐ │ │ ├─18──┐│ │ └─────────────┘ ││ │ ││ ┌────────────┐ │ │└─▶│ Agent ├─30─┘ ┌───────────────┐ │ │ 35 ├─5──────▶│ Inbox │ │ └────────────┘ │ 5 │ │ └───────────────┘ │ │ ┌───────────────┐ │ ┌────────────┐ ┌──▶│ Layout change │ └──▶│ Leader key ├─11──┘ │ 11 │ │ 18 ├─7────┐ └───────────────┘ └────────────┘ │ │ ┌───────────────┐ └─▶│ Copy mode │ │ 7 │ └───────────────┘
64 columns, 23 rows, drawn for 80 columns.
sankey
Key presses,Shell,47
Key presses,Agent,35
Key presses,Leader key,18
Shell,Pane redraw,47
Agent,Pane redraw,30
Agent,Inbox,5
Leader key,Layout change,11
Leader key,Copy mode,7Radar
- Keyword:
radar-beta. - Goldens: 3 of 3 match pele.
- Text: A table with one bar for each curve on each axis.
Release health from 0 to 5 Idle CPU v0.8 ██████████████████············ 3 v0.9 ██████████████████████████████ 5 Memory v0.8 ██████████████████············ 3 v0.9 ████████████████████████······ 4 Startup v0.8 ████████████████████████······ 4 v0.9 ████████████████████████······ 4 Binary size v0.8 ██████████████████············ 3 v0.9 ████████████·················· 2 E2E cover v0.8 ████████████·················· 2 v0.9 ████████████████████████······ 4 Docs v0.8 ██████████████████············ 3 v0.9 ████████████████████████······ 4
39 columns, 20 rows, drawn for 80 columns.
radar-beta
title Release health
axis cpu["Idle CPU"], mem["Memory"], start["Startup"]
axis size["Binary size"], tests["E2E cover"], docs["Docs"]
curve old["v0.8"]{3, 3, 4, 3, 2, 3}
curve new["v0.9"]{5, 4, 4, 2, 4, 4}
max 5
graticule polygonTreemap
- Keyword:
treemap-beta, ortreemap. - Goldens: 8 of 8 match pele.
- Text: Nested boxes, or an indented tree when the boxes are too small.
tuios, thousands of lines of Go 407 ├ Window manager 186 │ ├ internal/app 145 │ ├ internal/config 26 │ └ internal/input 15 ├ Daemon and CLI 144 │ ├ internal/session 105 │ └ cmd/tuios 39 └ Libraries 77 ├ sketch 37 ├ vt 27 ├ tml 7 └ loom 6
36 columns, 13 rows, drawn for 80 columns.
treemap-beta
"tuios, thousands of lines of Go"
"Window manager"
"internal/app": 145
"internal/config": 26
"internal/input": 15
"Daemon and CLI"
"internal/session": 105
"cmd/tuios": 39
"Libraries"
"sketch": 37
"vt": 27
"tml": 7
"loom": 6Venn
- Keyword:
venn-beta. - Goldens: 8 of 8 match pele.
- Text: A table of the sets and their overlaps.
What tuios is Sets Size mux Multiplexer 10 wm Window manager 10 cockpit Agent cockpit 10 Overlaps Size mux ∩ wm Tiling panes 2.5 cockpit ∩ wm Agent rail 2.5 cockpit ∩ mux Detached agents 2.5 cockpit ∩ mux ∩ wm tuios 1.111
44 columns, 10 rows, drawn for 80 columns.
venn-beta
title What tuios is
set mux["Multiplexer"]
set wm["Window manager"]
set cockpit["Agent cockpit"]
union mux,wm["Tiling panes"]
union wm,cockpit["Agent rail"]
union mux,cockpit["Detached agents"]
union mux,wm,cockpit["tuios"]Packet
- Keyword:
packetorpacket-beta. - Goldens: 4 of 4 match pele.
- Text: Rows of bit fields.
- Known difference: At 40 columns, one-bit fields draw as empty columns, and a long label can break inside a word. At 80 columns a one-bit label reads down, one letter a row.
0 31 ┌───────────────────────────────────────────────────────────────┐ │ Length of the rest of the frame │ └───────────────────────────────────────────────────────────────┘ 32 39 47 63 ┌───────────────┬───────────────┬───────────────────────────────┐ │ Message type │ Codec │ Request id │ └───────────────┴───────────────┴───────────────────────────────┘ 64 95 ┌───────────────────────────────────────────────────────────────┐ │ Request id │ └───────────────────────────────────────────────────────────────┘ 96 111 127 ┌───────────────────────────────┬───────────────────────────────┐ │ Request id │ gob payload │ └───────────────────────────────┴───────────────────────────────┘ A tagged tuios wire frame
65 columns, 18 rows, drawn for 80 columns.
packet
title A tagged tuios wire frame
0-31: "Length of the rest of the frame"
32-39: "Message type"
40-47: "Codec"
48-111: "Request id"
112-127: "gob payload"Trees, boards and maps
Outlines, boards and two-axis maps.
Mindmap
- Keyword:
mindmap. - Goldens: 13 of 13 match pele.
- Text: A tree.
((tuios)) ├── Panes │ ├── Tiling │ │ ├── Master and stack │ │ └── Grid │ ├── Floating │ └── Copy mode │ ├── Vim motions │ └── Search ├── Agents │ ├── Harnesses │ │ ├── Claude Code │ │ └── Codex │ ├── Inbox │ │ ├── Approvals │ │ └── Replies │ └── ))Checkpoints(( ├── Hosts │ ├── [Laptop] │ ├── )Build server( │ └── {{Phone}} │ └── Collie ├── Libraries │ ├── vt │ │ ├── Pure Go │ │ └── libghostty │ ├── sketch │ │ ├── Mermaid │ │ └── SVG and PNG │ ├── plot │ └── loom └── Themes ├── Catppuccin ├── Nord └── Omarchy
28 columns, 35 rows, drawn for 80 columns.
mindmap
root((tuios))
Panes
Tiling
Master and stack
Grid
Floating
Copy mode
Vim motions
Search
Agents
Harnesses
Claude Code
Codex
Inbox
Approvals
Replies
))Checkpoints((
Hosts
[Laptop]
)Build server(
{{Phone}}
Collie
Libraries
vt
Pure Go
libghostty
sketch
Mermaid
SVG and PNG
plot
loom
Themes
Catppuccin
Nord
OmarchyTree view
- Keyword:
treeView-beta. - Goldens: 13 of 13 match pele.
- Text: Drawn as the
treecommand draws a folder. - Known difference: A very long file name at 40 columns makes the drawing fall back to its own width.
tuios/ ├── cmd/ │ ├── tuios/ │ ├── tuios-web/ │ └── tuios-wasm/ ├── internal/ │ ├── app/ │ ├── session/ │ ├── input/ │ └── terminal/ ├── vt/ ├── sketch/ │ ├── raster/ │ └── text/ ├── docs/ ├── go.mod ├── go.work └── AGENTS.md
19 columns, 18 rows, drawn for 80 columns.
treeView-beta
tuios/
cmd/
tuios/
tuios-web/
tuios-wasm/
internal/
app/
session/
input/
terminal/
vt/
sketch/
raster/
text/
docs/
go.mod
go.work
AGENTS.mdIshikawa
- Keyword:
ishikawa-beta, orishikawa. - Goldens: 1 of 1 match pele.
- Text: A spine with the causes as bones, or an indented tree when it is narrow.
Flaky E2E test ├ Timing │ ├ Fixed sleeps │ └ Reply hook race ├ Machine │ ├ Busy CI runner │ └ Slow disk ├ Test │ ├ Shared HOME │ └ Leftover daemon ├ Code │ ├ Unbuffered channel │ └ Missing condition wait └ Terminal ├ Wrong TERM └ Small window
26 columns, 16 rows, drawn for 80 columns.
ishikawa-beta
Flaky E2E test
Timing
Fixed sleeps
Reply hook race
Machine
Busy CI runner
Slow disk
Test
Shared HOME
Leftover daemon
Code
Unbuffered channel
Missing condition wait
Terminal
Wrong TERM
Small windowKanban
- Keyword:
kanban. - Goldens: 3 of 3 match pele.
- Text: Columns side by side, in more rows when they do not fit.
┌────────────────────────┐ ┌─────────────────────────┐ │ To do (2) │ │ In progress (2) │ │ │ │ │ │ ┌────────────────────┐ │ │ ┌─────────────────────┐ │ │ │ Plugin registry │ │ │ │ Live daemon upgrade │ │ │ │ Low │ │ │ │ claude · Very High │ │ │ └────────────────────┘ │ │ └─────────────────────┘ │ │ ┌────────────────────┐ │ │ ┌─────────────────────┐ │ │ │ Sixel in copy mode │ │ │ │ Phone client │ │ │ │ Very Low │ │ │ │ codex · High │ │ │ └────────────────────┘ │ │ └─────────────────────┘ │ └────────────────────────┘ └─────────────────────────┘ ┌──────────────────────────┐ ┌─────────────────────────┐ │ In review (1) │ │ Done (2) │ │ │ │ │ │ ┌──────────────────────┐ │ │ ┌─────────────────────┐ │ │ │ Inbox reply composer │ │ │ │ Sketch draws sankey │ │ │ │ claude │ │ │ │ diagrams │ │ │ └──────────────────────┘ │ │ └─────────────────────┘ │ │ │ │ ┌─────────────────────┐ │ │ │ │ │ Omarchy themes │ │ │ │ │ └─────────────────────┘ │ └──────────────────────────┘ └─────────────────────────┘
56 columns, 24 rows, drawn for 80 columns.
kanban
todo[To do]
t1[Plugin registry]@{ priority: 'Low' }
t2[Sixel in copy mode]@{ priority: 'Very Low' }
doing[In progress]
t3[Live daemon upgrade]@{ assigned: 'claude', priority: 'Very High' }
t4[Phone client]@{ assigned: 'codex', priority: 'High' }
review[In review]
t5[Inbox reply composer]@{ assigned: 'claude' }
done[Done]
t6[Sketch draws sankey diagrams]
t7[Omarchy themes]Cynefin
- Keyword:
cynefin-beta. - Goldens: 3 of 3 match pele.
- Text: A grid of the four domains.
Kinds of work on tuios ┌──────────────────────────────┬──────────────────────────────┐ │ Complex │ Complicated │ │ Probe → Sense → Respond │ Sense → Analyse → Respond │ │ Emergent Practices │ Good Practices │ │ • Design the agent cockpit │ • Port a Mermaid renderer │ │ │ • Speed up the VT parser │ │ ┌─────┴─────┐ │ │ │ Confusion │ │ ├────────────────────────┤ Disorder ├────────────────────────┤ │ └─────┬─────┘ │ │ ┃ │ │ Chaotic ┃ Clear │ │ Act → Sense → Respond ┃ Sense → Categorise → Respond │ │ Novel Practices ┃ Best Practices │ │ • Release broke on Windows ┃ • Move a library pin │ │ ┃ • Fix a typo in help │ └──────────────────────────────┻──────────────────────────────┘ Chaotic → Complex: Stabilized Complex → Complicated: Pattern found Complicated → Clear: Written down
63 columns, 22 rows, drawn for 80 columns.
cynefin-beta
title Kinds of work on tuios
clear
"Move a library pin"
"Fix a typo in help"
complicated
"Port a Mermaid renderer"
"Speed up the VT parser"
complex
"Design the agent cockpit"
chaotic
"Release broke on Windows"
chaotic --> complex : "Stabilized"
complex --> complicated : "Pattern found"
complicated --> clear : "Written down"Wardley map
- Keyword:
wardley-beta. - Goldens: 19 of 19 match pele.
- Text: A grid of visibility by evolution, or a table when it is narrow.
- Known difference: When labels crowd, a label can move away from its dot. At 40 columns a dot can hide under another label.
tuios value chain ↑ Visibility │ ┆ ┆ ┆ │ ┆ ┆·······◆ Developer┆ │ ┆ ·············· · ┆ │ Agent cockpit ●┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄○ ┆ · ┆ │ ·· ┆ · ┆ │ ┆ ··· ┆ ● Window manager │ ┆ ··· ┆ ·· ┆ │ ┆ ···· ┆ · ┆ │ ┆ ·●·Coding agents ┆ │ ┆ ·· ··┆ ┆ │ ┆ ·●·Session daemon ┆ │ ┆ ······· ┆ │ ┆ ┆ ··●·VT emulator │ ┆ ┆ ·········· │ ┆ ┆ ·········· │ ┆ ┆ ┆ ········● SSH │ ┆ ┆ ┆ ······ │ ┆ ┆ ┆ ··● PTY │ ┆ ┆ ┆ └────────────────────────────────────────────────────────────────────────────── Genesis Custom Product Commodity Evolution →
80 columns, 24 rows, drawn for 80 columns.
wardley-beta
title tuios value chain
evolution Genesis@0.25 -> Custom@0.5 -> Product@0.75 -> Commodity@1.0
anchor Developer [0.95, 0.6]
component "Agent cockpit" [0.82, 0.22] (build)
component "Window manager" [0.72, 0.56] (build)
component "Coding agents" [0.58, 0.36] (buy)
component "Session daemon" [0.5, 0.45] (build)
component "VT emulator" [0.35, 0.6] (build)
component "SSH" [0.2, 0.88] (buy)
component "PTY" [0.12, 0.95] (market)
Developer -> "Agent cockpit"
Developer -> "Window manager"
"Agent cockpit" -> "Coding agents"
"Agent cockpit" -> "Session daemon"
"Window manager" -> "Session daemon"
"Session daemon" -> "VT emulator"
"Session daemon" -> "SSH"
"VT emulator" -> "PTY"
evolve "Agent cockpit" 0.45Railroad
- Keyword:
railroad-ebnf-beta,railroad-abnf-beta,railroad-peg-betaorrailroad-beta. - Goldens: 14 of 14 match pele.
- Text: The tracks in cells, or the rules as EBNF text when they do not fit.
Agent selector selector ┌───────────────────────┐ ┌──────┐ │ ┌───────┐ ┌──────┐ │ ●─┤ term ├───┴─┬┤ space ├──┤ term ├┬─┴──● └──────┘ │└───────┘ └──────┘│ └─────────◀─────────┘ term ┌────────────────────┐ ┌─────┐ ╭───╮ ┌───────┐ │ ╭───╮ ┌───────┐ │ ●─┤ key ├──┤ : ├──┤ value ├───┴─┬┤ , ├──┤ value ├┬─┴──● └─────┘ ╰───╯ └───────┘ │╰───╯ └───────┘│ └────────◀───────┘ key ╭─────────╮ ●──┬┤ harness ├┬──● │╰─────────╯│ │╭───────╮ │ ├┤ state ├──┤ │╰───────╯ │ │╭───────╮ │ ├┤ needs ├──┤ │╰───────╯ │ │╭─────────╮│ ├┤ session ├┤ │╰─────────╯│ │╭───────╮ │ ├┤ group ├──┤ │╰───────╯ │ │╭──────╮ │ ├┤ host ├───┤ │╰──────╯ │ │╭──────╮ │ ├┤ name ├───┤ │╰──────╯ │ │╭─────╮ │ └┤ cwd ├────┘ ╰─────╯ value ┌──────┐ ●──┬┤ glob ├┬──● │└──────┘│ │╭─────╮ │ └┤ you ├─┘ ╰─────╯
55 columns, 49 rows, drawn for 80 columns.
railroad-ebnf-beta
title "Agent selector"
selector = term ( space term )* ;
term = key ":" value ( "," value )* ;
key = "harness" | "state" | "needs" | "session" | "group" | "host" | "name" | "cwd" ;
value = glob | "you" ;






























































