thcThought Control

thc-scene

A live terminal UI, as one JSON value an agent drives.

thoughtcontrol.app ↗repo ↗caretline, the editor engine underneath ↗

license
MIT · Same as thc. The scene crate is on a prototype branch and not yet published.
language
Rust
backing
One author (Thought Control), with agents doing much of the building.
the case for it

The best case: an agent can write a terminal UI as one small JSON value, drive it like a person, see exactly what it drew, change one piece at a time, and keep live data flowing at thousands of updates a second without that data ever passing through the model. It has already reproduced a hand-written production screen cell for cell, so a generated UI doesn't have to look generated. Nothing else found pairs that loop with a terminal-native renderer and a pixel layer.

scores
datadriveseeedittimeratetermpxteachmatureopen
UI as data5
Agent can drive it5
Agent can see it5
Small, targeted edits5
Time travel0 → 50 today. Planned: an agent can read, seek, fork and replay (see the design).
Live data rate5
Terminal native5
Pixel graphics4Rich, but only where the terminal speaks the kitty graphics protocol (Ghostty, kitty, iTerm2, VS Code)
Teaching3 → 5Callouts, spotlights and scripted tours work today; record, take over and rewind are planned.
Maturity1A prototype: one author, no release.
Openness4MIT, but single-author and not yet published.

scene now scene planned

how agents use it

How

A local Unix socket with JSON-line requests: push, patch, key, mouse, click, layers, screen, state, stats, upgrade. A CLI wraps each one. No MCP server yet.

Wiring it in

Write one JSON UI and point its sources at commands; send ops over the socket. An MCP server is the planned way in for any agent.

Seeing the result

Yes: `screen` (the frame as text) and `state` (everything, as JSON).

Small edits

Yes: `patch` replaces one node by id; streams update one source; keys and clicks move selections.

History

Not yet. State is serializable and every input is a message, so it's designed (history, state_at, screen_at, diff, seek, fork, replay, export/import) but not built.

In short

Built for agents to drive and to see. The parts a standard would give it (MCP, A2UI input) are missing.

architecture

The whole UI is one serializable value: a tree of components, data sources bound to shell commands, JSON-line streams or literals, keys, a theme and callout layers. Elm architecture: a serializable State, a pure update that returns effects, a pure view that returns the frame plus hit regions and pictures. A runtime owns the terminal, a local control socket, child processes and the pixel layer. It sits on caretline (a Helix-model editing engine) and caretline-layers (placement for callouts, arrows and spotlights).

performance

Measured by its own stress suite on one machine; not independently reproduced.

adoption and upkeep

Adoption

Unreleased. Used only in demos so far: a thc Today rebuild, a finance dashboard, stress tests and a pixel tour.

Used by: thc itself (its Today screen, rebuilt cell for cell)

Maintainability

A prototype with tests and measured numbers, but one person and no release.

Releases: None yet. · Contributors: 1 · Recent: Built in October 2026 on a branch of thought-control. · Bus factor: low: one author

weaknesses
sources
  1. thought-control repository github.com
  2. caretline caretline.app