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.
Use the rodent emblem as the logo and the favicon
6416cab19d8c205d4ed643399f9a78596f5a31ca · Keenan Nemetz · 13d ago · parent 13cff33f
Use the rodent emblem as the logo and the favicon The header carried a letter in an accent chip and the favicon was a separate "v" glyph, so the forge had two marks that could drift apart. They are now one piece of artwork, served from the binary like every other static asset: a dark rounded tile with a white rodent face, named by the shell as both the icons and the header mark. The source drawing is a tile on a white page. Only the page is removed — a fuzz flood fill from the corner, which leaves the face opaque because the tile encloses it — so the mark has transparent corners and reads on either theme without a second set of assets. Sizes are 128 for the header (22 CSS px, so it survives a high-DPI screen), 32 and 16 for the tab, each square and centred because a favicon that is 31 pixels tall is a favicon some browser will letterbox. favicon.svg is removed; nothing else referenced it. A test now asserts that the three files are served as PNG and that the shell names them, so the next rename cannot leave every page pointing at a missing icon.
server/web/static/vole.css +6−8
| @@ -136,15 +136,13 @@ img { max-width: 100%; } | |||
| 136 | 136 | letter-spacing: -0.01em; | |
| 137 | 137 | } | |
| 138 | 138 | .brand:hover { text-decoration: none; } | |
| 139 | /* The rodent emblem: a dark tile with a white face, so the mark reads the same | ||
| 140 | on the light and the dark theme without a second set of assets. */ | ||
| 139 | 141 | .brand .mark { | |
| 140 | display: inline-grid; | ||
| 141 | place-items: center; | ||
| 142 | width: 20px; | ||
| 143 | height: 20px; | ||
| 144 | border-radius: 5px; | ||
| 145 | background: var(--accent); | ||
| 146 | color: var(--accent-fg); | ||
| 147 | font: 700 12px/1 var(--mono); | ||
| 142 | display: block; | ||
| 143 | flex: none; | ||
| 144 | width: 22px; | ||
| 145 | height: 22px; | ||
| 148 | 146 | } | |
| 149 | 147 | ||
| 150 | 148 | .topnav { display: flex; gap: 2px; } | |