<meta property="og:type" content="website" /> <meta property="og:site_name" content="Herdr" /> <meta property="og:title" content="Herdr: the runtime coding agents run on" /> <meta property="og:description" content="Run them anywhere. Leave them running. Herdr holds real terminals open so your agents keep working when you close the laptop, and gets you back in from any tty." /> <meta property="og:url" content="https://herdr.dev/" /> <meta property="og:image" content="https://herdr.dev/assets/og-card-v9.png" /> <meta property="og:image:width" content="1200" /> <meta property="og:image:height" content="630" /> <meta property="og:image:alt" content="Herdr — run them anywhere, leave them running." /> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebPage", "url": "https://herdr.dev/", "primaryImageOfPage": "https://herdr.dev/assets/og-card-v9.png" } </script> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Herdr: the runtime coding agents run on" /> <meta name="twitter:description" content="Run them anywhere. Leave them running. Herdr holds real terminals open so your agents keep working when you close the laptop." /> <meta name="twitter:image" content="https://herdr.dev/assets/og-card-v9.png" /> <meta name="twitter:image:alt" content="Herdr — run them anywhere, leave them running." /> <link rel="icon" href="/favicon.ico" sizes="48x48" /> <link rel="icon" type="image/png" sizes="192x192" href="/assets/favicon.png" /> <link rel="apple-touch-icon" href="/assets/logo.png" /> <link rel="preload" href="/assets/jbm.woff2?v=2" as="font" type="font/woff2" crossorigin /> <link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link href="https://fonts.googleapis.com/css2?family=Archivo:wght@600;800;900&family=Inter:wght@400;500;600&display=swap" rel="stylesheet" /> \<script\> /* Ground selection, shared with the docs. Starlight's `starlight-theme` key is the single source of truth, so a choice made in docs carries to the marketing pages and back. It stores dark | light | auto; we deliberately treat `auto` as dark, because the default here is a presentation decision and must not follow the reader's OS. The mock palette follows the ground: solarized-light on paper, catppuccin on ink. */ window.herdrGround = { read: function () { try { return localStorage.getItem("starlight-theme") === "light" ? "paper" : "ink"; } catch (e) { return "ink"; } }, apply: function (mode) { var root = document.documentElement; root.setAttribute("data-mode", mode); root.setAttribute("data-palette", mode === "paper" ? "solarized-light" : "catppuccin"); return mode; }, save: function (mode) { try { localStorage.setItem("starlight-theme", mode === "paper" ? "light" : "dark"); } catch (e) {} }, }; window.herdrGround.apply(window.herdrGround.read()); </script> <link rel="stylesheet" href="/css/style.css?v=59" /> <link rel="stylesheet" href="/css/site.css?v=64" /></head><body class="site"><div class="hd-frame"> <nav class="hd-nav"> <a class="lock" href="/"><span class="ram"></span><b>herdr</b></a> <div class="sp"></div> <a class="lnk" href="/docs/">Docs</a> <a class="lnk" href="/plugins/">Plugins</a> <a class="lnk" href="/blog/">Blog</a> <a class="lnk" href="/compare/">Compare</a> <div class="social-links"> <a class="ico wide" href="https://github.com/herdrdev/herdr" aria-label="Herdr on GitHub — star count"> <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82A7.64 7.64 0 0 1 8 3.87c.68 0 1.36.09 2 .26 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z" /></svg> <b data-stars>42,441</b> </a> <a class="ico" href="https://x.com/herdrdev" aria-label="Herdr on X"> <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231Zm-1.161 17.52h1.833L7.084 4.126H5.117Z" /></svg> </a> <a class="ico" href="https://discord.gg/PsgRfzmUDg" aria-label="Herdr on Discord"> <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M19.73 4.87a18.2 18.2 0 0 0-4.51-1.4l-.56 1.14a16.8 16.8 0 0 0-5.32 0l-.56-1.14a18.2 18.2 0 0 0-4.51 1.4C1.42 9.09.65 13.2 1.03 17.25a18.3 18.3 0 0 0 5.53 2.79c.45-.61.85-1.26 1.19-1.94-.65-.24-1.28-.54-1.88-.9l.46-.36a13.1 13.1 0 0 0 11.34 0l.46.36c-.6.36-1.23.66-1.88.9.34.68.74 1.33 1.19 1.94a18.3 18.3 0 0 0 5.53-2.79c.45-4.69-.77-8.76-3.24-12.38ZM8.35 14.77c-1.1 0-2-1.01-2-2.25s.88-2.25 2-2.25 2.02 1.02 2 2.25c0 1.24-.88 2.25-2 2.25Zm7.3 0c-1.1 0-2-1.01-2-2.25s.88-2.25 2-2.25 2.02 1.02 2 2.25c0 1.24-.88 2.25-2 2.25Z" /></svg> </a> </div> <div class="mode"> <button type="button" data-ground="ink" aria-pressed="true">ink</button> <button type="button" data-ground="paper" aria-pressed="false">paper</button> </div> <a class="btn" href="#install">Install</a> <button type="button" class="menu" id="nav-menu" aria-expanded="false" aria-controls="nav-sheet" aria-label="Menu"> <span></span><span></span><span></span> </button> </nav> <div class="sheet" id="nav-sheet"> <a href="/docs/">Docs</a> <a href="/plugins/">Plugins</a> <a href="/blog/">Blog</a> <a href="/compare/">Compare</a> <a href="https://x.com/herdrdev">@herdrdev</a> <a href="https://discord.gg/PsgRfzmUDg">Discord</a> <div class="sheet-ground"> <span>Ground</span> <div class="mode"> <button type="button" data-ground="ink" aria-pressed="true">ink</button> <button type="button" data-ground="paper" aria-pressed="false">paper</button> </div> </div> </div> <header class="hd-hero"> <a class="seed-ribbon" href="/blog/herdr-raised-a-seed/">We raised $6M. We’re hiring <span aria-hidden="true">↗</span></a> <span class="ram ghost"></span> <div class="in"> <div class="hd-eyebrow">\<s\></s>the agent runtime</div> \<h1\>Run them <em>anywhere.</em> Leave them running.</h1> <p class="lede">Herdr is where your coding agents live. However many you run, across however many projects, each in its own terminal. Walk away and they keep working. <b>Come back from any machine and they're where you left them.</b></p> <div class="go"> <div class="hd-cmd"> <code id="install-cmd"><b>$</b>curl -fsSL https://herdr.dev/install.sh | sh</code> <button type="button" id="copy-btn" aria-label="Copy install command">copy</button> </div> </div> <div class="hero-meta"> <div class="meta">macOS · Linux · Windows · Apache 2.0 — <a href="/docs/install/">windows, homebrew, nix and manual install →</a></div> <a class="hero-blog" href="/blog/connecting-the-machines/"><span>New</span> Connecting the machines <b aria-hidden="true">→</b></a> </div> </div> </header> <div class="strip"> <a class="stat" href="https://github.com/herdrdev/herdr" data-count> <b id="n-stars">42,441</b> <span> <svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 2.6l2.9 5.9 6.5.95-4.7 4.6 1.1 6.45L12 17.45 6.2 20.5l1.1-6.45-4.7-4.6 6.5-.95z"/></svg> github stars <i class="live"></i> </span> </a> <a class="stat" href="https://github.com/herdrdev/herdr/releases" data-count> <b id="n-installs">1,293,735</b> <span> <svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v10m0 0l-4-4m4 4l4-4M4 17v3h16v-3" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="square"/></svg> installs to date </span> </a> <a class="stat" href="/plugins/" data-count> <b id="n-plugins">1,548</b> <span> <svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M3 3h8v8H3zM13 3h8v8h-8zM3 13h8v8H3zM13 13h8v8h-8z" fill="none" stroke="currentColor" stroke-width="2"/></svg> community plugins </span> </a> <a class="stat" href="/docs/agents/" data-count> <b>22</b> <span> <svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 6l6 6-6 6M13 18h7" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="square"/></svg> agent CLIs detected </span> </a> </div> <section class="fig"> <div class="fighd"> <span>the herd, from a client that isn't there</span> <span class="r">click an agent</span> </div> <div class="plate"> <figure class="hero-product-shot"> <div class="herdr-ui-mock" id="herd-mock" role="img" aria-label="Interactive Herdr session mock with workspaces, tabs, agent states, and terminal panes running Claude Code and Codex" > <aside class="mock-sidebar"> <div class="mock-sidebar-half"> <div class="mock-sidebar-title">spaces</div> <div class="mock-space active" data-ws="herdr"> <span class="mock-dot dot-working"></span> <div><strong>herdr</strong>\<small\>master</small></div> </div> <div class="mock-space" data-ws="web-dashboard"> <span class="mock-dot dot-blocked"></span> <div><strong>web-dashboard</strong>\<small\>feat/usage-charts</small></div> </div> <div class="mock-space" data-ws="data-pipeline"> <span class="mock-dot dot-done"></span> <div><strong>data-pipeline</strong>\<small\>backfill/events-v2</small></div> </div> </div> <div class="mock-sidebar-half mock-sidebar-agents"> <div class="mock-agent-title"><span>agents</span><span>grouped</span></div> <div class="mock-agent working active" data-agent="herdr" data-kind="claude" data-ws-link="herdr" data-tab-link="main"><span>●</span><div><strong>herdr</strong>\<small\>working · claude</small></div></div> <div class="mock-agent" data-agent="explore" data-kind="opencode" data-ws-link="herdr" data-tab-link="opencode"><span>○</span><div><strong>explore</strong>\<small\>idle · opencode</small></div></div> <div class="mock-agent blocked" data-agent="web-dashboard" data-kind="claude" data-ws-link="web-dashboard" data-tab-link="main"><span>◉</span><div><strong>web-dashboard</strong>\<small\>blocked · claude</small></div></div> <div class="mock-agent done" data-agent="data-pipeline" data-kind="codex" data-ws-link="data-pipeline" data-tab-link="main"><span>●</span><div><strong>data-pipeline</strong>\<small\>done · codex</small></div></div> </div> </aside> <section class="mock-main"> <div class="mock-view active" data-view="herdr"> <div class="mock-tabs"> <span data-tab="opencode">opencode</span><span class="active" data-tab="main">herdr</span><span>+</span> </div> <div class="mock-panes active" data-tab="main"> <div class="mock-pane focused tui" data-title="claude"> <div class="cc-header"> <pre class="cc-logo-art"> ▐▛███▜▌
▝▜█████▛▘
▘▘ ▝▝
Claude Codev2.1.198
Fable 5 with high effort · Claude Max
/Projects/herdr/website
❯ make the herdr.dev hero mock look exactly like real claude code
● Ha. I read the real pane over the socket — the mock was on v2.1.168, Claude Code is v2.1.198 now. Missing the logo block and the whole rate-limit row.
● Plan:
· index.html — swap ✻ for the real ▐▛███▜▌ mark, bump the version
3. Session mode — auto_detect_launch() connects to a running server or spawns one.
Build · MiMo V2.5 Free · 16.6s
Build · MiMo V2.5 Free OpenCode Zen
25.2K (13%) ctrl+p commands
claudedev server+
▐▛███▜▌
▝▜█████▛▘
▘▘ ▝▝
Claude Codev2.1.198
Fable 5 with high effort · Claude Max
/Projects/web-dashboard
❯ finish the usage chart and ship it to staging
● Wrote src/components/UsageChart.tsx — stacked area, empty state, and the tooltip you asked for.
● Typecheck and build are clean, 41.2 kB gzipped. Ready to push to staging.
Bash command
bunx wrangler deploy –env staging
Deploy the dashboard to the staging environment
Do you want to proceed?
❯ 1. Yes
2. No, and tell Claude what to do differently (esc)
~/Projects/web-dashboardfeat/usage-charts
❯bun run dev
VITE v6.3.1 ready in 412 ms
Localhttp://localhost:5173/
02:30:58hmr update /src/components/UsageChart.tsx
02:31:04hmr update /src/styles/chart.css
02:31:09page reload src/routes/usage.tsx
02:31:15WARN chunk “charts” is 512 kB after minification
02:31:18hmr update /src/components/UsageChart.tsx
02:31:24hmr update /src/components/Tooltip.tsx
02:31:33✓ built in 1.94s
codexbackfill+
•Explored
└ Read jobs/backfill_events.py
•Ran
└ uv run pytest tests/test_backfill.py
└ 14 passed · 0 failed · 41.3s
• Checkpointing works, so the job resumes from the last committed offset instead of restarting. The backfill in the next tab has been running for six hours and is unaffected by your laptop.
• Next I can add the p95 lag alert to the nightly run. Want that?
›
gpt-5.5 medium · /data-pipeline · backfill/events-v2 · Context 6% used
/data-pipelinebackfill/events-v2
❯uv run jobs/backfill_events.py –from 2024-01-01
connected · batch size 5,000 · checkpoint every 60s
02:28:41 batch 4,102 ok20,510,000 rows
02:29:03 batch 4,103 okcheckpoint written
02:29:25 batch 4,104 ok
02:30:07 batch 4,105 ok
02:30:18WARN upstream throttled, retrying in 2s
02:30:42 batch 4,106 okcheckpoint written
02:31:09elapsed 6h 12m · 68% complete · eta 2h 54m
<figcaption>
The whole herd in one terminal. Click the sidebar, it’s a real layout.
Three workspaces, four agents, two of them mid-task. Nobody is attached to any of it right now.