← Blog

bay 0.5: one file says how each path merges

Gudjon Gudjonsson · Founder and CEO of OZ · 26 October 2026

bay 0.5.6 is out today. bay is for teams that run many coding agents in one codebase, often on the same files. Git itself is fine, but the human-paced branch and merge workflow breaks at that speed. With bay, each agent submits once, and bay merges only what passed on the latest main. The 0.5 releases came from the first real code merges on a busy fleet.

One file says how each path merges

Some files merge line by line, and some never merge, such as a design file. Some should not be in Git at all. bay now reads all three from .gitattributes on main, with Git's own patterns. bay reads main's copy, never the change's, so a change cannot loosen the rule for its own files.

sh
# .gitattributes on main
cards.md merge=union     # both sides' lines merge
art/** lockable          # one editor at a time
*.pdf bay-offload        # kept out of Git, whatever its size

Large files stay on your remote

A new file over your size limit goes to your remote's own store. bay reaches it with the same login as Git, so no clone needs a store setup of its own. A plain Git host such as GitHub keeps no store, so there you name one with a plugin. [assets] hold keeps files that must stay, such as files under a legal hold, from any purge.

Each check run costs less

  1. Cheap checks first: first = true runs a fast check first, and a failure ends the run before slow tests start.
  2. Reads seen, not declared: footprint = "observed" reuses a result where the bytes a check read are unchanged.
  3. Warm results: [runner] warm runs those checks once on main's newest commit, so a change runs only what it reaches.
  4. Post checks on main: [runner] post runs slow whole-tree checks once on main's newest commit, after the merges.

A person in one command

bay install --approver <name> sets up the first person who approves, in the project's clone. It makes their keys if they have none, starts the key registry and enrols them. Then a change on a gated path waits for that person's signed yes.

What a busy queue taught us

  1. Oldest first: the runner takes waiting changes in the order they came.
  2. A head that yields: a change refused because main moved gives its turn back, so every change gets a place.
  3. A busy runner looks busy: its presence is written during a long check, so it never reads as gone.

Get started

bay is free and open source under the MIT licence, with no paid tier and no account. Install bay, then follow the quickstart to merge your first change. 0.x means a minor release can still change a command, and the changelog names each change.

sh
curl -fsSL https://getbay.io/install.sh | sh

Gudjon Gudjonsson · Founder and CEO of OZ