Code collaboration for the small web
gitxt is a purely decentralised Git forge. No federation protocol. No central servers. No accounts on other people's machines. Just git, HTTP, and plain text files.
$ curl https://gitxt.mills.io/~prologic/gitxt/forge.txt # try it â gitxt hosts itself
# nick = gitxt
# type = forge
# clone = https://gitxt.mills.io/~prologic/gitxt.git
2026-09-01T10:00:00Z [issue] Crash on empty input
2026-09-01T12:30:00Z (#a3f9k2c) [patch] fix crash repo=https://bob.example/~bob/myproj.git ref=fix-crash
2026-09-01T13:00:00Z (#a3f9k2c) [merge] merged into main commit=deadbee
ðĄ Feeds, not federation
Every repository publishes a forge feed â an append-only, plain-text, twtxt-compatible file carrying its issues, patches and reviews. Other instances simply follow it over HTTP. Inspired by Twtxt & Yarn.social.
ð Patches are pointers
A patch entry names a clone URL and a branch on the contributor’s own
instance. The maintainer’s instance fetches it with ordinary git fetch,
renders the diff like a pull request, and merges with one click.
ðĄ Fully independent instances
Fork by pasting a feed URL: your instance clones the repo and follows the upstream feed. You file issues and push fixes on your own forge â the upstream maintainer reads them from theirs.
ð Your SSH key is your login
Web login by signing a challenge with ssh-keygen -Y sign. Pushes are
gated by a bearer token. No passwords, no OAuth, no third parties.
How it works
- Alice hosts
myprojon her instance; its feed lives athttps://alice.example/~alice/myproj/forge.txt. - Bob forks it onto his instance by pasting that feed URL.
- Bob files an issue and pushes a fix branch to his own fork, then
publishes a
[patch]entry pointing at his clone URL + branch. - Alice’s instance â following Bob’s feed, nudged by an optional ping â shows the issue and renders the patch: commits, diff, merge button.
- Alice merges (a real, local
git merge) and her feed records[merge]. Bob’s instance picks it up on its next poll.
If every optional ping in the world is lost, nothing breaks: plain HTTP polling delivers everything, eventually.
Quick start
Requires Go âĨ 1.24 and git.
go install gitxt.dev/cmd/gitxt@latest
gitxt init -u alice -b https://alice.example --key ~/.ssh/id_ed25519.pub
gitxt serve
Then create a repository, push to it, and hand the world one URL: your forge feed.
Learn more
- The gitxt forge feed specification
- Source code â MIT licensed
- Twtxt and Yarn.social, the inspiration
- Questions? Find @prologic@twtxt.net on twtxt