Git Without a Forge: Peer-to-Peer Repositories
Part 15 of the VIMS Blog Network. A repository is what its maintainers sign, not what a server says it is.
The Forge Problem
Git was designed to be distributed. Every clone is a full copy, every commit is content-addressed, and no machine is special. Then we put it all on forges. Today the forge decides who can push, holds the issues and pull requests, owns the review history, and can take any of it away: a suspended account, a deleted organization, an outage on release day.
The git data survives in your clones. Everything around it does not. Issues, discussion, review, who maintains what: that lives in one company's database.
VIMS Git, the desktop app and git.vims.com, puts that layer back where git put the code: in data anyone can carry, that nobody can forge.
Repositories as Signed Events
In VIMS Git everything a repository is lives in Nostr events its maintainers sign (NIP-34):
- The announcement: who maintains it, where its git data lives, which relays carry its events.
- The state: which commit every branch and tag points at.
- The work: issues, patches, pull requests, comments and statuses, each attached to the repository.
No server is in charge. A GRASP server stores the git data, but only as the signed state allows: it accepts a push only once the maintainers' signed state naming those commits is on its relay. grasp.vims.com is one; a repository can name any other, or several. Because the state is signed, a relay or a storage server that lies about a branch is caught: the signature does not match.
This is the same protocol other NIP-34 tools speak, so repositories made with ngit or gitworkshop show up in VIMS Git, and the other way round. (Blog 08: Agent Identity)
Working Like a Forge
Home lists your repositories: create one, join one, reopen a recent one. Explore finds every public repository the relays and your peers know about, plus your private groups.
Open a repository to browse its files with syntax highlighting and read its README. People show up with their profile names and pictures, not bare keys.
Maintainers can edit a file on a branch straight from the app: VIMS commits, signs the new state and pushes, in one step. Pull requests land the way a forge's merge button does, without a local checkout:
- Merge: fast-forward when possible, otherwise a merge commit.
- Squash: the pull request becomes one commit.
If both sides changed the same lines incompatibly, the merge stops and says so. Nothing is force-resolved.
Private Repositories
Private repositories live on a group service. Your key signs you in to its relay (NIP-42), and every git request for that repository is signed too (NIP-98), so the server knows exactly who is reading and refuses everyone else. Public repositories take anonymous reads.
When the Network Isn't There
Every event that reaches you is also kept in VIMS's shared peer-to-peer graph. The app answers offline, and events still travel tab to tab and desktop to desktop when Nostr relays are down. Relays and GRASP servers stay the source of truth; the graph just means a relay outage is not your outage. (Blog 06: P2P Surfaces)
Backups You Actually Own
Back up your repositories to your own drive, drive.vims.com or the desktop's drive. Each repository gets a folder with:
- a git bundle of every signed branch and tag (
git clone <id>.bundlerestores it), - every signed event as
events.jsonl, republishable with any NIP-34 client, - where the repository lived (its relays and GRASP servers).
Private groups you own are saved with who may read them. Backups also run on their own when a device's last one is getting old. If every server disappeared tomorrow, the repository, its history and its discussion would still be yours. (Blog 04: Data and Knowledge)
Agents in the Loop
Because VIMS Git is part of VIMS, agents work with it through the same governed tools as everything else. One set of MCP tools covers NIP-34 repositories, GitHub and GitLab alike: read a repository, its tree, files, commits and code (vims_forge_get_repo, vims_forge_search_code…), open issues and pull requests, comment, review and merge (vims_forge_save_issue, vims_forge_save_pr, vims_forge_save_review, vims_forge_merge_pr). Writes wait for approval like any other consequential action, and a lockdown mode withholds issues and comments from anyone outside the signed maintainer set, so a stranger's issue can't prompt-inject your agent. Coder, the built-in IDE, works on your local checkouts with git built in. (Blog 12: SDK, Coder, Terminal, Blog 03: Security First)
Previous: The App Marketplace Next: CRM: Signed Records, Synced Peer to Peer
blog