| <!doctype html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <title>Repolith — coordination layer for parallel Claude Code sessions</title> |
| <meta name="description" content="File-level locks, plan-conflict detection, and auto-resume for multiple Claude Code sessions on the same repos."> |
| <style> |
| :root { color-scheme: dark; } |
| * { box-sizing: border-box; } |
| body { |
| margin: 0; background: #0b0d12; color: #d7dbe4; |
| font: 16px/1.6 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; |
| -webkit-font-smoothing: antialiased; |
| } |
| main { max-width: 880px; margin: 0 auto; padding: 56px 24px 80px; } |
| h1 { font-size: 2rem; margin: 0 0 4px; color: #f2f4f8; letter-spacing: -0.02em; } |
| .tag { color: #8b93a7; margin: 0 0 28px; font-size: 1.05rem; } |
| .hero-sub { max-width: 640px; color: #aab1c2; margin: 0 0 28px; } |
| img.demo { width: 100%; border-radius: 10px; border: 1px solid #232838; display: block; } |
| .caption { color: #6d7488; font-size: .82rem; margin: 8px 0 36px; } |
| .install { |
| display: inline-block; background: #141824; border: 1px solid #2a3145; border-radius: 8px; |
| padding: 10px 18px; font: 500 .95rem/1 ui-monospace, "Cascadia Code", Consolas, monospace; |
| color: #9ee6b8; margin: 0 0 40px; |
| } |
| .stats { display: flex; flex-wrap: wrap; gap: 12px; margin: 0 0 12px; } |
| .stat { background: #10131c; border: 1px solid #1e2434; border-radius: 10px; padding: 14px 18px; flex: 1 1 150px; } |
| .stat b { display: block; font-size: 1.35rem; color: #f2f4f8; font-variant-numeric: tabular-nums; } |
| .stat span { font-size: .8rem; color: #8b93a7; } |
| .stats-note { color: #6d7488; font-size: .82rem; margin: 0 0 44px; } |
| h2 { font-size: 1.15rem; color: #f2f4f8; margin: 0 0 10px; } |
| .cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 16px; margin: 0 0 44px; } |
| .col { background: #10131c; border: 1px solid #1e2434; border-radius: 10px; padding: 18px; } |
| .col h3 { margin: 0 0 8px; font-size: .95rem; color: #e6e9f0; } |
| .col p { margin: 0; font-size: .88rem; color: #9aa1b4; } |
| .limits { border-left: 3px solid #4a5268; padding: 4px 0 4px 16px; color: #8b93a7; font-size: .88rem; margin: 0 0 44px; } |
| .links a { color: #7fb3ff; text-decoration: none; margin-right: 22px; font-size: .95rem; } |
| .links a:hover { text-decoration: underline; } |
| footer { margin-top: 48px; color: #59607a; font-size: .8rem; } |
| </style> |
| </head> |
| <body> |
| <main> |
| <h1>repolith</h1> |
| <p class="tag">The coordination layer for parallel AI coding agents.</p> |
| <p class="hero-sub">File-level locks, plan-conflict detection, and auto-resume for multiple Claude Code |
| sessions on the same repos. Worktree isolation defers the conflict to merge time — after every session |
| already did the work. Coordination prevents it at plan time and edit time.</p> |
|
|
| <div class="install">npm i -g repolith</div> |
|
|
| <img class="demo" src="demo.gif" alt="Two Claude Code sessions edit the same file: session A claims it on first touch, session B is denied with the holder named, waits, and auto-resumes the moment A commits."> |
| <p class="caption">Real repolith from npm, nothing mocked — two sessions collide, the second is denied, waits, and auto-resumes.</p> |
|
|
| <div class="stats"> |
| <div class="stat"><b>914</b><span>sessions coordinated</span></div> |
| <div class="stat"><b>20,994</b><span>file claims</span></div> |
| <div class="stat"><b>3,168</b><span>collisions denied</span></div> |
| <div class="stat"><b>552</b><span>FIFO auto-resumes</span></div> |
| <div class="stat"><b>17</b><span>conflicts caught at plan time</span></div> |
| </div> |
| <p class="stats-note">9 weeks of dogfooding on the author's own two-repo workspace (Jun 29 – Aug 30, 2026). Exact counts from the coordination journal.</p> |
|
|
| <h2>How it works</h2> |
| <div class="cols"> |
| <div class="col"> |
| <h3>Plan-time catch</h3> |
| <p>A hook on ExitPlanMode captures each session's plan. Two plans overlapping on the same files? The second session finds out before writing a line.</p> |
| </div> |
| <div class="col"> |
| <h3>Edit gate + auto-resume</h3> |
| <p>First touch claims the file. A second live session is denied with the holder named, can queue, and resumes FIFO the moment the file frees up. Deadlocks are surfaced, not hung.</p> |
| </div> |
| <div class="col"> |
| <h3>Journal + drift control</h3> |
| <p>Every file has a journal. Sessions read what the last session did there before editing, and get a catch-up brief on start. Heartbeats + git-verified staleness keep crashed sessions from wedging the store.</p> |
| </div> |
| </div> |
|
|
| <p class="limits"><strong>Honest limits:</strong> same-machine only (shared JSON store), cooperative — it |
| coordinates sessions that run the hooks. Claude Code today; other agents via the CLI. Advisory by design: |
| every hook exits 0 on internal failure, so coordination can never break your edit flow. Also does multi-repo: |
| TOML manifest, lockfile with an atomic workspace hash, parallel dispatch, VS Code extension.</p> |
|
|
| <p class="links"> |
| <a href="https://github.com/ethanrickyjrjr-wq/repolith">GitHub</a> |
| <a href="https://www.npmjs.com/package/repolith">npm</a> |
| <a href="https://marketplace.visualstudio.com/items?itemName=stanicky.repolith-vscode">VS Code</a> |
| <a href="https://ethanrickyjrjr-wq.github.io/repolith-site/">Site + team-tier waitlist</a> |
| </p> |
|
|
| <footer>MIT · TypeScript on Bun · no daemon, no server — a JSON store and git</footer> |
| </main> |
| </body> |
| </html> |
|
|