docsterminals & rigs

See every terminal's pulse at a glance.

Pulse turns raw PTY output into an honest status vocabulary, and Agent Attention reads real Claude Code hook events so one keypress jumps you to the agent that actually needs a human.

overview

Pulse is the per-terminal activity indicator 13x shows in every card header, the focus bar, and a sidebar SYSTEM tally. It distills the PTY output stream into six honest states — BOOT, ACTIVE, IDLE, DONE, ERR, OFF — so a wall of terminals tells you what each one is doing at a glance. Agent Attention layers Claude Code awareness on top: when a slot runs Claude, real hook events override the heuristic, and Ctrl+Space hops you straight to whichever agent is waiting on you.

  • Six honest states: BOOT, ACTIVE, IDLE, DONE, ERR, OFF
  • Agent state from real Claude Code hooks, not output scraping
  • Ctrl+Space jumps to the next agent that needs you
  • Strictly monochrome — dot fill, check glyph, label weight, never color
  • Local-only: .13x/sessions logs + ~/.claude transcripts, no telemetry
  • Old runs never replay — offsets seed to current file length on first watch
why it matters

Ground-truth agent state, not a scrape

When a slot runs Claude Code, 13x reads real hook events — prompt, pretool, posttool, notify, stop — appended to a per-slot log. THINKING, TOOL, NEEDS YOU and DONE are facts from the agent, not guesses parsed from output.

One key triages a wall of agents

Ctrl+Space (and the TopBar 'N NEEDS YOU' counter) cycles to the next agent waiting on a human, prioritized needs_you > turn_done > error, wrapping around. The one slot that's blocked never gets buried.

Strictly monochrome status

State is conveyed by dot fill, a check glyph, and label weight — never color. NEEDS YOU renders as an inverted chip via CSS weight, not hue. It reads the same in any light.

Honest DONE, no false positives

A persistent PowerShell PTY never exits when a one-shot command finishes, so DONE is inferred only for oneshot slots that produced output then went quiet. Watch and interactive slots go IDLE, never falsely DONE. Error-pattern scanning is deliberately not implemented.

Local-first, no telemetry

All agent state comes from local files — per-slot logs under .13x/sessions and your local Claude transcripts under ~/.claude/projects. No network calls. Nothing is sent to a server.

Watches every open workspace at once

The Rust watcher tails one root per open workspace concurrently, so a backgrounded project's agent state keeps updating while you work in another.

how it works
01

Pulse reads the output stream

A single 1 Hz tick flips a quiet session to ACTIVE on the first byte of output and demotes any session silent for 5 seconds to IDLE — or to DONE only when the slot ran a one-shot command and produced output.

02

Command mode decides DONE vs IDLE

At launch the backend tags each slot: TEST/GIT that auto-run a command are oneshot (they complete to DONE), DEV/LOG are watch, AGENT is interactive — long-running slots go IDLE, never falsely DONE.

03

Claude hooks log real events

13x merges seven Claude Code hooks into your global settings; each appends one token to the slot's agent-events.log. Outside a 13x slot the hook is an immediate no-op and never touches foreign settings.

04

The watcher folds tokens into state

A Rust watcher tails each log per workspace with a 200ms debounce, seeds offsets to current file length so old runs never replay, and emits an agent-state event. On a stop token it peeks the local transcript for the real model.

05

Attention jumps you to the blocked agent

Ranking needs_you > turn_done > error, Ctrl+Space or the TopBar chip picks the next agent after your current focus and hands it the keyboard. Typing into a slot demotes it back to attached — answering the agent.

faq

How does 13x know an agent needs me?

For Claude Code agents running in a 13x slot, 13x reads real hook events the agent writes to a per-slot log — prompt, pretool, posttool, notify, stop. A notify event means NEEDS YOU; it's reported by the agent, not inferred from terminal output.

Does this work for agents other than Claude Code?

Agent hook states appear only for Claude Code agents in 13x slots with the global hooks installed and the slot env var set. Other agents and CLIs fall back to the plain Pulse heuristics — BOOT, ACTIVE, IDLE, DONE, ERR, OFF.

Why isn't DONE always accurate?

A persistent interactive PowerShell PTY does not exit when a one-shot command finishes, so there's no per-command exit code. DONE is inferred from quiescence — a oneshot slot that produced output then went quiet for 5 seconds. It's best-effort by design, and watch/interactive slots never auto-complete.

Is any of this sent to a server?

No. Agent state is derived entirely from local files under .13x/sessions and ~/.claude/projects. There are no network calls and no telemetry. Stale events from a previous run are never replayed because offsets seed to the current file length on first watch.

get started

one project. many shells. zero noise.

13x is local-first and free of telemetry — your code, commands and shells never leave the machine. Join the waitlist for the next build.