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.

TETHER
~/projects/api
api-refactor CLAUDE
api-tests CLAUDE
~/projects/web
frontend CODEX
design-sys CLAUDE
~/infra
api-refactor · claude
$ 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
api-tests · claude
$ claude --resume abc123
 
● Claude test suite ready
 
▶ Waiting for permission:
  Run npm test in ~/projects/api?
 
  [Y]es / [N]o / [A]lways

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.

Everything shipped

Not a roadmap — these are all in the current release.
🖥️
Multi-Environment Sessions
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.
📊
Cost Tracking
Real-time usage across all sessions. Daily/weekly/monthly rollups, per-CLI and per-environment breakdowns, sparkline footer. CSV and JSON export.
Split Panes & Broadcast
Split into multiple panes. Keyboard-driven focus and swap. Broadcast input fans keystrokes to every selected pane simultaneously.
🔔
Status Detection
Hook-driven detection for "waiting for permission" and "idle" states. Desktop notifications surface what needs attention. Per-session mute.
🔒
Vault Integration
Reference secrets from HashiCorp Vault with vault:// URIs. Token and OIDC auth. Expiry warnings. No plaintext secrets in config.
📁
Repo Bootstrapping
Create folders, git init, and provision repos on GitHub, Gitea, or Azure DevOps — from the new session dialog.
Session Resume
Browse Claude and Codex transcripts and resume any past conversation, grouped by recency and working directory.
⌨️
Remappable Shortcuts
Every keyboard shortcut is user-remappable with reserved-chord warnings. Focus, split, swap, zoom, broadcast — all rebindable.

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

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.

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

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

7 palettes, full xterm support

Mocha
Macchiato
Frappé
Latte
Tether
Light
Brass
Tether logo
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