Changelog
Build-in-public, reverse-chronological. Only things that actually shipped. No roadmap items dressed up as done. Befall is built with Claude Code, Codex CLI and Cursor sharing one room on this repo — that is how the author works, not a benchmark, and there is no published build log to check it against.
Updated 2026-09-01
2026-09-01: the honesty pass
A correction pass across every public page, plus the three section indexes the site had been asserting in its breadcrumbs without ever publishing.
/guides,/compareand/toolsare real pages. All three used to redirect to whichever article was the flagship, while every breadcrumb on the site pointed its middle item at them. A section you cannot visit cannot say what it contains.- “Metadata only” stopped travelling alone. It is true about source code and diffs and false as a summary of the product: task titles, task descriptions and messages are text you author, they are uploaded, and they are stored. Every page that said the short version now says the long one.
- Three “day one” refusal logs, all different. Three pages each printed a different transcript captioned as the real first refusal. Befall ships no CLI that prints those lines. They are now written as what they are: the shape of the 409 payload, with the fields the API actually returns.
- One daemon per checkout, not per repo. Three pages said per repo. Two
git worktreecheckouts are two daemons, two checkouts and two sets of git state, which is the whole reason the socket is named after the working-tree root. - Dirty paths belong to the working tree. Copy that had heartbeats carrying “each agent’s dirty-file list” was describing something git cannot do: it attributes a change to a tree, never to the process that wrote it. Two agents in one clone share one list.
- Realtime carries an empty payload, not nothing. The envelope still routes: room, topic, event kind, actor, timestamp. Two pages claimed the push layer carried no data at all.
2026-08-14: primary sources
A week of comparison pages written the only way we are willing to write them: from the other project’s own repository or documentation, on a date the page states.
/compare/mcp-coordination-servers— 25 projects checked against the GitHub API, with stars, licence, last default-branch commit and each project’s own description./compare/mcp-agent-mailand/compare/claude-code-agent-teams— the two closest neighbours, including where each beats us./tools/glob-overlap— the overlap analyzer as a page anyone can run without an account. It calls the same function the claim API calls./resources— the index that used to sit inline on the homepage between the mechanism and the price.
2026-08-08: launch week
Launch week. Four buckets landed: a full redesign, a security pass, the free tier turning into an actual funnel, and two new pages. Details below, newest first.
- Claim-register redesign (new identity). The whole site moved to one image: a claim enters a shared register as a strip, and an overlapping strip is pushed back out under a
REFUSEDstamp. It matches what the product does — claims are advisory and first-writer-wins, so an agent that asks second gets an answer rather than a merge. Ships light by default with a dark theme toggle. - Per-IP rate limits on the unauthenticated edges. The OAuth callback, the public signup-counter, and the room-snapshot route now key their sliding-window limits by IP instead of user, because there is no user yet on those paths. These sit alongside the existing per-user buckets (heartbeat, lock, message). Single-instance in-memory for now: documented as needing Redis before we scale horizontally.
- Cleared four high-severity dependency advisories.
pnpm audit --audit-level highis a gate in CI; it was flagging four transitive advisories. Bumped the offending deps and the gate is green again. No behavior change: just closing known holes before opening the doors. - Free tier became the funnel. Free is now 1 room, 2 concurrent agents, and a 7-day activity-history window. All enforced server-side, not hinted in the UI. Paid plans raise the room limit and open the full available history — the retention policy still bounds it: room activity is kept for 180 days and heartbeat telemetry for 7. Founding price is $15/mo (list $29). This is enough to run one repo with a pair of agents indefinitely, which is the point.
- Plan-limit errors now offer one-click upgrade. Hit the room or history cap and the error is no longer a dead end with a URL to copy. It renders an Upgrade button inline. The limit check itself runs under a per-org advisory lock so two concurrent room-creates can't race past the cap.
- New page:
/security. The privacy model, field by field. Spells out exactly what leaves your machine (paths, branch names, commit SHAs, dirty-path lists, claims, task titles and descriptions, and explicit messages) and what never does (source code, diffs). Realtime broadcasts carry an empty payload, so subscribers re-fetch through the authenticated REST API rather than receiving the change over the wire. - New page:
/guides/coordinating-claude-code-codex-cursor. The practical walkthrough for putting three different agents in one room (join, announce intent, lock, hand off, release) written from running exactly that setup to build this thing.
One correctness note worth recording from the week, because it is the kind of bug that would silently corrupt lock decisions: our glob overlap check has to treat ** as matching zero directories as well as many. So src/**/api must overlap src/api. The first implementation got the zero-directory case wrong; there is now a regression test pinning it so a future refactor can't quietly break it.
src/**/api ⨯ src/api → OVERLAP (** matches zero dirs) src/**/api ⨯ src/a/b/api → OVERLAP (** matches many dirs) src/api ⨯ src/web → no overlap
If you are running a single agent, or the work is provably disjoint (two agents on genuinely separate directory trees), you probably don't need any of this: plain git worktrees are simpler and Befall would just be overhead. We say so on /compare/git-worktrees. Befall earns its keep the moment two agents can reach for the same file.