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.
Offer instance theme packs in the appearance picker
f7a34d8749054b7ff9e1a304a3fc90ccf3786877 · Keenan Nemetz · 1d ago · parent bc95767f
Offer instance theme packs in the appearance picker Add profile/themes/index.json and one scoped stylesheet per theme. The loader validates ids and names, pairs each manifest entry with profile/themes/<id>.css, and exposes the list to the account picker and to theme.js before first paint. Theme stylesheets are linked before profile/custom.css, so an instance-wide override still wins. The starter repository now includes an empty manifest and documents the format in its root README. The configuration docs and the Admin Configuration path table describe the same convention.
server/web/page.go +13
| @@ -63,12 +63,25 @@ type Page struct { | |||
| 63 | 63 | // built-in assets so a theme wins without removing the defaults. | |
| 64 | 64 | InstanceCSS string | |
| 65 | 65 | InstanceFavicon string | |
| 66 | // InstanceThemes are the selectable theme stylesheets from the instance | ||
| 67 | // repository. The chrome links all of them; each is scoped to its own | ||
| 68 | // data-theme value, so only the selected one applies. | ||
| 69 | InstanceThemes []instanceThemeView | ||
| 66 | 70 | // memo is what this request has already read. It is unexported because no | |
| 67 | 71 | // template may depend on it: the header only needs it to stop repeating work | |
| 68 | 72 | // the handler did. | |
| 69 | 73 | memo *requestMemo | |
| 70 | 74 | } | |
| 71 | 75 | ||
| 76 | // instanceThemeView is one theme in the Appearance picker and its stylesheet | ||
| 77 | // URL. The URL carries the commit so a push cannot leave a browser on a stale | ||
| 78 | // theme file. | ||
| 79 | type instanceThemeView struct { | ||
| 80 | ID string | ||
| 81 | Name string | ||
| 82 | URL string | ||
| 83 | } | ||
| 84 | |||
| 72 | 85 | // pageSection maps a request path to the global destination it belongs to. The | |
| 73 | 86 | // landing page is Home; a repository page belongs to Repositories, which is not | |
| 74 | 87 | // the same place, so the bar does not mark Home current there. | |