Local control plane for AI coding agents

Every agent on your machine. One place to run the fleet.

Stith reads the lifecycle hooks every Claude Code session already emits, plus transcripts and processes on disk, and tells you what each agent is doing, which account it is spending and which repository it holds. Then it acts on that: switch accounts before a quota runs out, queue two agents off the same repo, and reach any session from a browser, a terminal or a Stream Deck key.

  • Linux, macOS, Windows
  • Web dashboard + terminal app
  • Runs on 127.0.0.1
  • Private preview
Illustrations with example data. The web dashboard and the terminal app read the same backend, so a session shows the same state in both.
29Claude Code hook events, the full documented set, not just start and stop
Transcriptsread off disk in every config root, in every environment Stith finds
/procprocess liveness, so a session that never fired a hook still exists
Config dirsaccounts, profiles, hooks and settings, per directory

Why it exists

One agent is easy to watch. A dozen is not.

Spread across config roots, accounts and sometimes more than one environment, the failures are quiet. Stith is the layer above the agents that catches them.

  1. A session sits on a question nobody sees.

    Needs you tells a permission prompt from a question from an idle nudge, lists them on Waiting, and can alert you. An opt-in watcher can even accept plain “Yes” prompts that pass a denylist.

  2. An account burns its weekly quota on a background job.

    Usage polls every login’s five-hour and weekly windows, warns at your thresholds, and can switch a config dir to an account with headroom before the limit lands.

  3. Two agents rewrite the same file.

    Writers gives each repository one hold. Others queue behind it in order or fork to a worktree, and a hook can refuse a write that would collide.

What it does

Watch, govern and coordinate whatever is already running.

Stith never launches the agent and never becomes the terminal it lives in. It sees every session the hooks report, including the ones it did not start.

Live fleet status

Every session with its state and the evidence it came from: active, needs approval, idle, lingering, failed, stopped. When it cannot tell, it says so rather than guessing.

Accounts and quota

Usage per login, burn rate, overage and spend elsewhere. Thresholds, token auto-refresh, and auto-switch so a slot that runs dry moves to one with room.

One writer per repo

A FIFO queue per repository with stall clocks, a worktree fallback and deadlock detection. A stalled holder is a refusal with a way out, never a loop.

Search every transcript

Full-text search across every session in every config root, with a local trigram index for substrings and spelling correction. Ask which sessions an id, branch or ticket belongs to.

Saved sessions

Save a session as a docket that names it, says what it did and tracks what it left open. A rename engine titles untitled sessions, and resume reopens one in the right config dir.

Multiplexer aware

With herdr, Stith draws every space, tab and pane where it actually is, joins each pane to its session, and lets you focus, move or zoom them. Live, over herdr’s own event stream.

Also in the box

  • Watches poll a URL or a command and tell the waiting session when it changes.
  • Auto-unblock, off by default: presses Enter only on a plain “Yes” that passes the denylist, and logs every decision.
  • Ask, an assistant over your machine’s live state, using the Codex or Claude login you already have.
  • Hooks installed and removed across every config dir and environment from one page.
  • Statusline constructor, keybindings, env vars, MCP servers and memory, per profile.
  • Profiles compared side by side, created from another, or archived to a verified zip.

Two surfaces, one daemon

The browser or the terminal. Same pages, same state.

The web app and the Rust terminal app aim at parity, page for page, and a catalog records where each surface stands. The terminal is fully keyboard and mouse driven.

In the browser

  • Grid or table views, filters with live counts, and a detail panel per session.
  • Ctrl K jumps to any page; Ctrl J opens Ask from anywhere.
  • Light, dark or system, plus the Stith terracotta palette.
  • Served by the local backend at 127.0.0.1:24200. No reverse proxy or certificate needed.

How it works

Hooks in, one daemon in the middle, every surface out.

Stith runs as an always-on local backend. Agents report to it, it reads the rest off disk, and every surface talks to it over the same HTTP API.

Agents

Claude Code sessionsevery config root, Linux, WSL, macOS, Windows
Codex and other harnessesdetected by resolving the binary

Your machine

Stith backend 127.0.0.1:24200
  • live agent state
  • usage polling and auto-switch
  • repo claim queue
  • session rename engine
  • transcript search index
reads transcripts, /proc and config dirs

Surfaces

Web dashboard
Terminal app stith
Stith Deck on Stream Deck
herdr-stith plugin
Agents send 29 lifecycle hook events to the Stith backend at 127.0.0.1:24200, which also reads transcripts, processes and config directories. The web dashboard, the terminal app, the Stream Deck plugin and the herdr plugin all read from that backend over HTTP.

Local by default

The backend binds to your machine and keeps its data there. Keyword search is a local database; meaning-based ranking is optional and uses a local model when one is available.

Hooks are opt-in

First launch shows the Claude Code directories it found and installs hooks only in the ones you check. Install and removal are idempotent, and your other hooks are left alone.

Unknown is not zero

A quota it has not measured is unknown, never exhausted. A pane it cannot join says why. A state is claimed only once it is confirmed.

Install

One installer. Terminal app, backend, web app and launcher.

No repository checkout, Rust toolchain, npm or global Node needed: the installer brings a private runtime, verifies checksums and adds Stith to your app launcher.

  1. Sign in to GitHub CLI

    Releases are private during the preview, so the installer downloads through GitHub CLI. Sign in with an account that has access.

    Any system
    gh auth login
  2. Run the installer

    bash
    gh api repos/aylith-labs/stith/contents/install.sh \
      -H 'Accept: application/vnd.github.raw' > /tmp/stith-install.sh &&
    bash /tmp/stith-install.sh

    Installs ~/.local/bin/stith, an app-launcher entry on Linux (Omarchy included) and ~/Applications/Stith.app on macOS.

  3. Open Stith and connect

    Pick Stith from your launcher or run stith. A welcome page finds your Claude Code directories: Y connects the checked ones and opens the app, N opens without hooks, S leaves setup for later. The web app is at http://127.0.0.1:24200.