The open source infra layer between your local coding agents and messaging apps.
Tether runs on your machine and turns agent runs into something you can supervise from anywhere: a mobile friendly web UI plus messaging bridges (Telegram, Slack, Discord) with approvals, input prompts, and live output streaming.
If you're running Claude Code / Codex locally and you want supervision (logs, state, diffs, approvals) in the places you already work, this is that layer.
Claude Code / Codex / custom agent
| (adapter, MCP, or REST)
v
Tether (local control plane)
| |
v v
Web UI (PWA) Telegram/Slack/Discord
1. Start Tether on your machine (or a VM you control)
2. Open the web UI, or connect a messaging bridge
3. Run an agent session (Claude / Codex / custom)
4. Stream output + state in real time (web + messaging threads)
5. Approve tool use, provide input, or interrupt when needed
- A single place to observe every agent session (state, logs, diffs, approvals)
- Messaging native control: per session threads with approve and reject controls
- Human in the loop gates for risky operations (file writes, shell commands, etc.)
- A stable interface for agents: run via built in adapters, or connect via MCP or REST
- Local first: runs on your machine, your data stays yours
- Human in the loop: approve tool use, provide input, review diffs
- Observable: live streaming output and explicit session state (web and messaging)
- Messaging bridges: Telegram, Slack, and Discord with approvals and auto approve
- Multi adapter: Claude Code (OAuth or API key), Codex via sidecar, Pi coding agent (experimental), plus LiteLLM (experimental)
- External agent API: MCP server and REST API for custom agents and integrations
- Mobile first UI: PWA dashboard for monitoring and controlling sessions (experimental)
pipx install tether-ai
tether init
tether startThen open http://localhost:8787.
The init wizard generates an auth token, detects your claude CLI, and optionally
configures a messaging bridge. Config is saved to ~/.config/tether/config.env.
- Keep long running agent work accountable: audit output, diffs, and approvals after the fact
- Run an agent on a workstation or VM and supervise from your phone (web UI or messaging)
- Put approvals where your team already lives (Slack or Discord) instead of in a terminal
- Plug in your own agent: use MCP or REST to emit events and request approvals
git clone https://github.com/larsderidder/tether.git
cd tether
make install
cp .env.example .env
make startAny AI agent can connect to Tether to get human in the loop supervision. Two interfaces are available. Use whichever fits your agent tooling:
The MCP server exposes Tether as tools that any agent can call to register a session, stream output, and request human approval:
tether-mcp
# or: python -m tether.mcp_server.serverTools: create_session, send_output, request_approval, check_input.
Add to your agent's MCP config:
{
"mcpServers": {
"tether": {
"command": "tether-mcp"
}
}
}Install: pip install tether-ai[mcp]
For agents that don't support MCP, the same workflow is available via REST:
# Create a session
curl -X POST http://localhost:8787/api/sessions \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "My Task", "agent_type": "custom"}'
# Push output
curl -X POST http://localhost:8787/api/sessions/{id}/events \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"type": "output", "data": {"text": "Hello from agent"}}'
# Poll for human input
curl http://localhost:8787/api/sessions/{id}/events/poll?since_seq=0 \
-H "Authorization: Bearer $TOKEN"See docs/API_REFERENCE.md for full endpoint documentation.
Set TETHER_AGENT_ADAPTER in .env:
claude_auto: Auto detect (prefer OAuth, fallback to API key)claude_subprocess: Claude via Agent SDK in subprocess (CLI OAuth)claude_api: Claude Code via API keylitellm: Any model via LiteLLM (DeepSeek, Gemini, OpenRouter, etc.), experimentalcodex_sdk_sidecar: Codex via sidecarpi_rpc: Pi coding agent via JSON-RPC subprocess, experimental
Sessions can override the default adapter at creation time. Multiple adapters can run simultaneously.
Connect a messaging platform so you can monitor and control sessions from your phone. Configure
credentials in .env. The bridge starts automatically.
Platforms:
- Telegram:
TELEGRAM_BOT_TOKENplusTELEGRAM_FORUM_GROUP_ID(supergroup with topics) - Slack:
SLACK_BOT_TOKENplusSLACK_APP_TOKENplusSLACK_CHANNEL_ID - Discord:
DISCORD_BOT_TOKENplusDISCORD_CHANNEL_ID
- Set the platform env vars above (or run
tether initand let it guide you). - Start Tether:
tether start - In Telegram: run
/list, then/attach <number> - In Slack/Discord: run
!list, then!attach <number>
That creates a per session thread (topic or thread) where output streams live and approvals show up as buttons or text prompts.
Bridge features:
- Live output streaming to threads (one per session)
- Approval request controls with approve, reject, and always approve
- Auto approve with configurable tool patterns and duration
- Session listing, status updates, and input forwarding
Install bridge dependencies:
pip install tether-ai[telegram] # or [slack] or [discord]tether init # Interactive setup wizard
tether start # Start the server
tether start --dev # Dev mode (no auth required)
tether start --port 9000 --host 127.0.0.1
Tether loads config from layered sources (highest precedence first):
- Environment variables
- Local
.envfile (working directory) ~/.config/tether/config.env(created bytether init)
Key settings:
TETHER_AGENT_ADAPTER=claude_auto # Agent adapter
TETHER_AGENT_TOKEN= # Protect the API/UI with bearer auth
TETHER_AGENT_HOST=0.0.0.0 # Bind address (default: 0.0.0.0)
TETHER_AGENT_PORT=8787 # Port (default: 8787)See .env.example for the complete reference including adapter-specific settings, session
timeouts, logging, and bridge configuration.
make install # Install Python + Node dependencies
make start # Build UI and run agent
make dev-ui # Run UI dev server (hot reload); run agent separately
make test # Run pytest
make verify # Health checkSee AGENTS.md for full developer docs and docs/ for architecture documentation.
Apache 2.0