terminal control plane · real streams, shared safely

Share real terminals with your agents.

phux makes a terminal an addressable object on a wire. Humans, GUIs, and agents can observe or drive the same live terminal without screen scraping, rebuilt chat views, or a second terminal model in the middle.

01 real terminal bytes

libghostty-backed rendering on both ends of the wire.

02 many consumers

the TUI, browser client, GUI, and agents share one model.

03 agent-ready

state is projected locally from the same stream a person sees.

live proof phux-web client
a live phux session: the demo shell MOTD, osc 8 hyperlinks, and 24-bit color rendered by the phux-web client

A real phux terminal in your browser. The same bytes can be consumed by a GUI, a headless tool, or an agent. The demo backend is a curated, OS-less shell running as Wasm at the edge: no network and no persistent session state.

install and run
brew install phall1/phux/phux
phux

macOS or Linux. The install guide also covers release tarballs, the verified curl installer, and source builds.

The passthrough is the proof

What the live demo renders — OSC 8 hyperlinks, 24-bit color, a live prompt — is the actual terminal stream, not a re-render. It is the exact byte sequence a phux client receives off the wire. A browser canvas draws it here; a GUI frontend or an agent would consume the same bytes.

The server side is phux-edge: the real phux wire with a curated shell behind it, running as Wasm in a Durable Object — no OS, no processes, nothing to break out of. You are driving a real phux terminal, just one that can't outlive the page.

Not a terminal emulator

Phux is not trying to replace Ghostty, Kitty, iTerm, or Alacritty. Your terminal emulator stays yours. Phux gives terminals stable identities and a wire protocol so different clients can attach, observe, resize, and drive them.

The same libghostty VT engine runs on both ends, so the stream that leaves a program is the stream that reaches the client. Each consumer renders the capabilities it supports; this browser client currently covers text, color, hyperlinks, and cursor state, while native clients carry the wider modern-terminal surface.

A terminal is an object on a wire

Strip away the panes and what's left is the real model: every terminal is an addressable object you can spawn, observe, and drive over a wire. The multiplexer view you saw is one consumer of that wire — not the thing itself.

spawn

open a terminal as an object with a stable id, independent of who's watching it.

observe

attach to its live byte stream — the same stream any other consumer sees.

drive

write input to it, resize it, tag it — from a TUI, a GUI, or a program.

The wire is layered: L1 carries raw terminal bytes and input; L3 carries metadata and links between terminals. It is a small, legible surface — read the wire spec, or start with the concepts.

The wire is the product

The TUI is the on-ramp. It is how a human gets in: a familiar multiplexer that does not break the modern terminal. But the TUI holds no special status — per ADR-0017, it is a pure consumer of the wire, with no privileges a program could not also have.

Because the terminal is a wire-addressable object, humans and agents are co-present on the same terminals at the same time — not an agent scraping a human's screen, but both reading and writing the same object. The wire is the product; the panes are how you first touch it. Start with the reference tui.

Built for agents

An agent does not get a privileged protocol. The shipped CLI and MCP adapter expose side-effect-free snapshots, input, events, and versioned JSON against the same terminals a person sees. Those convenience results ride the control plane; they are not a second synchronization protocol.

A richer consumer can follow phux-web: carry the engine, consume L1, and project structure locally. That public SDK shape is still direction; the CLI and MCP surfaces are the supported agent path today. See the agent guide for what ships.

The substrate and agent control loop are real, and the APIs are early.

Status

Phux is v0.0.x, pre-alpha. The line between what is solid and what is still a promise:

mit/apache-2.0 · github.com/phall1/phux

Get going