Quilt Source
Version control that runs on a server, built for many AI agents and people working on one codebase at once.
Quilt Source follows the shape of Anthropic's Scion design. Every commit, merge, rebase, diff and blame happens on the server, through one HTTP API. The quilt command line, the MCP tools inside your AI tool and plain HTTP all call that same API, so each of them behaves the same way.
Git's verbs keep git's names: quilt log, quilt commit, quilt merge, quilt rebase, quilt blame. The nouns change where git's nouns stop fitting a crowd of agents.
Why it exists
Git assumes one person, one working copy, deciding when to share. When ten agents work on one repo, that design starts to fight you: clones go stale, merges wait in a queue, and conflicts stop work until someone fixes them by hand. Quilt Source changes three things.
Many agents work at once
Each agent, or each task, gets its own square, opened from the tip of main. A square is private work in progress. Squares never block each other, and an agent checks out only the folders it needs.
The server merges, with no merge queue
Merging a square replays its changes onto the current tip of main as one commit and moves main forward, in one step on the server. If another merge landed a moment earlier, the server tries again by itself. Squares that touch different files merge without a conflict in any order, and you never pull before you merge.
Conflicts stay in the square, as data
When two squares change the same lines, the first to merge goes in. The second merge is refused and main is left alone. The square is moved onto the new tip with the conflict kept inside it, both sides and who made each one recorded. You settle it when you are ready, by editing the file or with quilt resolve, and merge again. main never holds conflict markers.
The words
- quilt
- A repository, kept on the server. It has a slug (lowercase letters, digits and dashes, up to 63 characters) and an id. Its members can read, write or admin it.
- line
- A long-lived pointer to a commit, moved only by the server. Every quilt has one line,
main. - square
- One piece of work in progress: a branch and its working copy in one. It is opened from the tip of a line, belongs to one member at a time (its holder), and holds that member's commits until it is merged.
- commit
- A save point inside a square. Its author is the member who made it, signed in, never a name typed by hand.
- patch
- A square once it has merged into a line. The server writes it as one commit on the line and numbers it: patch 1, 2, 3 and on, on
main. - block
- The part of a quilt you check out into a folder: one or more path prefixes, or the whole quilt. The folder holds the files and a
.quilt/block.jsonrecord, and nothing else. - member
- A person or an agent with its own account. Members are named
person:<id>andagent:<id>; authors brought in by a git import arestub:<email>.
A square moves through a few states: open while you work, merging for the moment a merge runs, then merged, abandoned or folded (its work moved into another square). An abandoned square can be reopened.
Revisions
Anywhere a command or the API asks for a revision, you can name it in any of these ways.
| You write | It means |
|---|---|
main | The tip of the line main. |
main~3 | Three commits back from the tip, following first parents. On main that is three patches back. |
patch:12 | Patch 12 on main. main:12 says the same with the line named. |
sq:1a2b3c4d | A square's head: its newest commit, or where it started if it has none. |
sq:1a2b3c4d:base | The commit the square was opened from (or last rebased onto). |
sq:1a2b3c4d~1 | One commit back inside the square. It stops at the square's base. |
a1c5c9d77b1a | A commit, by at least 4 hex characters of its id. c:a1c5c9d7 says the same. |
git:4d5bb0f | The commit a git import made from that git commit (the full sha or a prefix). |
a1c5c9d77b1a^2 | The second parent of a commit (a merge commit inside a square). ^ alone means ^1. |
main~5..main | A range, for quilt log and quilt diff. |
A bare number is refused, so 12 never means the wrong thing: the answer asks you to say patch:12 or c:12…. Commands that read a file take path@revision, as in quilt cat README.md@patch:12.
Ids
- Quilts have a UUID and a slug. Commands take either; the slug is the one you type.
- Squares have a time-ordered UUID. You use the short handle:
sq:and the last 8 hex characters, such assq:1a2b3c4d. If two squares ever share those 8 characters, the server asks for more of the id. - Commits have a 64-character content hash (BLAKE3). Output shows the first 12.
- Patches have a number on their line. Patch numbers never change, so
patch:412is a name you can write in a ticket.
A new quilt starts with an empty root commit as patch 0, so main always has a tip. An imported quilt starts from git's own first commit.
What lives where
The server holds the whole history. Your folder holds only a block: the files under its paths, and .quilt/block.json with the quilt, the square, the commit the files came from and a list of what was written. quilt status and quilt diff in the folder compare against that list. Everything else, from log to merge, asks the server, so you need to be online.
$ quilt status
On square sq:1a2b3c4d "Fix sign-in" · open · head 9e8d7c6b5a49 · held by person:7f3e…
Block: src at 9e8d7c6b5a49
Changes not yet committed:
modified src/auth.js