vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Draw avatars with DiceBear instead of by hand
97f77001eed76cc287aeba532c4d670488121a18 · Keenan Nemetz · 8d ago · parent ca098f62
Draw avatars with DiceBear instead of by hand The marks this package drew itself were a design I kept losing arguments with. Avatars are now DiceBear's Shapes style, which is what the request asked for. DiceBear is JavaScript and Vole is a Go binary, so the split is: the server renders the account's initial on its Everforest ground, and an embedded bundle replaces it with the mark when the page runs. The initial is what a browser without scripts keeps, so nothing depends on the bundle arriving; the seed is the account name, so the same person draws the same mark everywhere; and the ground is read from the element, so vole.css remains the only palette. The bundle is core 9.3.1 plus Shapes 9.4.2 (MIT code, CC0 design), built with esbuild and committed like the other vendored scripts: 18KB, 5.5KB gzipped. Its source is scripts/avatars-entry.js, and the licence files beside it are inventoried in NOTICE, so the verify workflow's licence check keeps passing. No request leaves the instance and no avatar is stored. Two details worth naming. Each mark gets a unique clip-mask id, because SVG ids are document-wide and a directory page holds fifty of them. And the RDF metadata block DiceBear embeds is stripped: it is identical for every avatar and its licence is in NOTICE, so repeating it in the DOM would be weight without information.
docs/accounts-and-access.md +7−5
| @@ -29,11 +29,13 @@ commented on, and the repositories that work is in. Retiring an account keeps it | |||
| 29 | 29 | page, marked as no longer active, because every closed issue and merged change | |
| 30 | 30 | still refers to the name. | |
| 31 | 31 | ||
| 32 | Every name is drawn a mark: a single curled stroke on one of seven earthy | ||
| 33 | grounds, derived from the account name and nothing else, so the same person looks | ||
| 34 | the same on every page and between visits. The instance stores no image, accepts | ||
| 35 | no upload, and calls no avatar service. It is decoration, not an identifier; a | ||
| 36 | name is what identifies an account. | ||
| 32 | Every name is drawn an avatar from the account name, using DiceBear's Shapes | ||
| 33 | style and the Everforest palette. The mark is drawn in the browser from a script | ||
| 34 | embedded in the binary, so the same person looks the same on every page and | ||
| 35 | between visits; the instance stores no image, accepts no upload, and makes no | ||
| 36 | request to an avatar service. Until the script draws the mark the page shows the | ||
| 37 | account's initial on its ground, which is also what a browser without scripts | ||
| 38 | keeps. It is decoration, not an identifier; a name is what identifies an account. | ||
| 37 | 39 | ||
| 38 | 40 | What a profile counts is not public. Every number and every event is limited to | |
| 39 | 41 | the repositories the reader may open, so two people can see different totals for | |