File size: 5,567 Bytes
54a0d76 c350618 54a0d76 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | <!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>
|