Skip to content
v0.3.0 · open source

Version control for people and agents

Hebra gives every coding agent its own workspace, warns when two of them touch the same file, and records who asked for each change. It speaks Git, and it has its own server and web.

Many agents in one repository.

Git was built for people taking turns. Hebra keeps agents apart while they work and brings their work together under review. Everything below is live, so press it.

$ hb start "add OAuth login" --agent claude-code
Started workspace add-oauth-login
change: rysttrtz base: a6d6307d777f
$ hb start "rate limit login" --agent codex
Started workspace rate-limit-login
$

Every agent gets its own room

hb start makes an isolated workspace with a fresh change. Nothing an agent does touches your files or another agent's.

src/auth.rs is claimedclaude-code, adding OAuth login

Collisions show up before the merge

Agents claim what they are about to change. When two reach for the same file, both hear about it, in the CLI, over MCP and in the hub.

src/auth.rsConflict
<<<<<<< ours
let limit = oauth::limit(&user);
=======
let limit = 100;
>>>>>>> theirs

A merge always finishes

Conflicts are saved inside the change, and work goes on. A person or another agent settles them when ready.

op012345678901234567890123456789

hb reset --hard @--

2 changes dropped, still here

mergeresolvereset

Every operation can be undone

Drag it back. hb undo takes back anything, including reset --hard, and hb op restore goes to any point.

claude-code

agent for ana

Change
rysttrtz
Task
#31 add OAuth login
Session
s_9f2c41
Prompt
Add GitHub OAuth to /login

Every change knows who pulled the thread

Person, agent, task, session and prompt stay in history, and travel to Git as trailers when you export.

Mandate for claude-code

Expires in 8 hours

Repository
ana/acme
Bookmarks
agents/claude-code/*
Can
read, push, review
readpushreviewadmin

Mandates instead of tokens

A credential narrowed offline to one repository, a few operations and its own bookmarks. It expires, and revoking yours revokes it.

See who is working now

Each workspace reports what it is editing and claiming. The pill turns rose when two touch the same file. Press it.

Changes
Last 20 days
356changes
Oct 14Nov 2

What happened, day by day

Who did the work, and the conflicts under the line. This one is example data. The hub draws yours.

$ hb status --json
{ "changes": [
{ "path": "src/auth.rs", "status": "modified" }
], "conflicts": [],
"warnings": { "overlapping": ["src/auth.rs"] } }
$

Built for agents to drive

--json on every command, stable error codes, and hb mcp for any MCP client. Nothing ever waits for a keypress.

It speaks Git.

hb covers every command in git help -a, and a test checks that list against the installed Git. Clone, fetch and push work against any Git remote, and commits that came from Git keep their SHA. See every command

Several agents at once
GitWorktrees and branches by handHebrahb start: one workspace each
Two agents on one file
GitFound at merge timeHebraWarned while they work
Conflicts
GitStop the mergeHebraSaved in the change; work goes on
Who changed what
GitName and emailHebraPerson, agent, task, session, prompt
Credentials for agents
GitYour token, all of itHebraA narrowed, expiring mandate
Commands at the same time
GitFail on index.lockHebraRun side by side and merge their results
Staging area
GitAn index to manageHebraNone: the working copy is the change
Undo
GitDepends on the commandHebraEvery operation, files included
Interface for agents
GitParse human outputHebra--json everywhere and MCP

Heddle™ runs your checks on as few machines as it takes.

It skips checks whose inputs did not change, and starts and stops machines at your cloud provider for the rest. Watch one push.

Queue
Reused
warm-12 CPU
new-22 CPU
big-38 CPU
runningbootingup, idle↺ reused, nothing runs
0
reused
0
ran
0
booted
0
stopped
  1. same inputs · reuse
  2. warm machine · run
  3. wait 40 s > boot 25 s · start
  4. frees in 8 s · wait
  5. long build · bigger machine
  6. nothing coming · stop
  7. billed by the second · stop
  8. pushes every few minutes · keep

1.39

machine cost, cheap goal

A team's week: 2.75 with a 5-minute autoscaler, 1.53 with one machine per job

0 s

median wait

Same week: 22 s with the autoscaler, 25 s with a machine per job

~3×

less, counting time

Balanced goal: machines plus the hours people wait, 2.7× to 3.4× lower on team, agent and steady loads

Hetzner CloudDigitalOceanVultrDocker

Your API token, your goal, your limit. Every start and stop is logged with its reason.

Numbers from hb heddle simulate on made-up workloads and an example price list, 4 November 2026. Run it with your own prices.

Packages, images and releases on the same server.

npm and Docker talk to it with their own commands. Releases carry the files a build makes, and webhooks tell other systems what happened.

Pipelines and deployments, in one file

Steps, a matrix, checks that wait for others, containers with services, secrets masked in logs, artifacts, caches and retries. An environment adds approvals and its own runners and secrets.

[[check]]
name = "test"
matrix = { os = ["linux", "windows"] }
labels = ["${{ matrix.os }}"]
run = "cargo test"
inputs = ["crates/**", "Cargo.lock"]

[[check]]
name = "deploy"
needs = ["test"]
environment = "production"
secrets = ["DEPLOY_KEY"]
run = "./deploy.sh"

A VPS becomes a runner with one command

Make a token in the hub and run this on the machine. It registers itself and installs a service, so it comes back after reboots. Nobody signs in on it.

$hb runner register --server https://hebra.example.com --token hbr_… --name vps-1 --install

$ npm publish

+ @acme/ui@1.4.0

$ npm dist-tag add @acme/ui@1.4.0 stable

+stable: @acme/ui@1.4.0

An npm registry

Packages scoped by an account (@acme/ui). npm publish, install, dist-tag and unpublish, with a mandate in .npmrc.

$ docker push hebra.example.com/acme/app:1.0

1.0: digest: sha256:4f1c9e… size: 1573

$ docker pull hebra.example.com/acme/app:1.0

Status: Downloaded newer image

A container registry

The OCI distribution API: docker login with a mandate, then push and pull. Multi-platform images and shared layers are kept once.

v1.4.0 Faster clones

hb-x86_64-linux.tar.gz 6.1 MB

hb-aarch64-macos.tar.gz 5.8 MB

SHA256SUMS 220 B

Releases with files

A pushed tag with notes and the files a build made. Checks upload them with one curl; downloads are counted.

POST https://ci.example.com/hebra

X-Hebra-Event: release

X-Hebra-Signature-256: sha256=9b1e…

200 in 84 ms

Signed webhooks

Pushes, reviews, tasks, checks and releases POSTed as JSON, signed with HMAC-SHA256. Failed ones are tried three times, and every try is kept.

runs-on: ubuntu-latest → linux

${{ secrets.TOKEN }} → $TOKEN

actions/cache@v4 → cache

actions/upload-artifact@v4 → artifacts

Your GitHub workflows run

A repository without .hb/checks.toml runs .github/workflows as they are: jobs, needs, matrix, containers, services, secrets.

$ hb search retry webhook delivery

crates/server/src/webhooks.rs:41-80 deliver

pub(crate) async fn deliver(s: &Server, …

Changes 9b17d21c9ee6 feat: releases and signed webhooks

Find code by what it says

hb search ranks functions, types and sections by the words of the question, and the changes whose reason matches. Nothing to download.

How it holds up.

Measured on one desktop PC on 2 November 2026, with scripts/stress.sh and crates/load from the repository. Run them on yours.

500
agents at once
1,500 commands in 29 s, none failed
3,747
operations a second
One server on SQLite, 256 clients, p99 152 ms
16 MB
the hb binary
One file, for Windows, macOS and Linux

Try it on a repo you don't mind breaking.

Install the CLI, start in a project, and give two agents a workspace each. It takes about a minute.

  1. 1Install hb

    $curl -fsSL https://raw.githubusercontent.com/s-pl/hebra/main/scripts/install.sh | sh
  2. 2Start in a project, or clone one from Git

    $cd my-app && hb init
  3. 3Give an agent its own workspace

    $hb start "add OAuth login" --agent claude-code
  4. 4Let your agent use it

    $claude mcp add hebra -- hb mcp

Prefer a binary? Download hb for macOS, Linux or Windows from the releases page, with checksums and signed provenance.

Run your own server

The whole server and this web on your hardware, Apache 2.0. One binary with SQLite, or Docker Compose and Kubernetes with Postgres, S3 and NATS.

Self-hosting guide

Not there yet

  • Structural merge has grammars for 18 languages (30 with the extra-grammars build). Everything else merges by its layout: indentation, brackets, headings
  • A clone from Git keeps the Git commits at its bookmarks and tags, to push on top of them. Repositories with hundreds of tags keep more
  • Heddle runs machines at Hetzner Cloud, DigitalOcean, Vultr or in Docker. GPU clouds and spot prices are not there yet
  • The registries speak npm and the OCI API (Docker, Podman). Cargo, PyPI and Maven are not there yet
  • GitHub workflows run their run steps. Marketplace actions other than checkout, cache and upload-artifact are skipped
  • hb search ranks code by the words in it. Search by meaning is a proposal
  • Nobody hosts a public Hebra server yet, so you run your own