pail pail.build

Version control that lives in your bucket.

pail keeps your repository in S3 or GCS and lets every person and agent commit straight to it.

  • Your repo is just a bucket. There's no server to run, and the data never leaves your cloud account.
  • A commit is one write. No push and no merge queue. Everyone sees the commit as soon as it lands.
  • Git can read it. pail log, show and cat-file print exactly what Git would.
$ curl -fsSL https://pail.build/install.sh | sh
gs://acme-vcs/app/committing "Fix the parser"
mutable objects: 1 per branchrefs/main → 7f3a…

A commit, start to finish

pail hashes your changed files, uploads them next to a new commit object, and then does one conditional write to refs/main. That last write is the whole commit. If someone else got there first and touched different files, pail replays yours on top and tries again.

Follow one commit through the bucket, object by object.

How it compares to pushing to GitHub

We ran the same edits through both CLIs from the same laptop. Each writer made 20 commits to one shared branch: git add/commit/push to a private GitHub repository, and pail add/commit to a GCS bucket. After each pail run we checked that every commit actually made it onto main.

Writers on one branchgit → github.compail → GCSCommits per second
10.7 /s1.4 s per commit2.0 /s0.45 s per commit
40.65 /s2.1 /s
160.7 /s7.9 pushes per commit3.6 /snone lost

A caveat: this was a home connection in Phoenix in October 2026, about 90 ms from github.com and 35 ms from storage.googleapis.com. Both tools spend most of their time waiting on round trips, so both get faster from a machine in the bucket's region. Calling pail as a library, without starting a process per commit, got to 7.1 commits per second with 16 writers.

Built for lots of agents committing to the same branch

Land a whole stack at once

pail land feature --stack puts every commit on a branch onto main in one write. If it fails partway, run it again. It picks up where it left off.

Cheap worktrees

Working copies are copy-on-write clones of one shared cache. Build output gets cloned too, so a new worktree starts with a warm build and doesn't double your disk usage.

Same output as Git

pail log, show, cat-file and ls-tree take Git's flags and print Git's output. We mirror our own monorepo into pail as it changes and check every commit byte for byte. Thousands of commits so far, no mismatches.

Your data stays in your bucket

Nothing leaves your cloud account. People don't need bucket keys either: a credential provider hands out short-lived tokens that only work for one repository.

Real conflicts stop you

Changes to different files just work. When two writers change the same file, the second one gets exit code 4 and a list of the files, so a script or an agent knows exactly what to sync.

Hooks run before anything lands

pre-commit, commit-msg and pre-publish all run before the branch moves. pre-publish sees the exact commit that's about to land.

Where your repository lives, and how people sign in

A repository is a URL. Point it at whatever storage you already have, and install the credential provider that matches how your people sign in. Providers are small programs in their own GitHub repos, like gh extensions.

Hosts

gs://bucket/repo
Google Cloud Storage
s3://bucket/repo
Amazon S3, or anything that speaks S3 with conditional writes
file:///path/repo
A local folder, for tests and laptops
https://host/repo
Any pail serve proxy, for people with no bucket access at all
https://pail.archdev.ai/org/repo
Hosted on ArchDev coming

Sign-in

pail auth install gcloud
Your gcloud login. pail-credential-gcloud
pail auth install gcs-downscoped
Your gcloud login, narrowed to one repository. pail-credential-gcs-downscoped
pail auth install archdev
Your ArchDev login. pail-credential-archdev
No provider
S3 and GCS use the credentials your cloud SDK already has.
pail auth install you/pail-credential-sso
Your own provider for your SSO or token broker. Pin it with @v1.2.

PRs and CI are just programs that read and write branches

You don't need a server for pull requests or CI. The bucket already sends a notification whenever a branch moves. A CI runner listens for those, builds the exact commit, and saves its result as a commit on a _meta branch. Our pail-pr and pail-ci prototypes are short scripts that only call the pail CLI.

See the naming conventions and a full PR flow.

Security

pail has no server of its own to break into. What's left is your bucket's permissions and the tokens people carry, so that's where the work goes.

How branch protection works
Building a token broker and a lander

All you need is a bucket

Any S3 or GCS bucket works, or a local folder with file://.

curl -fsSL https://pail.build/install.sh | sh
pail auth install gcloud
pail init gs://acme-vcs/app
pail clone gs://acme-vcs/app && cd app
pail add -A
pail commit -m "First commit"   # published
pail log --oneline