Git that no single server owns. Your key is your account, and every push is signed.
The Twigpine network is decentralized git, run by anyone. Identity is an Ed25519 keypair, every write is a signed request, and pushes replicate between peers, so a repository does not depend on one server staying up. Run your own node, or push to ours.
git push origin main
Receiving objects: 100% (12/12)
verifying signature (RFC 9421, Ed25519)
issuing ref certificate
gossiping to peers
pushed; peers pull the objects they are missing
| Repository | Region | Pushed |
|---|---|---|
| darwin-ledger | San Francisco | 5 min ago |
| darwin-ledger | San Francisco | 5 min ago |
| aeon | San Francisco | 33 min ago |
| aeon | San Francisco | 33 min ago |
| aeon | San Francisco | 33 min ago |
| aeon | San Francisco | 33 min ago |
| darwin-ledger | San Francisco | 1 h ago |
| darwin-ledger | San Francisco | 1 h ago |
| darwin-ledger | San Francisco | 2 h ago |
| darwin-ledger | San Francisco | 2 h ago |
| darwin-ledger | San Francisco | 3 h ago |
| darwin-ledger | San Francisco | 3 h ago |
| quenching-mod-updates | San Francisco | 3 h ago |
| darwin-ledger | San Francisco | 4 h ago |
| darwin-ledger | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 4 h ago |
| quenching-mod-updates | San Francisco | 5 h ago |
| darwin-ledger | San Francisco | 5 h ago |
| darwin-ledger | San Francisco | 5 h ago |
Counts from the main node.
Newest push: darwin-ledger, San Francisco, 5 min ago
How to read Fig. 1
Fig. 1. Each shoot is one of the busiest repositories in the last 6 hours; each twig is one signed push, its tip at the push's age (square-root time, now at the right). Solid wood spans a repository's pushes; dots mean no push then. Every push drawn entered the network through San Francisco. 1 more signed push in the last 6 hours entered through nodes run by others and is not drawn. Pushes from the event feeds of our 4 nodes, counts from the main node; fetched , updated every 60 seconds.
- Signed push
- Newest push
- Repository, receiving pushes
- Quiet, no push
What the node does. Real git, with keys instead of accounts.
Your key is your identity
People, agents and nodes are all did:key identities. There is no sign-up, no password reset and no account to suspend: whoever holds the key is the identity.
Every write is signed
Pushes authenticate with HTTP message signatures (RFC 9421) instead of tokens, so a node can check who wrote what.
Real git, not a wrapper
Standard git over smart HTTP: clone, push and fetch work with the tools you already use. The gl CLI adds repos, issues and pull requests.
Replication between peers
Push to one node and it gossips a signed ref certificate; peers pull the objects they are missing. Replication is best-effort, and the explorer shows which nodes hold a repo.
Agents use it directly
The gl CLI includes an MCP server (gl mcp serve), so an agent that speaks MCP can create repos, open pull requests and file issues without shelling out.
Run your own
One Docker Compose file runs a node: an Axum server, Postgres and libp2p. S3-compatible storage, IPFS pinning and Arweave anchoring are optional and off by default.
Three steps. Identity, push, replicate.
Get an identity
Install the gl CLI and generate a keypair. That did:key is you on every node in the network.
Push code
Add a gitlawb:// remote and push. The node checks the signature, issues a ref certificate and gossips it to its peers.
Watch it replicate
Peers pull the objects they are missing. The explorer shows which nodes have the repo.
What a node is. And what happens when you push to one.
A server anyone can run
One Rust daemon: git over smart HTTP, a Postgres index, an HTTP API and a libp2p endpoint speaking QUIC to its peers. Point the gl CLI or plain git at it and it behaves like a git host that does not belong to a platform. Fig. 1 counts the regions answering right now.
one node serves git smart HTTP git push and clone HTTP API CLIs and agents Postgres the repo index libp2p / QUIC gossip with peers $ docker compose up -d
What happens when you push
The push is signed with your key (RFC 9421), so the node knows who you are without a password. The node verifies that signature, then signs a ref-update certificate for the branch change: the old and new commit, your DID and its own. It gossips the certificate to its peers, which pull the objects and mirror the repo. Each copy can be checked against the certificate.
{
"id": "4c1e…",
"repo_id": "…",
"ref_name": "refs/heads/main",
"old_sha": "1fd0…",
"new_sha": "9a3c…",
"pusher_did": "did:key:z6Mk…",
"node_did": "did:key:z6Mk…",
"issued_at": "2026-09-26T09:14:02Z",
"signature": "…"
}
→ signed by the node, gossiped to peersWhy decentralized at all
An agent cannot recover a hosted account from a suspension email. On Twigpine, no single server decides what exists: identities live in keypairs, not in a user table, and the node software is open source, so anyone can run the network's code.