vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Materialise the activity feed in an events table
bca9ec24cbbb938f2d349d5f06e2c1f4fca06fcb · Keenan Nemetz · 9d ago · parent 73a732b1
Materialise the activity feed in an events table The previous commit read the feed as a UNION over the source tables. It stopped materialising events in Go, but SQLite still scanned and sorted the union to find a page, so a page cost the history. This replaces it with the design the feed actually wants: an `events` table with one row per event — issue and change opened, comment, approval, state change, release — carrying the time, actor, title and assignees the feed renders. Rows are indexed by (repository, time, id), so a repository page is an index range read; the instance page walks the global time index and filters by repository, and neither sorts history. An unfiltered page total is a stored per-repository count. Maintenance is part of the refresh that already exists: - an entity's events are replaced when the entity is reloaded, which is how a title or assignee edit reaches old events; - state changes are rebuilt into events for the entities the commits name, which also catches a close-and-reopen that leaves the tree where it started and an endpoint diff cannot see; - releases are refreshed from the tags after every push (post-receive) and after a release written in the browser, because a tag is a ref and no metadata commit announces it; - the stored count moves with the rows a refresh adds or removes. Measured with 100,000 events across 50 repositories: a repository page takes 0.3-0.5 ms (page 1 or page 20), an instance page 0.5-0.9 ms, and an unfiltered total 0.1 ms. A filtered total is the one query that scans, at 12 ms for 100,000 events. On the load harness, instance activity rises from 222 to 482 req/s and p50 from 18 ms to 8 ms; activity from 577 to 762 req/s. The repository feed no longer reads tags per request, and nothing reads the metadata branch to render a page.
docs/architecture.md +1−1
| @@ -61,7 +61,7 @@ auditable. | |||
| 61 | 61 | | Issues, requests, approvals, release pointers | The `vole` branch in each repository | It is the source | | |
| 62 | 62 | | CI records: finished attempts, steps, artifact pointers, and who reported them | `data/runs.db` | It is the source; back it up | | |
| 63 | 63 | | Accounts, instance roles, SSH keys, passkeys, enrollment links, sessions, access rules, locks, page-view counters | `data/users.db` | No; back it up | | |
| 64 | | Web/search index: issues, change requests, comments, state changes, release artifacts, and the `#42` alias numbering | `data/index.db` | Yes, with `vole admin index rebuild` | | ||
| 64 | | Web/search index: issues, change requests, comments, state changes, activity events, release artifacts, and the `#42` alias numbering | `data/index.db` | Yes, with `vole admin index rebuild` | | ||
| 65 | 65 | | CI queue, in-progress runs, contributor CI approvals | `data/runs.db` | Partly; in-progress work and approvals are lost | | |
| 66 | 66 | | CI logs | `data/logs/` | No; one file per attempt, back it up | | |
| 67 | 67 | | LFS files, build artifacts | `data/lfs/` | No; stored by content | | |