Git on Nostr

Git on Nostr puts the coordination layer of a git repository on Nostr, as NIP-34 (git collaboration) defines it: each maintainer announces the repository, every push republishes its branch and tag tips, and issues, patches and pull requests travel as events. Different tools publish these events and keep the code in different places; this page measures what the events themselves say.

Repositories
5,098
Active repositories (30 d)
846
1,557 pushed in the last 90 days
Pushes (30 d)
11,395
3,290 in the last 7 days
Maintainers
1,506
261 pushed in the last 30 days
GRASP or hashtree share
80.5%
4,106 repositories on GRASP servers or hashtree
Comments (30 d)
2,645
4,853 in the last 90 days

Cumulative repositories

last 12 months

Repositories by first-seen day.

  • before observation began: only what relays still served

New repositories per week

by kind of host today

Each repository in the week it was first seen, under every kind of host it is on today: one on a GRASP server and GitHub counts under both GRASP and Forges, so a week's bars can add up to more than its new repositories. No public host counts those with no public clone URL. The line is first-time maintainers: maintainers whose first kept announcement falls in the week, each counted once, ever.

  • partial week: data to Oct 20, 2026

Pushes per week

A push is a published state whose branch or tag tips moved; identical republishes and HEAD-only changes do not count. A hashtree repository's push is read from the announcement its git tool republishes with each branch or tag it pushes publicly; republishes less than two minutes apart count once.

  • partial week: data to Oct 20, 2026

Who pushed, per week

Distinct repositories with a push, and distinct maintainers pushing, each ISO week. 3,592 repositories have ever published a state; a hashtree repository pushes without one.

  • partial week: data to Oct 20, 2026
Copy link to What is counted

What is counted

Observation began on May 2, 2026 for repository announcements, on Jun 14, 2026 for states and GRASP lists and on Jun 18, 2026 for comments. Before that the archive holds only what relays still served when observation began, so the weekly charts start no earlier than the week of Jun 29, 2026 (the week holding Jul 1, 2026), after all three, and the cumulative chart fades the days before observation of announcements began.

SourceUsed forObserved since
kind-30617 (repo-announcements)the repository roster, and hashtree's pushes2026-05-02
kind-30618 (repo-states)branch and tag tips, and so pushes2026-06-14
kind-10317 (grasp-server-lists)the GRASP servers a user wants2026-06-14
kind-1111 (comments)replies on issues, pull requests, patches and repositories (the git subset)2026-06-18
kind-7 (reactions)stars (reactions to a repository)2026-06-19
kind-17 (external-content-reactions)Iris Git stars and unstars (reactions to a repository by its address)2026-10-11
kind-9735 (zap-receipts)zaps to repositories2026-06-14
kind-5 (event-deletion-requests)withdrawals by the author (author and repository pairs, not events)2026-07-01

The exclusion ledger

First matching rule wins. The rows are not all in one unit - each says what it counts.

9,259 announcements (one per author and identifier)
0 N0 Malformed identifier (announcements) - d is longer than 200 characters (the longest real one is 143) or contains a control character - a malformed identifier; counted here, written to no substrate row
−915 N1 Agent-profile squatters (announcements) - a clone or web URL under https://nostr.life/ - agent profiles squatting the kind, not repositories
−255 N2 Test harness (announcements) - a clone URL containing @example.com: or a bare euc tag - a test harness
−41 N3 Template copies (announcements) - name is the NIP-34 (git collaboration) placeholder <human-readable project name> - verbatim template copies
−145 N4 Date-named snapshots (announcements) - d is a bare date (20YYMMDD) - daily sync output, not a project
−1 N5 Automated republish loop (announcement) - republished at least 1,000 times with a median gap under 300 s - a bot re-signing its announcement
−412 N6 Deleted by its author (announcements) - a deleted / status=deleted tag, the name 'deleted', or a NIP-09 (deletion requests) self-authored kind-5 (event-deletion-requests) request naming the coordinate
−51 N7 Well-known private key (announcements) - signed by the public key of secret key 1 - anyone can sign as it
−93 N8a Private clone hosts only (announcements) - every clone URL is on a private or loopback host - nothing anyone else can clone
−1,581 N8b No public clone URL and no state (announcements) - no public clone URL (none at all, or only private or non-network values such as todo, testing or a bare dot) and no kind-30618 (repo-states) - nothing to clone, nothing ever pushed
−105 N9 Stateless personal forks (announcements) - a personal-fork topic and no kind-30618 (repo-states) - ngit 2.0-2.4 PR scaffolding and every hashtree personal fork, real forks included, since hashtree never publishes a state
−406 N10 Catalog of other people's projects (announcements) - signed by the key that re-published the awesome-nostr list's code-host entries as announcements - other people's projects, not repositories it maintains
5,254 announcements kept, forming 5,098 repositories (co-maintainers who list each other merge into one repository)

Also left out, in other units:

−1 State republish loops (state coordinate) - a kept repository's kind-30618 (repo-states) coordinate with at least 1,000 versions and a median gap under 120 s - its versions are left out of the push ledger
−1,191 Orphan states (state coordinates) - kind-30618 (repo-states) coordinates that are not a kept repository's member coordinate - ignored
−861 Ephemeral comments (comments) - kind-1111 (comments) carrying an expiration tag - declared temporary by their author (review bots)
−7,131 Imported comments (comments) - kind-1111 (comments) carrying an imported tag - copied in from elsewhere
−3,025 Mirrored comments (comments) - kind-1111 (comments) by a mirror key: at least 50 comments, more than 90% re-posting a foreign author line

Impossible timestamps are dropped and never admitted to a series: 0 events dated after the run instant and 0 dated before 2023, when NIP-34 (git collaboration) did not exist yet.

What these numbers are not

  • Not an exhaustive count of repositories on Nostr: only of the ones the relays we read served, after the ledger. A repository whose events never reached one of them is invisible.
  • Not commits: a push is one state publication that moved at least one branch or tag, or one hashtree push read from its republished announcements, however many commits it carried.
  • Not every hashtree push: hashtree publishes a push as its own root event, never as a kind-30618 (repo-states), so a hashtree repository's push is counted from the announcement its git tool republishes with a public push (302 of the pushes in 30 days). Private and link-visible pushes, pushes from Iris Git's web app and a repository's first push are not counted, nor is a push whose announcements did not reach us in time; an edit that republishes the announcement counts as one.
  • Not verified projects: a kept repository is an announcement that survived the ledger.
  • Not issue or pull-request counts: those events are not archived; discussion is counted by root kind network-wide and attributed to a repository only when the comment names one (see Collaboration).
  • Not net of every unstar: a kind-7 (reactions) star is withdrawn by a deletion request, and those are not read for reactions; an Iris Git star is withdrawn by its key's later "-", which is.
  • Not verified payments: a counted zap receipt is signed by a verified LNURL provider key, which makes it plausible, not proof that the invoice was paid; nothing checks the receipt against the provider or the invoice.
  • Not case-folded: identifiers that differ only by letter case or outer whitespace are separate repositories, as NIP-01 (protocol basics) compares identifiers exactly.
  • Not activity before Jun 14, 2026: a state from before observation began is not a push, and its date is only a lower bound on the last change.