Tether
Session multiplexer for agentic CLI tools
One window for every AI coding session. Manage Claude Code, Codex, and more across local, SSH, and Coder workspaces — with raw PTY fidelity that never touches your output.
$ claude
● Claude analyzing src/auth/middleware.ts
I'll refactor the auth middleware to
separate token validation from session
management. This gives us:
1. Testable token validator
2. Pluggable session backends
3. Clean middleware composition
● Writing src/auth/validate.ts
$ claude --resume abc123
● Claude test suite ready
▶ Waiting for permission:
Run npm test in ~/projects/api?
[Y]es / [N]o / [A]lways
The problem
Terminals don't scale
AI coding agents are session-native — each runs in its own terminal, owns its own context, works at its own pace. Real work needs several running at once, often across different machines.
By the fourth tab you've lost track of which session is waiting, which is done, and what anything costs. SSH sessions live in separate windows. Coder workspaces need their own CLI. Tether puts every session, every machine, and every CLI tool into a single pane of glass — grouped by repo, split into panes, with cost tracking and status detection that tells you what needs attention.
Dumb pipe, smart shell.
Tether never parses, filters, or re-renders CLI output. The PTY stream flows byte-for-byte into xterm.js untouched — the same renderer VS Code uses. Status detection is a passive side-channel tap, never an interceptor. Your CLI experience is exactly what you'd get in a native terminal.
Capabilities
Everything shipped
Not a roadmap — these are all in the current release.
Run sessions on your local machine, over SSH to a Linux VM, or inside a Coder workspace — all from one window. Each environment has preconfigured settings. Pick an environment, pick a CLI, go.
Real-time usage across all sessions. Daily/weekly/monthly rollups, per-CLI and per-environment breakdowns, sparkline footer. CSV and JSON export.
Split into multiple panes. Keyboard-driven focus and swap. Broadcast input fans keystrokes to every selected pane simultaneously.
Hook-driven detection for "waiting for permission" and "idle" states. Desktop notifications surface what needs attention. Per-session mute.
Reference secrets from HashiCorp Vault with vault:// URIs. Token and OIDC auth. Expiry warnings. No plaintext secrets in config.
Create folders, git init, and provision repos on GitHub, Gitea, or Azure DevOps — from the new session dialog.
Browse Claude and Codex transcripts and resume any past conversation, grouped by recency and working directory.
Every keyboard shortcut is user-remappable with reserved-chord warnings. Focus, split, swap, zoom, broadcast — all rebindable.
Environments
One interface, any machine
All three transports implement the same interface — the UI is environment-agnostic.
💻
Local
Native PTY via node-pty. Full speed, zero latency.
NODE-PTY
🌐
SSH
Connect to any box. TOFU host key verification, optional sudo elevation.
SSH2 + KNOWN HOSTS
☁️
Coder
Connect to workspaces or create from templates via the Coder API.
CODER REST API
Architecture
Data flow
Main process owns PTYs. Renderer owns UI. The stream is never parsed.
Keystroke You type in the terminal pane
↕
xterm.js Captures input, renders output
↕
Electron IPC Commands + event channels
↕
Transport Adapter Local / SSH / Coder
↕
PTY stdin/stdout Raw byte stream
↕
CLI Tool Claude / Codex / OpenCode / Custom
↕
Status Detector Passive tap (copy, never intercept)
Transport adapters implement a common SessionTransport interface. Local, SSH, and Coder sessions look and behave identically to the UI. Status detection copies the PTY stream — it never sits in the data path.
Stack
Built with
Shell
Electron 41
Main process owns PTY lifecycle
Frontend
React 19 + TypeScript
Sidebar, panes, split layouts, dialogs
Terminal
xterm.js 6.0
Same renderer VS Code uses
Local PTY
node-pty
Native pseudo-terminal
Remote
ssh2 + Coder API
SSH with TOFU, Coder workspace exec
Secrets
HashiCorp Vault
KV v2, token + OIDC auth
CLI tools
Bring your agent
Tether is a dumb-pipe multiplexer — it doesn't depend on any one CLI.
Claude Code
Resume, transcripts, hooks, cost tracking
FULL
Codex CLI
Resume, transcripts, notify hooks, cost tracking
FULL
Copilot CLI
PTY + status detection. Cost blocked on upstream.
PTY
OpenCode
PTY, cost via crush.db
FULL
Custom
Any binary — you configure the command
PTY
Themes
7 palettes, full xterm support
Get Tether
v0.5.2-beta.3
Free and open source. Windows only for now — macOS and Linux are post-1.0.
Requires Node.js 20+ and at least one supported CLI tool.
MIT License · Electron + React + xterm.js