Maintainer Mode
Sign in with GitHub
Work in progress. Maintainer Mode changes every day: pages, numbers and links can change or break. Tell us what is wrong or missing.

Plan: the nixpkgs event log

All docs · The source is docs/events.md.

Status: built in src/events.rs, except two parts: the path prefix filter, and the queues that read new events. It replaces the separate event pipeline (a message broker and five processes) with one log inside Maintainer Mode. The old pipeline stays on the host until this log has run for some time.

What it does

GitHub sends webhooks only for repositories you administer, so there is no webhook receiver. The sources are the Events API and GH Archive.

Sources

The GitHub event id is the key, so an event that both sources deliver is stored once.

Storage: one SQLite file per month

events/2026-10.sqlite, events/2026-11.sqlite, and so on. The current month takes writes. A past month does not change.

ColumnWhy
seqthe order on this host; the SSE id
idthe GitHub event id; unique
typePullRequestEvent, IssueCommentEvent, and so on
created_atfrom GitHub
actorthe login
numberthe pull request or issue, when there is one
payloadthe event JSON, zstd-compressed

A file per month keeps each file small, makes retention a file delete, and makes the backup a file copy. A query over many months attaches the files it needs.

The seq continues across files: a new month starts at the last seq plus one.

Reading

Copy outside the host

Any S3-compatible store, at a provider other than the host's. The default is bunny.net Storage, in an EU region with the S3 API, with Bunny CDN in front for the public downloads.

A restore reads the month files, then the daily files of the current month.

The store holds only public events. It needs no access control for reads, and it can be served in public through the CDN.

Size

Measured on 16 Oct 2026.

GH Archive, one full day (14 Oct 2026, 24 files, 318 MB gzip):

FigureValue
events on NixOS/nixpkgs143 (1 to 11 per hour)
event JSON, one line per event346,559 bytes (2.4 kB)
the payload field alone263,506 bytes
the day as NDJSON, zstd -1930,104 bytes (11.5 : 1)
the day as NDJSON, gzip -940,655 bytes
types56 PullRequestEvent, 25 DeleteEvent, 21 CreateEvent, 20 PushEvent, 12 IssueCommentEvent, 4 PullRequestReviewEvent, 3 PullRequestReviewCommentEvent, 2 IssuesEvent

Events API, one page (100 events, read at 12:22 UTC):

What this means:

Order

  1. One day of GH Archive for NixOS/nixpkgs: count and bytes.
  2. The month files and the poll.
  3. The GH Archive gap fill.
  4. GET /api/v1/events.
  5. The daily copy to the store.
  6. Then remove the old pipeline from the host.

Open