Skip to main content

leghorn

ci

A full-screen live dashboard you leave open on a second monitor while many Claude Code sessions work: every live session joined to its worktree and real git state, your GitHub CI and open PRs with failures pinned until they go green, and a commit feed across every repo, newest first.

leghorn watching a fleet: contested sessions, red CI, a session detail overlay, and the git toggle

The short ambient loop below is the same program, idling:

leghorn's ambient loop, sessions ticking quietly

 leghorn  20 sessions · 2 shared · 1 uncommitted · 3 ci red        sort:attention  filter:all  15:26:53
╭─ SESSIONS ───────────────────────────────────────────────╮ ╭─ COMMITS ──────────────────────────╮
│◉  leghorn-fea  my-mcp-server        Needs Input  72%     │ │   9m tools  fix/build-cwd          │
│●  session-a3   api-refactor         Idle         58%     │ │       fix(api): resolve paths agai…│
│●  session-d8   web-frontend  ~2 ↑1  Processing   50%     │ │  25m web-frontend  origin/ci/pub   │
╰──────────────────────────────────────────────────────────╯ │       Automate publishing on relea…│
╭─ GITHUB ─────────────────────────────────────────────────╮ │  29m api-refactor                  │
│ 17h ✗ my-mcp-server  Required PR Sections (fix/fields)   │ │       Add an in-program help panel │
│ 17h ✗ my-mcp-server  #593 Add field selection ← sections │ │  41m tools                         │
│ 17h ◍ tools          Graph Update (queued 17h)           │ │       Add a LOCAL MODELS panel     │
│ 23m ✓ web-frontend   ci (ci/npm-and-tap-publish)         │ │   1h api-refactor  origin/feat/rel │
│ 24m ✓ web-frontend   #18 Automate publishing  APPROVED   │ │       teach release_check to diff  │
╰──────────────────────────────────────────────────────────╯ ╰────────────────────────────────────╯
 q quit  r refresh  s sort  f filter  g git  tab pane  enter detail  ? help

Sessions that share a working tree are marked contested (◉) — two sessions in one checkout silently destroy each other's uncommitted work, and seeing it happen is the first step to not doing it. The GitHub pane ranks by what it costs to ignore: running first, then red (a failure must not scroll away), then stuck-in-queue, then everything else by freshness.

Two files, stdlib only, Python 3.9+. macOS and Linux need nothing beyond the standard library; Windows needs windows-curses, which is the only thing curses is not already there for. Read-only by construction: it reads session transcripts, runs gh and read-only git plumbing, and never writes to a tree, a registry or a session. Every data source is optional — missing pieces degrade to a labelled gap, never an error.

Install

Homebrew (macOS and Linux):

brew install gmhoward9289-ops/tap/leghorn

npm:

npm install -g leghorn

pipx / pip:

pipx install leghorn

Debian and Ubuntu, from the signed apt repo — this also gets you apt upgrade:

curl -fsSL https://gmhoward9289-ops.github.io/leghorn/leghorn-archive-keyring.asc | sudo gpg --dearmor -o /usr/share/keyrings/leghorn-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/leghorn-archive-keyring.gpg] https://gmhoward9289-ops.github.io/leghorn stable main" | sudo tee /etc/apt/sources.list.d/leghorn.list
sudo apt update
sudo apt install leghorn

Or grab leghorn_<version>_all.deb from the latest release and sudo apt install ./leghorn_<version>_all.deb.

What it needs

  • git — for the per-tree state and the commit feed.
  • gh (authenticated) — for the GITHUB pane. Unauthenticated, the pane says "cannot see github" rather than pretending nothing is happening; an empty feed and a feed that cannot see are different facts. Session status, context and burn are read from the JSONL transcripts Claude Code already writes under ~/.claude/projects (override: CLAUDE_PROJECTS_DIR) — no extra binary, and the same numbers on every platform. A session with no transcript yet degrades to a labelled gap.

Clones are discovered under ~/GitHub (override: LEGHORN_ROOT).

Usage

leghorn                  # three panes, refreshing every 5s
leghorn -i 2             # ...every 2s
leghorn --speed slow     # 5m session refresh, 6h gh sweep (also: ultra, fast, normal)
leghorn --no-github      # hide the GitHub pane (no gh calls at all)
leghorn --no-commits     # hide the commit feed; sessions and github go side by side
leghorn --github-interval 120   # slower gh sweeps

Keys: q quit · r refresh (including a gh sweep) · s/f cycle sort/filter · p cycle speed · c toggle commits · tab cycle panes · j/k move · enter detail · ? help — which explains what each screen and symbol means, not just the keys.

The data layer is also a command of its own:

python3 -m henhouse            # one table of sessions, for a hook or a pipe
python3 -m henhouse --github   # the CI/PR feed as plain text
python3 -m henhouse --json     # records, for piping somewhere else

Name

The Leghorn is the chicken breed that spots everything first and is never quiet about it.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

leghorn-0.4.4.tar.gz (47.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

leghorn-0.4.4-py3-none-any.whl (34.6 kB view details)

Uploaded Python 3

File details

Details for the file leghorn-0.4.4.tar.gz.

File metadata

  • Download URL: leghorn-0.4.4.tar.gz
  • Upload date:
  • Size: 47.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for leghorn-0.4.4.tar.gz
Algorithm Hash digest
SHA256 6ebe7b2c39b63c3b455c01cac10e27920990373abeea07da8ff4a897c8a0e042
MD5 5855fedbd57f5d460ddfc1d579e041d6
BLAKE2b-256 b37403f6d380a2fb444e83cbec3aa2f302052def9e749cf7995bac6632d7754c

See more details on using hashes here.

Provenance

The following attestation bundles were made for leghorn-0.4.4.tar.gz:

Publisher: release.yml on gmhoward9289-ops/leghorn

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file leghorn-0.4.4-py3-none-any.whl.

File metadata

  • Download URL: leghorn-0.4.4-py3-none-any.whl
  • Upload date:
  • Size: 34.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for leghorn-0.4.4-py3-none-any.whl
Algorithm Hash digest
SHA256 a7682ffd586b1d72e9398c4f81d2b4d775ba085aa27e2d2281ded906f05cfd94
MD5 e905e6864248be1df40aadfecba76aed
BLAKE2b-256 c05e2071de36abd8d371a29ec623580342ca03ba670a0dbcfd7617b8f95fe6aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for leghorn-0.4.4-py3-none-any.whl:

Publisher: release.yml on gmhoward9289-ops/leghorn

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page