Terminal screens agents write, patch and read back.

fictty is a terminal screen an agent writes as one JSON value, edits live by id, and reads back exactly, while its data streams straight from your commands, never through the model.

$ git clone https://github.com/brancusi/fictty && cd fictty && cargo build --release

Build from source (Rust stable). crates.io: coming soon.

sparklinea ticker, eight samples a second

Wipe the glass.Each pane holds a live screen, drawn from fictty's alphabet.

tablerows patched in by id

Push a value. It's a screen. Read it back.

Three operations over one socket. The runtime does the rest at frame rate.

1 · push

The agent writes one value

Components, the data they bind to, keys and theme, as JSON. Small enough to write in one go.

$ fictty push deploy.json
{"root": {"type": "table",
  "id": "svc", "bind": "services"},
 "data": {"services": {
  "cmd": ["kubectl", …],
  "every": 2}}}
2 · screen

The runtime makes it a screen

Drawing, scrolling, selection, focus, mouse and live data, at over 100 fps. Keys run locally; nothing waits on the model.

╭─ Services ────────────────╮
│ api-1   112ms  ● healthy  │
│ api-2   948ms  ▲ slow     │
│ web      64ms  ● healthy  │
╰───────────────────────────╯
3 · read back

The agent sees what it drew

The frame as text, or the whole state as JSON. Then it patches one node, or throws the screen away.

$ fictty get --state
{"focus": "svc",
 "selected": {"svc": 1},
 "row": {"name": "api-2",
         "p95": 948}}

One screen, from first push to thrown away.

An agent watching a deploy. Every step on the right is one command; the frame on the left is what the person sees.

▌fictty · deploy · release 4.12                                  ● live  60 fps

╭─ Services ───────────────────────────────╮ ╭─ Events ───────────────────────╮
│ service   region    p95     status       │ │ time      pod     event        │
│ api-1     eu-west   112ms   ● healthy    │ │ 14:02:11  api-1   healthy      │
│ api-2     eu-west   948ms   ▲ slow       │ │ 14:02:12  api-2   rollout 3/4  │
│ web       us-east    64ms   ● healthy    │ │ 14:02:14  web     healthy      │
│ worker    us-east    31ms   ● healthy    │ │ 14:02:15  api-2   p95 948ms    │
│ cron      eu-west       -   ○ idle       │ │ 14:02:17  worker  queue 12     │
╰──────────────────────────────────────────╯ ╰────────────────────────────────╯


j/k move · enter logs · r roll back · q close
auto
gaugea rollout, filling

Thrown together, thrown away.Screens last minutes, not months. Data never passes through the model.

lista log tail, following

A small alphabet with behaviour built in.

Blocks that scroll, select and focus on their own. Everything else is an arrangement of them, kept as data.

listScrolls and selects; draws only the rows you can see. 50,000 rows in 0.18 ms.
tableColumns from templates, heat from values, signs in colour.
tabsSwitch views without a push.
chartssparkline, chart, bars, gauge, big digits and a world map.
row · colLayout, sized in cells, percentages or shares. Flexbox, soon.
layersCallouts, rings, arrows and spotlights over any node or row.
pixelsCards, plots, SVG and images where the terminal speaks kitty graphics.
inputText fields on caretline.soon
barsreturns, negatives hang below zero

Patch one node.Then read the frame back, exactly, as text.

biga KPI, patched, then read back
From the blog · research

Why the terminal?

Terminal UIs are having their biggest year in decades. We looked at why, what the terminal really costs, and who else builds screens for agents.

Read the post →

Get fictty

fictile, adj.: capable of being moulded. Plus tty, the terminal.

$ git clone https://github.com/brancusi/fictty && cd fictty && cargo build --release

Build from source (Rust stable). crates.io: coming soon.