DOCS

Documentation

Learn to install, configure, and operate Tetherlab for multi-agent coordination.

Setup

Tetherlab is a coordination layer for multi-agent coding teams. A shim wraps each agent CLI, coaxes a plan from the agent before it acts, and submits that plan to a central master. The master detects conflicts while plans are still words — before a line of code lands.

Getting Started

The shim wraps your agent CLI, coaxes a plan before any action, and submits it to the master. The master detects conflicts at plan stage — before any code lands. The dashboard gives you a live view of intents, concepts, and conflicts.

Quick start

  1. Install the tether CLI:
    TERMINAL
    # Homebrew (macOS / Linux)
    brew install tetherlab/tap/tether
    
    # Or via install script
    curl -fsSL https://raw.githubusercontent.com/tetherlab/tether/main/install/install.sh | sh
  2. Sign in and configure:
    TERMINAL
    tether login
    tether init --global --developer alice

    This discovers your SSH key, writes ~/.tether/config.toml, and launches the onboarding wizard.

  3. Wrap your agent:
    TERMINAL
    tether wrap claude -p "Add a login endpoint"

Open the dashboard at /app/intents to watch your first intent arrive. The shim submits the plan, the master returns continue, stop, or revert.

Installation

TERMINAL
# Homebrew (macOS / Linux)
brew install tetherlab/tap/tether

# Install script (macOS / Linux)
curl -fsSL https://raw.githubusercontent.com/tetherlab/tether/main/install/install.sh | sh

# Install script (Windows)
irm https://raw.githubusercontent.com/tetherlab/tether/main/install/install.ps1 | iex

The install script verifies SHA-256 checksums and installs to ~/.tether/bin. Flags include --version, --no-modify-path, and --no-login.

Verify: tether --version and tether doctor.

Shim Setup

The shim reads two TOML config files. Per-project overrides global.

TOML~/.tether/config.toml (global)
developer = "alice"
master_url = "http://localhost:8080"
ssh_key_path = "/home/alice/.ssh/id_ed25519"
# workspace_id = ""   # set after first workspace bind
TOML.tether/config.toml (project)
developer = ""                        # inherited from global
master_url = "http://localhost:8080"  # inherited
workspace_id = "550e8400-..."         # bound by init

SSH key discovery precedence: ~/.ssh/id_ed25519 id_rsa id_ecdsa --ssh-key flag. Your SSH public key must be registered with Tetherlab.

Add .tether/ to .gitignore

The .tether/ directory contains local config. Add it to your gitignore.

Run tether init inside a git repo for project config. The onboarding wizard (tether onboard) walks through identity, workspace binding, and concept bootstrap. Verify with tether status and tether doctor.

Workspaces

Workspaces

A workspace is the coordination unit. Each workspace holds its own intents, concepts, conflicts, agent registrations, and a bare git clone. All coordination happens within a workspace boundary.

CommandDescription
tether workspace new --name <name>Create a workspace and bind local repo
tether workspace new --name <name> --from-remote <url>Create with a seed remote
tether workspace use --name <name>Bind to an existing workspace
tether clone <name> <dir>Clone and bind a workspace
tether pullPull with intent-annotated commit summary

Workspace membership is invite-based. An owner creates an invite from the dashboard at /app/workspace/settings. Members have roles: Owner (full control), Member (submit intents, resolve conflicts), Viewer (read-only).

Coordinating

Wrapping Agents

The shim intercepts the agent process at launch. Before the agent takes any action, the shim coaxes a plan from it, captures a worktree snapshot, and submits both as an intent. Execution proceeds only on continue.

ToolDispatch pathCoordination
Claude Coderun_coordinated_sessionJSONL transcript + hook injection
OpenCoderun_coordinated_serverHTTP server API
Anything elserun_passthroughPlain PTY, no coordination
TERMINAL
tether wrap claude -p "Refactor the auth middleware"
tether wrap opencode "Add rate limiting"
tether wrap --continuous claude     # multi-plan session
tether wrap npm test                # passthrough

Safety invariants

  • Pre-decision action gate — no agent action before master says continue
  • No fabricated intents — plan extraction failure exits without contacting master
  • Fail closed on identity — auth errors abort; concept resolve errors warn

Continuous Sessions

Add --continuous to keep the agent alive across multiple plans. After each completion the shim re-enters the planning phase. The agent conversation, context, and file state persist.

TERMINAL
tether wrap --continuous claude

The lifecycle: Plan → Decide (continue/stop/revert) → Execute → Complete (agent emits ::tether-done::) → Await next plan. End the session with ::tether-end-session::. Capped at 100 plans per session (TETHER_MAX_CONTINUOUS_PLANS).

During execution, the semantic diff watcher detects file writes outside the plan's concept scope and submits rescope intents.

MCP Server

An alternative integration path for agents that speak the Model Context Protocol. The agent calls MCP tools directly instead of being wrapped by the shim.

JSON~/.claude/claude_code_config.json
{
  "mcpServers": {
    "tether": {
      "command": "tether-mcp-server",
      "args": ["--continuous"]
    }
  }
}
ToolPurpose
tether.submit_planSubmit a plan as an intent
tether.respond_to_proposalsConfirm/reject concept proposals
tether.mark_executingSignal execution started
tether.mark_doneMark engagement done
tether.mark_stoppedMark engagement stopped
tether.end_sessionEnd the MCP session
FeatureShim (wrap)MCP Server
TransportPTY wrapperMCP tools over stdio
Worktree revertSupportedNot supported
Semantic diffFile watcherNot available
RescopeAutomaticManual (agent must submit)

How Coordination Works

Every wrap session runs through a 14-state machine in the shim.

Idle Authenticating PreparingAgent ExtractingPlan SubmittingIntent AwaitingMasterDecision Executing WatchingSemanticDiffs HandlingRescope AwaitingNextPlan Complete/Stopped/Reverted/Failed/Done

Each transition is gated. Auth must succeed before the agent spawns. Plan extraction must succeed before an intent is submitted. The master's decision must return before execution.

Master actionMeaningAgent behavior
continueNo conflicts. Execute.Agent proceeds normally.
stopConflict detected.Agent receives stop message. Shim pauses or exits.
revertConflict with existing changes.Shim restores agent-modified files from HEAD.

Conflicts are detected at plan stage, not merge time. When two agents submit intents touching overlapping concepts, the master flags a hard conflict. Overlapping file paths trigger a coarse conflict (tunable via TETHER_COORDINATE_NOT_BLOCK).

Fail-closed design

Auth failure → abort. Plan extraction failure → exit without contacting master. Master unreachable → agent does not spawn. Observability paths (concept resolution failures) warn but do not block.

Dashboard

Web Dashboard

The dashboard uses Supabase Auth (GitHub and Google OAuth) and maintains one WebSocket connection per mount for real-time updates. Workspace switches trigger socket reconnects. Events broadcast by the master update the SWR cache in place.

PageRouteDescription
Overview/app/overviewActivity feed, summary stats
Intents/app/intentsIntent history with filters
Concepts/app/conceptsConcept list and graph canvas
Conflicts/app/conflictsConflict list, collapsible cards
Agents/app/agentsAgent status list
Team/app/teamPer-agent work and roster
Inbox/app/inboxInvites and pending conflicts
Settings/app/workspace/settingsIdentity, invites, danger zone
Connection/app/workspace/connectionMaster URL connectivity

Design: Forest Clay dark theme (evergreen + clay + parchment). Poppins for UI, JetBrains Mono for code. 5-level elevation stack.

Desktop App

Tauri 2 + React 19 native app. Mirrors the web dashboard with React Router 7. The Rust backend imports tether-shim-core for local operations. IPC commands: config discovery, SSH identity, master health checks, agent log tailing, git status.

Distributed as .dmg (macOS) and .deb/.AppImage (Linux).

Concepts & Conflicts

Concepts

A concept is a named, semantically meaningful unit of code — "auth module", "rate limiter", "payment handler". Concepts bridge the gap between what an agent says it will change and what files will be modified. They enable intent resolution, conflict detection, and blast radius analysis.

Concept graph edges

Edge typeMeaning
realizesImplementation of an interface/contract
dependsUses or imports from another concept
modifiesChanges behavior of another concept
breaksKnown to break when source changes

When the LLM matcher detects concepts not yet in the registry, the master creates proposals and parks the engagement in blocked — the shim prompts the agent (via the developer) to confirm or reject. Duplicate concepts can be merged from the dashboard.

Conflicts

Tetherlab detects conflicts at plan time, before code is written. Overlapping concepts → hard conflict (losing intent gets stop/revert). Overlapping files → coarse conflict (advisory by default). No overlap → parallel execution.

Resolution flow: Conflict appears in dashboard and inbox → loser is blocked → developer resolves (continue/stop/revert/dismiss) → loser unblocks. The dashboard at /app/conflicts shows collapsible cards with winner/loser intents, overlapping concepts, and blast radius visualization. Bulk resolution is supported.

Gate variableValuesEffect
TETHER_COORDINATE_NOT_BLOCK0 / 1When 1, coarse file-path conflicts are advisory
TETHER_GRAPH_GATEadvisory / enforcing / offGraph-based conflict enforcement
TETHER_VERIFY_GATEoff / advisory / enforcingPost-merge verification gate

Reference

CLI Reference

The tether binary. All commands read config from ~/.tether/config.toml (global) and .tether/config.toml (project).

CommandDescription
tether loginSign in via browser (device authorization)
tether initCreate config file (global or per-project)
tether workspace newCreate and bind a workspace
tether workspace useBind to an existing workspace
tether wrap <tool>Run under the shim orchestrator
tether statusShow config, identity, and connectivity
tether doctor7 diagnostic checks (exit non-zero on failure)
tether onboardFirst-run interactive setup wizard
tether clone <name>Clone and bind a workspace
tether pullPull with intent-annotated commit summary
tether bootstrapScan repo for concepts (LLM or --graph)
tether daemon startStart background daemon
tether daemon stopStop background daemon
tether daemon statusShow daemon PID and status
tether graph dumpExport file dependency graph as JSON
tether memory bootstrapMine session history for memory
Env varDefaultPurpose
TETHER_WRAPPEDunsetPrevent recursive wrapping
TETHER_LOG_FILE~/.tether/shim.logOverride log path
TETHER_MAX_CONTINUOUS_PLANS100Max plans per session
TETHER_TRANSCRIPT_TIMEOUT_SECS600Claude transcript deadline
TETHER_BLOCKED_WAIT_SECS3600Max wait for unblock

Troubleshooting

Start with tether doctor. The shim writes logs to file only (not stderr) — check ~/.tether/shim.log.

SymptomLikely causeFix
Auth error before agent spawnsSSH key not registeredRegister your key on the Tetherlab dashboard
Silent exit after wrapPlan extraction timeoutCheck shim log; increase TETHER_TRANSCRIPT_TIMEOUT_SECS
Every intent returns stopConflict with executing intentCheck /app/conflicts; resolve
TETHER_WRAPPED errorRecursive wrappingExit inner session before wrapping again
Dashboard shows no dataWrong workspace selectedCheck the workspace picker in the sidebar
Semantic diff never rescopesFiles not mapped to conceptsConcepts must be created for your project files

Config & Ops

Config Reference

MapFileKey
Shim TOML~/.tether/config.tomldeveloper, master_url, ssh_key_path, workspace_id, cli_token

The MCP server reads the same TOML as the shim. CLI overrides: --continuous, --agent claude|opencode, --master-url, --workspace-id, --log-level.

TERMINALDirectory layout
~/.tether/
config.toml      # global config
shim.log          # shim logs (file-only)
mcp.log           # MCP server logs
daemon.sock       # Unix domain socket
daemon.pid        # PID file

my-project/.tether/
config.toml       # project config
hook-dispatch.txt # Claude hook buffer

Ready to wrap?

Local master, your first 100 intents, no card.

Get started