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.
Give every account a profile page and a directory of accounts
a6b42433c087ab0c936e34a1d05cf488db7a92d6 · Keenan Nemetz · 8d ago · parent 727df386
Give every account a profile page and a directory of accounts Clicking a name now opens /u/<name>: the issues and changes somebody opened, the reviews they gave, the comments they left, and the repositories that work is in. The numbers and the feed are grouped reads of the same event rows the activity feed pages through, so a profile cannot disagree with the feed, and every read is limited to the repositories the reader may open. A private repository's work is not a number an outsider gets to learn, so two readers can see different totals and the page says what its numbers cover. /u lists the roster. Account names are public on this instance; their activity is not. Both pages ask crawlers to leave them out of an index. @name in an issue, a comment, a change request, or a release note links to the account it addresses, using the mention scanner CI already evaluates: what reads as an address on the page is what a workflow sees. A name that is not an account stays text, and code samples are skipped. Git author names are not linked and commit counts are not shown. A commit author is a name somebody typed, not the credential that proves an account, and the index only keeps the top eight authors of each default branch anyway.
docs/accounts-and-access.md +32
| @@ -21,6 +21,38 @@ Names are never reused: because the account row outlives retirement, retiring | |||
| 21 | 21 | someone keeps their name attached to them. An old reference can never silently | |
| 22 | 22 | point at a different person. | |
| 23 | 23 | ||
| 24 | ## Profiles and the people directory | ||
| 25 | |||
| 26 | Account names are public on an instance. `/u` lists everyone who has an account, | ||
| 27 | and `/u/<name>` is that person's profile: what they have opened, reviewed and | ||
| 28 | commented on, and the repositories that work is in. Retiring an account keeps its | ||
| 29 | page, marked as no longer active, because every closed issue and merged change | ||
| 30 | still refers to the name. | ||
| 31 | |||
| 32 | What a profile counts is not public. Every number and every event is limited to | ||
| 33 | the repositories the reader may open, so two people can see different totals for | ||
| 34 | the same account, and a private repository's work contributes nothing to a | ||
| 35 | stranger's view. The page says what its numbers cover instead of pretending they | ||
| 36 | are the whole history. The same rule covers the counts beside a name in the | ||
| 37 | directory. | ||
| 38 | |||
| 39 | A profile is derived, not stored. The numbers and the feed are read from the web | ||
| 40 | index (`data/index.db`), which is rebuilt from Git and from the CI records; no | ||
| 41 | profile is written to `data/users.db`. Keys, passkeys, sessions and a person's | ||
| 42 | instance role are not shown, with one exception: an instance admin sees the role | ||
| 43 | on the profile, because they can already see it on the admin pages. Git commit | ||
| 44 | authors are shown as text and never counted, because a commit's author is a name | ||
| 45 | someone typed, not the credential that proves an account. | ||
| 46 | |||
| 47 | Writing `@name` in an issue, a comment, a change request, or a release note links | ||
| 48 | to that account's profile. It is the same mention syntax a workflow's `mentioned` | ||
| 49 | filter evaluates ([Workflows](workflows.md)), so a name that reads as an address | ||
| 50 | on the page is the name a job sees. A name that does not belong to an account | ||
| 51 | stays plain text, and a mention inside a code sample is not a mention. | ||
| 52 | |||
| 53 | Both pages ask crawlers to leave them out of an index. The names are public; a | ||
| 54 | scraped roster is not what public has to mean. | ||
| 55 | |||
| 24 | 56 | Account data lives in `data/users.db`. It also holds passkeys, one-time | |
| 25 | 57 | enrollment links, browser sessions, repository access rules, and file locks. | |
| 26 | 58 | Credentials are public keys, and session or enrollment-link tokens are stored | |