harnessly

module
v0.13.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 22, 2026 License: Apache-2.0

README

harnessly

The open core of a workspace for people and coding agents.
Claude Code and Codex run in tmux on your machines; harnessly knows what each of them is doing
and serves it all through one HTTP and WebSocket API.

CI Lint Go Reference Go Report Card OpenSSF Scorecard Go version Release License

Quick start · Ways to run · Docs · Architecture · Contributing


Why harnessly

  • Agents work where the code is. Claude Code and Codex run as the real CLIs in tmux panes on the machine, next to its repositories and tools, and keep running when nobody has a page open.
  • You always know what every agent is doing. A tab's state (busy, needs-input, ready-for-review, ...) is derived from the agent's hooks, status line, transcript, screen and process tree, and pushed live to every client.
  • Small static binaries, no inbound access. The runtime (one per person) and the machine agent (one per Unix account) are single Go binaries without cgo. The agent keeps one WebSocket link to the cluster and tunnels the rest, so nothing has to reach into the machine.
  • An API first. Workspaces, tabs, prompts, terminals, files and conversations are HTTP and WebSocket routes, so a web UI, a cluster or your own scripts drive the same thing.
  • Boards and documents beside the conversation. Agents draw on boards and publish to artifacts with the addresses and tokens the runtime gives them; their links open in a side pane of the page, signed in, next to the conversation that made them.
  • Runs the way you run things. A release binary, a systemd user service, a container, docker compose up for the whole workspace, a Helm chart or an Argo CD app of apps.
  • Moves in without a big bang. In gate mode the runtime sits in front of an older runtime and takes over one slice of routes at a time, each compared in shadow first. In standalone mode it needs nothing else.

Features

Agent tabs in tmux Claude Code, Codex and shells in tabs on the runtime's own tmux server; a terminal socket attaches a pty to any of them.
Live tab states One keeper for all tabs, fed by hooks, status line, transcripts, screens and the process tree; /api/status and /api/sync sockets.
Prompt delivery A per-tab queue that types messages and keys into an agent's pane, long prompts through an editor hand-off.
Launch and resume Starts conversations with the runtime's hooks and settings, resumes agents that were working after a restart or a tmux reset.
Idle sleep and push Stops Claude agents idle too long to free memory (the next prompt resumes them); web push when a turn ends or an agent asks.
Conversations A timeline socket over the agents' transcripts, token and cost economics, subagents, turn checkpoints as git snapshots.
Files and git Editor reads and saves, changed files and diffs, uploads, a repository sync with its upstream.
Usage and limits Usage reports and statistics from the transcripts, provider limits with a forecast, machine load.
Preview proxy A reverse proxy for dev servers with a DevTools record that agents can read through an MCP server.
Machine agent Transcripts, state files with versioned writes, socket relay and TCP tunnels over a single WebSocket link.
Gate and shadow Per-machine slice switches re-read every second, shadow comparison of answers, per-path proxy statistics.
Web page Sign-in, workspaces, split panes with terminal and agent tabs, the conversation with live state, the machine's load; compiled into release runtimes.
Boards and documents Agents get BOARDS_URL, ARTIFACTS_URL, tokens and their conversation id; board and document links become chips that open in a side pane, which also lists the conversation's documents.
Ways to run Dockerfile, docker compose with boards and artifacts (MinIO optional), a Helm chart, Argo CD examples, a systemd unit and make targets.
Byte-for-byte compatible Status codes, JSON key order, headers and ETags pinned by golden tests recorded from the previous implementation.

Quick start

You need Go (the version in go.mod), tmux, curl and jq, on Linux or macOS.

git clone https://github.com/ly-solutions/harnessly.git
cd harnessly
make build                     # bin/runtime, bin/agent, bin/agentprobe

Run the runtime standalone against a throwaway home and its own tmux server, so nothing of yours is touched:

export DEMO_HOME=$(mktemp -d)
HOME=$DEMO_HOME RUNTIME_GATE_LISTEN=127.0.0.1:4321 RUNTIME_TMUX_SOCKET=harnessly-demo \
  ./bin/runtime > "$DEMO_HOME/runtime.log" 2>&1 &
sleep 1
curl -s 127.0.0.1:4321/api/health
{"app":"harnessly","version":"0.0.0-development","commit":null}

On its first start the runtime wrote its config, the hook scripts and a cli-token into $DEMO_HOME/.harnessly. Use the token to make a workspace and open a terminal tab in it:

TOKEN=$(cat "$DEMO_HOME/.harnessly/cli-token")
API=(-s -H "x-cli-token: $TOKEN" -H "content-type: application/json")
mkdir "$DEMO_HOME/project"

WS=$(curl "${API[@]}" 127.0.0.1:4321/api/workspace \
  -d "{\"name\":\"demo\",\"directory\":\"$DEMO_HOME/project\"}" | jq -r .id)

curl "${API[@]}" 127.0.0.1:4321/api/cli/tabs -d "{\"workspaceId\":\"$WS\",\"name\":\"shell\"}" \
  | tee "$DEMO_HOME/tab.json" | jq .
{
  "tabId": "tab-zLTjzM",
  "workspaceId": "ws--i5OEb",
  "paneId": "pane-dnZ6sA",
  "sessionName": "hs-ws--i5OEb-pane-dnZ6sA-tab-zLTjzM",
  "name": "shell",
  "panelType": "terminal",
  "agentProviderId": null,
  "agentSessionId": null
}

Type into the tab and read its screen back:

TAB=$(jq -r .tabId "$DEMO_HOME/tab.json")
curl "${API[@]}" "127.0.0.1:4321/api/cli/tabs/$TAB/send?workspaceId=$WS" -d '{"content":"echo hello from tmux\n"}'; echo
sleep 1
curl "${API[@]}" "127.0.0.1:4321/api/cli/tabs/$TAB/result?workspaceId=$WS" | jq -r .content | grep -x 'hello from tmux'
{"status":"sent"}
hello from tmux

The tab is a real tmux session: tmux -L harnessly-demo attach shows it. Start the machine agent next to the runtime; it finds the runtime's secret in the same data directory and reports the version make build took from git describe:

HOME=$DEMO_HOME AGENT_PORT=4322 RUNTIME_PORT=4321 ./bin/agent > "$DEMO_HOME/agent.log" 2>&1 &
sleep 1
curl -s 127.0.0.1:4322/healthz
{"ok":true,"version":"0.9.0-18-g5c434a4"}

Clean up:

kill %1 %2
tmux -L harnessly-demo kill-server >/dev/null 2>&1
rm -rf "$DEMO_HOME"

To run an agent instead of a shell, start the runtime with your own HOME (where Claude Code and Codex keep their logins) and ask for a claude-code or codex-cli tab, with a first prompt or without one: {"workspaceId":"…","panelType":"claude-code","prompt":"…"}. The tab's cliState in /api/cli/tabs/<tab>/status then follows the agent's turn, from busy to ready-for-review.

More in Getting started.

Ways to run

make run                          # the runtime with the page on http://127.0.0.1:8022, data in ~/.harnessly
docker compose up -d --build      # harnessly + boards + artifacts, built here, on http://localhost:8022
helm install ada deploy/helm/harnessly --set ownerName=Ada
Plain commands make run, or a release binary: RUNTIME_GATE_LISTEN=127.0.0.1:8022 RUNTIME_GATE_UPSTREAM= ./runtime
systemd make install install-systemd, then systemctl --user enable --now harnessly — one service per Unix account; agents keep working through restarts
Docker docker build -t harnessly . (--target with-agents adds Claude Code and Codex), the home folder on a volume
docker compose compose.yaml: the whole workspace on one host, boards and documents wired in; MinIO as an option
Kubernetes deploy/helm/harnessly: a StatefulSet per person with a PVC for its home
Argo CD deploy/argocd: one Application, or an app of apps with boards and artifacts

All of them, how to give the runtime the agent CLIs and how to put it on a public server (three hostnames, Caddy, automatic TLS) are in docs/deploy.md. Nothing is published as an image yet: compose and Docker build locally, docker compose up -d --build.

The web page

web/ is the agents workspace in the browser: conversations with Claude Code and Codex in a sidebar with projects and pins, each agent's timeline (turns, tool runs, plans, questions) with a composer that takes slash commands, files, context and dictation, and a right pane with the terminal, a browser for the machine's dev servers, files, changes, documents and boards (integrations), GitHub and GitLab, subagents and the session's cost. English by default, Russian with RUNTIME_LOCALE=ru. Release runtimes carry it; it is served at RUNTIME_APP_BASE_PATH (default /agents, and / redirects there):

make runtime-web               # pnpm build in web/, then bin/runtime with the page compiled in
HOME=$(mktemp -d) RUNTIME_GATE_LISTEN=127.0.0.1:4321 ./bin/runtime &
xdg-open http://127.0.0.1:4321/   # the first visit sets the machine's password

make web-check runs what CI runs for the page; make web-browser-test drives it in headless Chrome against a standalone runtime with stand-in agents (with E2E_BOARDS_DIR and E2E_ARTIFACTS_DIR naming checkouts of boards and artifacts, the side pane too). See the page's settings.

Architecture

flowchart LR
    ui["Web UI"] --> hub["Cluster"]
    hub <-->|"WebSocket /v1"| agent["agent"]
    agent -->|"tunnels, socket relay"| gate["runtime gate"]
    gate --> core["core slice<br/>tab states · layouts · prompts · hooks"]
    gate --> slices["other slices<br/>terminal · files · conversations · ..."]
    gate -.->|"gate mode: routes not switched on"| old[("previous runtime")]
    core --> tmux["tmux panes<br/>Claude Code · Codex · shell"]
    tmux -->|"hooks, status line"| gate

A request reaches the runtime gate on the runtime's port. The gate answers every route whose slice is on; in gate mode the rest goes to the previous runtime, in standalone mode there is no previous runtime and every slice is on. The core keeps the tabs: it starts tmux sessions, types prompts, and learns each agent's state from its hooks and files. The machine agent is the machine's only link to the cluster. Details in docs/architecture.md.

Documentation

Getting started build, run standalone, open tabs, run agents, connect the machine agent
Architecture the runtime gate, the core, tmux, the machine agent, the repository layout
Slices every slice of routes, switching them per machine, the shadow comparison
Configuration every RUNTIME_* and AGENT_* variable
Deploy plain commands, systemd, Docker, docker compose, Helm, Argo CD
Integrations boards, artifacts and the agent skills
Contributing development setup, tests and golden files, commit convention

Status

harnessly is young and moving fast; versions are 0.x and the API follows the previous runtime it replaces.

  • Here now: the machine runtime, with every route of the previous runtime in Go, gate and standalone modes, the machine agent (wire protocol v1), the web page on the project's own UI kit, and the boards and artifacts integrations.
  • Coming: the cluster side (many machines and people behind one page), and the services' webhooks (board comments routed to agents, live document updates).

Follow the changelog and the releases.

Contributing

Issues and pull requests are welcome. Read CONTRIBUTING.md first; make help lists the developer tasks. Please report security problems privately, as SECURITY.md describes. Everyone taking part follows the Code of Conduct.

Acknowledgements

harnessly stands on tmux and drives Claude Code and Codex. It uses coder/websocket, creack/pty, fsnotify, goldmark, BurntSushi/toml and dlclark/regexp2.

License

Apache License 2.0.

Directories

Path Synopsis
cmd
agent command
Command agent is the machine agent: it serves one Unix account's transcripts, runtime state and loopback services to the cluster over a single WebSocket link.
Command agent is the machine agent: it serves one Unix account's transcripts, runtime state and loopback services to the cluster over a single WebSocket link.
agentprobe command
Command agentprobe talks to a machine agent the way the cluster does.
Command agentprobe talks to a machine agent the way the cluster does.
harnessly command
Command harnessly is what an agent in a harnessly tab calls to show things in the person's right pane and to work with the workspace's other tabs.
Command harnessly is what an agent in a harnessly tab calls to show things in the person's right pane and to work with the workspace's other tabs.
runtime command
Command runtime is the per-person runtime on a machine, being moved here a slice at a time.
Command runtime is the per-person runtime on a machine, being moved here a slice at a time.
internal
agentdetect
Package agentdetect tells whether a coding agent (Claude Code, Codex) runs in a tab's terminal, which conversation it is in and whether that conversation can be resumed from its transcript: the check-agent answer, read the way the previous runtime read it, on top of internal/agents/claude and internal/agents/codex.
Package agentdetect tells whether a coding agent (Claude Code, Codex) runs in a tab's terminal, which conversation it is in and whether that conversation can be resumed from its transcript: the check-agent answer, read the way the previous runtime read it, on top of internal/agents/claude and internal/agents/codex.
agents
Package agents holds what the coding agents the runtime drives (Claude Code in internal/agents/claude, Codex in internal/agents/codex) have in common: the session a pane runs, the work-state events their hooks translate to, the snapshot of a transcript's tail, the stats of a finished turn, and the pieces of a launch line.
Package agents holds what the coding agents the runtime drives (Claude Code in internal/agents/claude, Codex in internal/agents/codex) have in common: the session a pane runs, the work-state events their hooks translate to, the snapshot of a transcript's tail, the stats of a finished turn, and the pieces of a launch line.
agents/claude
Package claude is the runtime's side of Claude Code: whether it runs in a pane and which conversation, what its transcript says about the turn, what its hooks mean, and the command line that starts or resumes it.
Package claude is the runtime's side of Claude Code: whether it runs in a pane and which conversation, what its transcript says about the turn, what its hooks mean, and the command line that starts or resumes it.
agents/codex
Package codex is the runtime's side of the OpenAI Codex CLI: whether it runs in a pane and which session, what its rollout transcript says about the turn, what its hook payloads mean, and the launcher line and arguments that start or resume it.
Package codex is the runtime's side of the OpenAI Codex CLI: whether it runs in a pane and which session, what its rollout transcript says about the turn, what its hook payloads mean, and the launcher line and arguments that start or resume it.
agentskills
Package agentskills installs the skills agents use in a harnessly workspace, for both Claude Code and Codex: the workspace skill (the harnessly command), the boards skill when a boards server is configured, and the artifacts skill when an artifacts catalog is.
Package agentskills installs the skills agents use in a harnessly workspace, for both Claude Code and Codex: the workspace skill (the harnessly command), the boards skill when a boards server is configured, and the artifacts skill when an artifacts catalog is.
background
Package background tells which background work an agent conversation still has running — shells, monitors, async agents and pending wakeups started from its transcript — reconciled with the agent's own footer, and keeps that list current for every live tab.
Package background tells which background work an agent conversation still has running — shells, monitors, async agents and pending wakeups started from its transcript — reconciled with the agent's own footer, and keeps that list current for every live tab.
catalog
Package catalog reads, from the machine's files, what a composer offers for an agent CLI (Claude Code or Codex): its slash commands and skills for a folder, and the models and reasoning efforts it can be started with.
Package catalog reads, from the machine's files, what a composer offers for an agent CLI (Claude Code or Codex): its slash commands and skills for a folder, and the models and reasoning efforts it can be started with.
checkpoints
Package checkpoints keeps per-conversation snapshots of a working folder in a shadow git repository (one per tab and folder, under the runtime's data folder) and returns the folder to one of them.
Package checkpoints keeps per-conversation snapshots of a working folder in a shadow git repository (one per tab and folder, under the runtime's data folder) and returns the folder to one of them.
checkpoints/scripttest
Package scripttest replays the scripted cases the previous runtime's modules ran (the golden files of the checkpoint store and of the routes over git): the same file and git actions in a temporary folder, and the same dumps of a working folder and a shadow repository, so a Go test compares like with like.
Package scripttest replays the scripted cases the previous runtime's modules ran (the golden files of the checkpoint store and of the routes over git): the same file and git actions in a temporary folder, and the same dumps of a working folder and a shadow repository, so a Go test compares like with like.
codemode
Package codemode reads the JavaScript Codex sends to its "exec" tool in code mode and says in plain words what the script does.
Package codemode reads the JavaScript Codex sends to its "exec" tool in code mode and says in plain words what the script does.
coreapi
Package coreapi answers the HTTP routes of the core slice that drive the tab state keeper: the agents' hook reports, a launch typed by the page, the recovery of a tab whose state is unknown, killing and resuming a conversation's agent, and the device visibility the web push sender reads.
Package coreapi answers the HTTP routes of the core slice that drive the tab state keeper: the agents' hook reports, a launch typed by the page, the recovery of a tab whose state is unknown, killing and resuming a conversation's agent, and the device visibility the web push sender reads.
coreapi/layoutapi
Package layoutapi answers the core slice's routes over layouts, workspaces, the CLIs' tab commands and the right pane's bridges, the way the previous runtime's API answered them: its route table and precedence, its sign-in check, its body parsing (1 MB, "Invalid JSON", 413), its JSON with ETag and 304, and each handler's statuses and texts.
Package layoutapi answers the core slice's routes over layouts, workspaces, the CLIs' tab commands and the right pane's bridges, the way the previous runtime's API answered them: its route table and precedence, its sign-in check, its body parsing (1 MB, "Invalid JSON", 413), its JSON with ETag and 304, and each handler's statuses and texts.
design
Package design is the design library of a machine: projects of a design tool kept as plain folders, listed, served to the right panel's browser by a small loopback server, checked in a headless browser, claimed board by board by the agents that edit them and saved to a private history.
Package design is the design library of a machine: projects of a design tool kept as plain folders, listed, served to the right panel's browser by a small loopback server, checked in a headless browser, claimed board by board by the agents that edit them and saved to a private history.
designkit
Package designkit keeps UI kits of the design library by version: a kit (stylesheets, scripts, fonts, docs) is installed once as a folder <kits>/<id>/<version>/ and every project loads it from /kit/<id>/<version>/...
Package designkit keeps UI kits of the design library by version: a kit (stylesheets, scripts, fonts, docs) is installed once as a folder <kits>/<id>/<version>/ and every project loads it from /kit/<id>/<version>/...
economics
Package economics is the tokens, time and list-price cost of one agent conversation, read from its transcripts on demand.
Package economics is the tokens, time and list-price cost of one agent conversation, read from its transcripts on demand.
files
Package files answers the runtime's read-only file routes: a file of a tab's project for the editor, both sides of a changed file, a picture or document the agent produced, the «@»-context picker, a memory note the agent cited and an uploaded attachment.
Package files answers the runtime's read-only file routes: a file of a tab's project for the editor, both sides of a changed file, a picture or document the agent produced, the «@»-context picker, a memory note the agent cited and an uploaded attachment.
gate
Package gate is the runtime gate: the process on the runtime's port.
Package gate is the runtime gate: the process on the runtime's port.
gitread
Package gitread answers the read-only git questions about a tab's working folder and a repository on this machine: branch, status, the working diff, a commit's diff and the commit log.
Package gitread answers the read-only git questions about a tab's working folder and a repository on this machine: branch, status, the working diff, a commit's diff and the commit log.
gitsync
Package gitsync brings a tab's repository in line with its upstream, as the diff panel's sync button asks: fetch with prune, a fast-forward pull when behind, a push when ahead; a failed step is classified for the page.
Package gitsync brings a tab's repository in line with its upstream, as the diff panel's sync button asks: fetch with prune, a fast-forward pull when behind, a push when ahead; a failed step is classified for the page.
history
Package history keeps what the core remembers about finished turns: session-history.json, the newest 200 turns for the notification list, and session-stats/<id>.json, the last statusline figures of each agent session.
Package history keeps what the core remembers about finished turns: session-history.json, the newest 200 turns for the notification list, and session-stats/<id>.json, the last statusline figures of each agent session.
hlcli
Package hlcli is the harnessly command: what an agent running in a harnessly tab calls to show things to the person in the right pane, to look at the workspace's tabs, and to hand work to another agent.
Package hlcli is the harnessly command: what an agent running in a harnessly tab calls to show things to the person in the right pane, to look at the workspace's tabs, and to hand work to another agent.
hooksetup
Package hooksetup writes the files the coding agents call the runtime through: the port file, the status hook and status line scripts Claude Code runs, the Codex hook script, the `--settings` file with the hooks, the MCP config, the prompt editor Claude gets as VISUAL, and the Codex launcher.
Package hooksetup writes the files the coding agents call the runtime through: the port file, the status hook and status line scripts Claude Code runs, the Codex hook script, the `--settings` file with the hooks, the MCP config, the prompt editor Claude gets as VISUAL, and the Codex launcher.
integrations
Package integrations connects the runtime to the sibling services people and agents share with it: a boards server (whiteboards) and an artifacts catalog (documents).
Package integrations connects the runtime to the sibling services people and agents share with it: a boards server (whiteboards) and an artifacts catalog (documents).
integrations/github
Package github reads issues and pull requests from GitHub (or GitHub Enterprise) for the page: an issue as a task card and tab, an issue or a pull request link as a chip.
Package github reads issues and pull requests from GitHub (or GitHub Enterprise) for the page: an issue as a task card and tab, an issue or a pull request link as a chip.
jscompat
Package jscompat reproduces the few JavaScript behaviours the runtime's answers depend on — string trimming and length in UTF-16 units, parseInt, Date parsing and printing, truthiness of JSON values, Node's query strings and path.basename — so a route moved to Go answers byte for byte as the one it replaces.
Package jscompat reproduces the few JavaScript behaviours the runtime's answers depend on — string trimming and length in UTF-16 units, parseInt, Date parsing and printing, truthiness of JSON values, Node's query strings and path.basename — so a route moved to Go answers byte for byte as the one it replaces.
jsvalue
Package jsvalue holds JSON the way JavaScript does: objects keep their key order and every key they were given, so a document read, changed and written back carries the fields nobody here models, in the order the previous runtime wrote them, and Stringify writes what JSON.stringify writes.
Package jsvalue holds JSON the way JavaScript does: objects keep their key order and every key they were given, so a document read, changed and written back carries the fields nobody here models, in the order the previous runtime wrote them, and Stringify writes what JSON.stringify writes.
launch
Package launch starts and resumes agent conversations the platform's way: a tab in a workspace's first pane, the agent CLI's launch line with its environment and initial prompt typed into it, the tab's metadata, and the keeper told that a launch is under way.
Package launch starts and resumes agent conversations the platform's way: a tab in a workspace's first pane, the agent CLI's launch line with its environment and initial prompt typed into it, the tab's metadata, and the keeper told that a launch is under way.
limits
Package limits keeps the machine's subscription limits: rate-limits.json, one entry per provider merged field by field from every source that measures them (the agent's statusline, codexbar, Codex's usage endpoint, the Codex transcript), its watcher, and limits-history.jsonl for the burn-rate forecast.
Package limits keeps the machine's subscription limits: rate-limits.json, one entry per provider merged field by field from every source that measures them (the agent's statusline, codexbar, Codex's usage endpoint, the Codex transcript), its watcher, and limits-history.jsonl for the burn-rate forecast.
locale
Package locale picks the language of the texts the runtime shows people — the errors and hints its routes answer with — by RUNTIME_LOCALE: "en" (the default) or "ru", the language the previous runtime answered in.
Package locale picks the language of the texts the runtime shows people — the errors and hints its routes answer with — by RUNTIME_LOCALE: "en" (the default) or "ru", the language the previous runtime answered in.
machine
Package machine answers what the runtime reads from the machine itself: processes, the Claude Code session files, a tab's working folder.
Package machine answers what the runtime reads from the machine itself: processes, the Claude Code session files, a tab's working folder.
machines
Package machines answers what a runtime says about its machine: the machine snapshot (load, provider limits with their forecast, features, release), the machine load panel, the health probe and the app manifest, and the web push subscription routes.
Package machines answers what a runtime says about its machine: the machine snapshot (load, provider limits with their forecast, features, release), the machine load panel, the health probe and the app manifest, and the web push subscription routes.
messagecounts
Package messagecounts counts the messages of a Claude Code or Codex transcript the way the previous runtime's timeline/message-counts route did: user, assistant and tool messages, and the tools by name.
Package messagecounts counts the messages of a Claude Code or Codex transcript the way the previous runtime's timeline/message-counts route did: user, assistant and tool messages, and the tools by name.
nodejson
Package nodejson writes JSON byte for byte as the previous runtime did (JavaScript's JSON.stringify) and gives an answer the ETag that runtime's dispatcher put on it, so a page's conditional request keeps working across the switch.
Package nodejson writes JSON byte for byte as the previous runtime did (JavaScript's JSON.stringify) and gives an answer the ETag that runtime's dispatcher put on it, so a page's conditional request keeps working across the switch.
paneintents
Package paneintents keeps what an agent asked its right pane to show, with the conversation rather than sent to a page that may not be there: the page that shows the conversation applies it when it does, now or hours later, on any device.
Package paneintents keeps what an agent asked its right pane to show, with the conversation rather than sent to a page that may not be there: the page that shows the conversation applies it when it does, now or hours later, on any device.
panel
Package panel is what an agent may ask of the right pane of its own tab and what the pane answers: the command parser, the cleaning of a page's answer, and the bridge that carries a command to the person's page over the sync socket and the answer back to the agent that waits for it.
Package panel is what an agent may ask of the right pane of its own tab and what the pane answers: the command parser, the cleaning of a page's answer, and the bridge that carries a command to the person's page over the sync socket and the answer back to the agent that waits for it.
pluginreload
Package pluginreload carries a change of the person's Claude Code plugins and skills into the Claude tabs that run.
Package pluginreload carries a change of the person's Claude Code plugins and skills into the Claude tabs that run.
preflight
Package preflight checks the tools the runtime needs on the machine — tmux, git, Claude Code, Codex — the way the person's own login shell finds them.
Package preflight checks the tools the runtime needs on the machine — tmux, git, Claude Code, Codex — the way the person's own login shell finds them.
preview
Package preview is the reverse proxy behind the right pane's browser: a slot origin of the gateway shows a local dev server port (with its neighbour ports) or an external site, named by a claim the gateway signs with the pair's secret.
Package preview is the reverse proxy behind the right pane's browser: a slot origin of the gateway shows a local dev server port (with its neighbour ports) or an external site, named by a claim the gateway signs with the pair's secret.
preview/devtools
Package devtools is the DevTools record of the preview slots: what a slot's page did on the network and in its console, and the conditions it runs under (throttling, blocked addresses, cache).
Package devtools is the DevTools record of the preview slots: what a slot's page did on the network and in its console, and the conditions it runs under (throttling, blocked addresses, cache).
preview/ports
Package ports lists the dev servers a preview can open (the listeners of this machine grouped by the conversation's work folders and the agents' worktrees) and maps a component picked in a preview to its source files.
Package ports lists the dev servers a preview can open (the listeners of this machine grouped by the conversation's work folders and the agents' worktrees) and maps a component picked in a preview to its source files.
preview/weburl
Package weburl parses URLs the way browsers and Node's URL class do (the WHATWG URL standard) for the http(s) and ws(s) schemes the preview deals with: lowercase scheme and host, default port dropped, dot segments resolved, the same characters percent-encoded.
Package weburl parses URLs the way browsers and Node's URL class do (the WHATWG URL standard) for the http(s) and ws(s) schemes the preview deals with: lowercase scheme and host, default port dropped, dot segments resolved, the same characters percent-encoded.
pricing
Package pricing is the API price of tokens, per model, for Claude and OpenAI models: what a conversation would have cost at list prices.
Package pricing is the API price of tokens, per model, for Claude and OpenAI models: what a conversation would have cost at list prices.
proc
Package proc reads the process table of this machine: a process's children and descendants, its command line, environment, working folder and start time, the TCP ports a process tree listens on, and memory pressure.
Package proc reads the process table of this machine: a process's children and descendants, its command line, environment, working folder and start time, the TCP ports a process tree listens on, and memory pressure.
prompts
Package prompts types a person's messages and keys into an agent's tmux pane: the per-tab prompt queue and its delivery, steering a message into a running turn, "send now", the composer's text route (through Claude's external editor or a paste, or Codex's watched submit), the slash-command runner with its model and effort confirmation, the menu mirror, AskUserQuestion answers, and the registry that keeps one message from being typed twice.
Package prompts types a person's messages and keys into an agent's tmux pane: the per-tab prompt queue and its delivery, steering a message into a running turn, "send now", the composer's text route (through Claude's external editor or a paste, or Codex's watched submit), the slash-command runner with its model and effort confirmation, the menu mirror, AskUserQuestion answers, and the registry that keeps one message from being typed twice.
push
Package push sends the web push notifications of the runtime: a finished turn or a question of an agent, to the person's subscribed browsers (RFC 8030 delivery, RFC 8291 message encryption, RFC 8292 VAPID).
Package push sends the web push notifications of the runtime: a finished turn or a question of an agent, to the person's subscribed browsers (RFC 8030 delivery, RFC 8291 message encryption, RFC 8292 VAPID).
runlock
Package runlock is the single-instance lock of a machine's runtime: a file in the data folder naming the process that holds it and its port.
Package runlock is the single-instance lock of a machine's runtime: a file in the data folder naming the process that holds it and its port.
screen
Package screen reads what a coding agent's terminal UI (Claude Code, Codex) shows in a captured tmux pane: whether it is working, which menu or permission prompt is open, what the input line holds, whether a queued message waits, and which keys answer an AskUserQuestion dialog.
Package screen reads what a coding agent's terminal UI (Claude Code, Codex) shows in a captured tmux pane: whether it is working, which menu or permission prompt is open, what the input line holds, whether a queued message waits, and which keys answer an AskUserQuestion dialog.
services
Package services answers the runtime's routes that only call external services with the person's tokens: a session's pushes and merge requests on GitLab, a merge request or commit with its diff, link previews (tracker issues, merge requests, published documents), tracker avatars, project keys and task cards, and site icons.
Package services answers the runtime's routes that only call external services with the person's tokens: a session's pushes and merge requests on GitLab, a merge request or commit with its diff, link previews (tracker issues, merge requests, published documents), tracker avatars, project keys and task cards, and site icons.
sessions
Package sessions lists the conversations Claude Code and Codex keep on disk for a working folder, as the runtime's conversation lists show them.
Package sessions lists the conversations Claude Code and Codex keep on disk for a working folder, as the runtime's conversation lists show them.
settings
Package settings keeps the runtime's settings files as the previous runtime did: the person's preferences in the config file (with the pair's secret and the automation token beside them), keyboard shortcuts, quick prompts, sidebar items and each workspace's sent messages.
Package settings keeps the runtime's settings files as the previous runtime did: the person's preferences in the config file (with the pair's secret and the automation token beside them), keyboard shortcuts, quick prompts, sidebar items and each workspace's sent messages.
share
Package share is the owner's conversation snapshots and the read-only links published from them: a redacted draft of a conversation's transcript, its page and Markdown, the links' store and the page a colleague opens through the platform's share route.
Package share is the owner's conversation snapshots and the read-only links published from them: a redacted draft of a conversation's transcript, its page and Markdown, the links' store and the page a colleague opens through the platform's share route.
sidechat
Package sidechat answers a quick question about an agent tab's Claude session from a fork that is never saved: the main conversation does not change and the agent may be busy.
Package sidechat answers a quick question about an agent tab's Claude session from a fork that is never saved: the main conversation does not change and the agent may be busy.
sleep
Package sleep puts idle agents to sleep: an idle Claude holds a few hundred megabytes with its MCP bridges whatever it does, and a machine that never lets one go runs out of memory.
Package sleep puts idle agents to sleep: an idle Claude holds a few hundred megabytes with its MCP bridges whatever it does, and a machine that never lets one go runs out of memory.
sockets
Package sockets serves the runtime's JSON sockets: /api/status (tab states, background work, the prompt queue, pane intents, limits) and /api/sync (layout and workspace changes, toasts and commands to the page).
Package sockets serves the runtime's JSON sockets: /api/status (tab states, background work, the prompt queue, pane intents, limits) and /api/sync (layout and workspace changes, toasts and commands to the page).
sources
Package sources is what a whole conversation refers to, read from its transcript the way the previous runtime's conversation sources route did: the links of the agent's answers (documents, merge requests, tracker issues and the rest of the web) and the filesystem paths it worked with.
Package sources is what a whole conversation refers to, read from its transcript the way the previous runtime's conversation sources route did: the links of the agent's answers (documents, merge requests, tracker issues and the rest of the web) and the filesystem paths it worked with.
state
Package state keeps the runtime's workspace list (`workspaces.json`) and each workspace's layout (`workspaces/<id>/layout.json`): reads with their normalisation, atomic writes in the bytes the previous runtime wrote, the commit of every change to the cluster when the cluster owns the pair's state, the changes the cluster makes, and the tree and tab operations behind the layout and workspace routes.
Package state keeps the runtime's workspace list (`workspaces.json`) and each workspace's layout (`workspaces/<id>/layout.json`): reads with their normalisation, atomic writes in the bytes the previous runtime wrote, the commit of every change to the cluster when the cluster owns the pair's state, the changes the cluster makes, and the tree and tab operations behind the layout and workspace routes.
stats
Package stats answers the usage statistics pages (/api/stats/*) from this machine's Claude Code and Codex files, as the previous runtime's handlers did: the same answers, the same cache files under the data folder, each transcript read again only once it changes.
Package stats answers the usage statistics pages (/api/stats/*) from this machine's Claude Code and Codex files, as the previous runtime's handlers did: the same answers, the same cache files under the data folder, each transcript read again only once it changes.
status
Package status keeps the work state of every tab: what its agent is doing (idle, busy, waiting for an answer, done), learnt from the agent's hooks, its transcript, its screen and its process tree, and pushed to every status socket.
Package status keeps the work state of every tab: what its agent is doing (idle, busy, waiting for an answer, done), learnt from the agent's hooks, its transcript, its screen and its process tree, and pushed to every status socket.
statusline
Package statusline is the sink of Claude Code's status line: the platform's statusline script posts the JSON Claude gives it on every refresh, the sink keeps the subscription limits and the session's figures from it, and answers the line to show, which is the output of the person's own statusLine command when they have one.
Package statusline is the sink of Claude Code's status line: the platform's statusline script posts the JSON Claude gives it on every refresh, the sink keeps the subscription limits and the session's figures from it, and answers the line to show, which is the output of the person's own statusLine command when they have one.
subagents
Package subagents lists the subagents of a Claude Code conversation: the transcripts Claude Code writes next to the conversation's own (<session>/subagents/agent-<id>.jsonl, with an agent-<id>.meta.json), each summed up the way the previous runtime's inspector showed it.
Package subagents lists the subagents of a Claude Code conversation: the transcripts Claude Code writes next to the conversation's own (<session>/subagents/agent-<id>.jsonl, with an agent-<id>.meta.json), each summed up the way the previous runtime's inspector showed it.
telemetry
Package telemetry reports a runtime's own events to a PostHog-compatible batch endpoint: queued, sent a minute after the first of them (or at once when a batch is full), never more than a batch per request.
Package telemetry reports a runtime's own events to a PostHog-compatible batch endpoint: queued, sent a minute after the first of them (or at once when a batch is full), never more than a batch per request.
terminal
Package terminal serves the terminal socket: a page attaches to a tab's tmux session through a pty and talks a small binary protocol.
Package terminal serves the terminal socket: a page attaches to a tab's tmux session through a pty and talks a small binary protocol.
timeline
Package timeline serves the conversation socket (/api/timeline): which agent session a tab's pane runs, its transcript's first screen and what it gains, switches between sessions, the reply on screen not yet written, session statistics and the resume of a past session.
Package timeline serves the conversation socket (/api/timeline): which agent session a tab's pane runs, its transcript's first screen and what it gains, switches between sessions, the reply on screen not yet written, session statistics and the resume of a past session.
tmux
Package tmux runs the tmux commands the runtime needs.
Package tmux runs the tmux commands the runtime needs.
transcript
Package transcript reads the coding agents' conversation files (Claude Code and Codex jsonl) into timeline entries, the shape the conversation view draws, exactly as the previous runtime's parsers built them: the same entries, keys in the same order, the same byte offsets.
Package transcript reads the coding agents' conversation files (Claude Code and Codex jsonl) into timeline entries, the shape the conversation view draws, exactly as the previous runtime's parsers built them: the same entries, keys in the same order, the same byte offsets.
usagereport
Package usagereport is a runtime's usage report: what its Claude Code and Codex transcripts say about prompts, sessions, tokens and their API-equivalent cost, per day, project and model.
Package usagereport is a runtime's usage report: what its Claude Code and Codex transcripts say about prompts, sessions, tokens and their API-equivalent cost, per day, project and model.
vault
Package vault carries an agent's request that the person's page log in on a site with the password safe: the origin check, the cleaning of the page's answer, the per-tab rate limit and the bridge over the sync socket.
Package vault carries an agent's request that the person's page log in on a site with the password safe: the origin check, the cleaning of the page's answer, the per-tab rate limit and the bridge over the sync socket.
voice
Package voice is dictation for the composer's server engine: the page streams whatever its recorder produces over a socket, ffmpeg decodes it to PCM as it arrives, and the machine's recognition service, reached over a Unix socket, answers with partial and final text.
Package voice is dictation for the composer's server engine: the page streams whatever its recorder produces over a socket, ffmpeg decodes it to PCM as it arrives, and the machine's recognition service, reached over a Unix socket, answers with partial and final text.
Package skills carries the agent skills harnessly installs for Claude Code and Codex: the files of two upstream repositories at the commits pinned in SOURCES, vendored under upstream/ so an install works offline.
Package skills carries the agent skills harnessly installs for Claude Code and Codex: the files of two upstream repositories at the commits pinned in SOURCES, vendored under upstream/ so an install works offline.
Package web holds the browser front-end (a Vite project in this folder) and, built with the webui tag, its compiled files for the runtime to serve.
Package web holds the browser front-end (a Vite project in this folder) and, built with the webui tag, its compiled files for the runtime to serve.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL