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
All 17 demos โ control channel, DeckMux, MCP, graphical sessions โ concatenated.
Featured demos
Each card opens a real recording produced by scripts/demos/record_*.py in the provide-uterm repo โ mp4 with playback-speed controls, or an asciinema cast that autoplays on scroll. 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, fleet operations, graphical consoles and tenant isolation share one inline control channel instead of a tangle of side-channels โ in four implementations that are tested against each other.
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
28 tools exposed over Model Context Protocol. Agents discover sessions, request hijack, place annotations, drive a graphical target, and join the DeckMux chat.
Graphical
Screenshot, click, drag and type against a remote desktop under the hijack lease that governs a PTY. Filtered VNC relay for humans, byte-identical PNG encoders across languages.
Fleet
Broadcast input across N sessions. Levenshtein-similarity deltas flag the outlier server immediately. Sequential mode halts on failure.
Isolation
Tenant scope comes from the authenticated principal, never a request body โ one is refused 422. Hosted deployments can refuse a tenant's reach into the operator's network.
Security
LocalProvider for RBAC, WebhookProvider for enterprise integration. Tunnel tokens are in-memory, IP-bound, and rotated automatically.
Parity
Python, Go, C# and TypeScript. Sixteen live cells โ every client against every server on a real socket โ each judged against the reference cell field for field.
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, TypeScript, Go and C# โ four independent implementations of the same DLE/STX framing, held to each other by a live conformance matrix. The same protocol 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`, with the hub behind the `uterm server` subcommand.
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, and the `uterm-mcp` server โ 28 tools for agents, covering sessions, hijack leases, fan-out, and the graphical surface.
provide-uterm-platform
Agent tierPTY connector, PAM auth, LD_PRELOAD capture, External Management Tier (`uterm-manager`).
provide-uterm-annotation
Annotation layerSession annotations as their own package, with a 100% coverage gate and a dedicated CI job.
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.
provide-uterm-ts
TypeScript runtimeThe hub ported to TypeScript โ services, lease routes, and the MCP tool surface, held to golden transcripts recorded off the Python reference.
provide-uterm-go
Go portStandalone Go implementation with its own module and toolchain โ outside the uv and npm workspaces, in the conformance matrix like every other port.
provide-uterm-csharp
C# portThe .NET implementation, canonical for the graphical-target registry and multi-tenancy, with its own quality gate.
Get Started
uterm ships a reference TermHub in Python, a TypeScript browser frontend, standalone Go and C# servers, a Python client SDK, and an MCP server for AI agents. Pick the surface that matches your harness โ a live conformance matrix holds them all to the same control channel.
Open the full quickstart โgit clone https://github.com/provide-io/provide-uterm.git
cd provide-uterm
uv sync --all-packages --all-extras --group dev
npm ci && npm run build:frontendRun TermHub on 127.0.0.1:8780
uv run uterm server \
--config scripts/uterm-server.example.toml
# Binds 127.0.0.1:8780, mode = "dev_token".
# Token: ~/.cache/uterm/dev_token.mcp.json (project) or ~/.claude.json (global)
{
"mcpServers": {
"uterm": {
"command": "uv",
"args": [
"--directory",
"/abs/path/to/provide-uterm",
"run",
"uterm-mcp",
"--url",
"http://127.0.0.1:8780"
]
}
}
}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 --config server.toml$ curl -H "Authorization: Bearer $(cat ~/.cache/uterm/dev_token)" http://127.0.0.1:8780/api/sessions$ uv run uterm-mcp --url http://127.0.0.1:8780