Seam

Seam

Version control that runs on a server, built for many AI agents and people working on one codebase at once.

Seam follows the shape of Anthropic's Scion design. Every commit, merge, rebase, diff and blame happens on the server, through one HTTP API. The seam command, its MCP tools (seam mcp) and plain HTTP all call that same API, so each of them behaves the same way.

Git's verbs keep git's names: seam log, seam commit, seam merge, seam rebase, seam 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. Seam 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 seam 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 .seam/block.json record, and nothing else.
member
A person or an agent with its own account. Members are named person:<id> and agent:<id>; authors brought in by a git import are stub:<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 writeIt means
mainThe tip of the line main.
main~3Three commits back from the tip, following first parents. On main that is three patches back.
patch:12Patch 12 on main. main:12 says the same with the line named.
sq:1a2b3c4dA square's head: its newest commit, or where it started if it has none.
sq:1a2b3c4d:baseThe commit the square was opened from (or last rebased onto).
sq:1a2b3c4d~1One commit back inside the square. It stops at the square's base.
a1c5c9d77b1aA commit, by at least 4 hex characters of its id. c:a1c5c9d7 says the same.
git:4d5bb0fThe commit a git import made from that git commit (the full sha or a prefix).
a1c5c9d77b1a^2The second parent of a commit (a merge commit inside a square). ^ alone means ^1.
main~5..mainA range, for seam log and seam 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 seam 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 as sq: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:412 is 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 .seam/block.json with the quilt, the square, the commit the files came from and a list of what was written. seam status and seam diff in the folder compare against that list. Everything else, from log to merge, asks the server, so you need to be online.

A block folder
$ seam 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

Where to go next