provide-uterm
Core brainANSI engine, screen state, DeckMux logic, control-channel framing — shared by every other package.
Collaborative terminal control plane
uterm creates, transports, secures, shares, records, replays, and arbitrates terminal sessions across browsers, WebSockets, telnet, SSH, local PTYs, and remote workers. xterm.js is the screen; uterm is the rest of the iceberg.
Demo reel
13 recorded demos — control channel, DeckMux, MCP, fan-out — concatenated.
Featured demos
Each card below is a real recording produced by scripts/demos/record_*.py in the provide-uterm repo. mp4 + asciinema, whichever reads best for the feature.
What it gives you
uterm treats the terminal as a stateful, programmable data plane. Collaboration, security, recording, AI, edge, and fleet operations share one inline control channel instead of a tangle of side-channels.
Protocol
DLE/STX framing multiplexes raw terminal bytes and JSON control frames onto a single WebSocket. No side-channels, no race conditions.
Collaboration
Adjective-animal identities, deterministic HSL colors, role-based hijack leases, queued keystrokes shown as ephemeral overlays.
Backend
Run the same hub at the Cloudflare edge. Each session is a single Durable Object with attached SQLite storage for chat and annotations.
AI agents
21 tools exposed over Model Context Protocol. Agents discover sessions, request hijack, place annotations, and join the DeckMux chat.
Fleet
Broadcast input across N sessions. Levenshtein-similarity deltas flag the outlier server immediately. Sequential mode halts on failure.
Security
LocalProvider for RBAC, WebhookProvider for enterprise integration. Tunnel tokens are in-memory, IP-bound, and rotated automatically.
How uterm Works
A single WebSocket carries every byte and every control frame. Three roles in the dance — and the protocol is the same whether you run it on your laptop, at the edge, or inside an agent.
A local or remote worker spawns a process behind a UNIX PTY. The HijackableMixin makes the session safe to hand off at checkpoints — no torn state mid-command.
The hub routes raw terminal bytes and JSON control frames through one WebSocket using DLE/STX framing. Leases, RBAC, presence, and annotations all live inline.
xterm.js, AI agents over MCP, and fan-out controllers attach as additional participants. Each gets the same snapshot view and obeys the same lease.
Monorepo
Python and TypeScript live in the same workspace. The same DLE/STX framing runs on the server, in the browser, at the edge, and inside the MCP server an AI agent uses.
provide-uterm
Core brainANSI engine, screen state, DeckMux logic, control-channel framing — shared by every other package.
provide-uterm-server
Reference hubTermHub, FastAPI surface, RBAC + lease management, tunnels, gateway. CLI entry: `uterm`, `uterm-server`.
provide-uterm-cloudflare
Edge hubCloudflare Worker + Durable Object adapter. One DO per session, SQLite persistence for chat and annotations.
provide-uterm-client
SDK + AIHTTP/WS client, telnet/SSH/WS transports, the `uterm-mcp` FastMCP server with 21 tools for agents.
provide-uterm-platform
Agent tierPTY connector, PAM auth, LD_PRELOAD capture, External Management Tier (`uterm-manager`).
provide-uterm-frontend
Browser UIVanilla TypeScript on top of xterm.js. Renders the DeckMux UI, presence chips, and annotation overlays.
provide-uterm-app
App shellPackaging shell that bundles the frontend and server for distribution.
Get Started
uterm ships a reference TermHub, a TypeScript browser frontend, a Python client SDK, and an MCP server for AI agents. Pick the surface that matches your harness — they all speak the same control channel.
Open the full quickstart →git clone https://github.com/provide-io/provide-uterm.git
cd provide-uterm
uv sync --group dev
npm ci && npm run build:frontendRun TermHub on 127.0.0.1:27780
uv run uterm-server \
--bind 127.0.0.1:27780 \
--auth dev \
--config scripts/uterm-server.example.toml.mcp.json (project) or ~/.claude.json (global)
{
"mcpServers": {
"uterm": {
"command": "uv",
"args": ["--directory", "/abs/path/to/provide-uterm", "run", "uterm-mcp"]
}
}
}Deploy the Durable-Object backend
cd packages/provide-uterm-cloudflare
npx wrangler deploy
# Each session is a single Durable Object
# with attached SQLite for chat + annotations.Why It's Different
Most terminal proxies juggle multiple WebSockets for I/O, control, and metadata. uterm multiplexes everything onto one stream — Python server and TypeScript browser agree on the same framing, byte for byte.
DeckMux treats observers as first-class. Presence, role-based leases, queued keystrokes, and shared annotations live in the protocol, not bolted on top.
Run the reference TermHub on your own server, deploy it to Cloudflare Durable Objects at the edge, or embed the core library inside an AI agent. The session model doesn't change.
CLI / Workflow
Serve the hub. Attach a client. Expose the MCP surface for AI agents. Every surface in uterm reduces to one of these three.
$ uv run uterm-server$ uv run uterm connect ws://127.0.0.1:27780/term --role viewer$ uv run uterm-mcp --transport stdio