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.
Celebrate a landed change request, once
c8fa5759b293126f1b247abc746bc339791568cb · Keenan Nemetz · 13d ago · parent 53ff967b
Celebrate a landed change request, once A successful landing now redirects with ?merged=1, and app.js answers that parameter by fetching static/confetti.browser.js (canvas-confetti 1.9.3, ISC) and firing one burst. The flag is removed from the address as soon as it is read, so a reload, a bookmark or a shared link is an ordinary visit, and no page without the parameter ever requests the bundle. The library honours prefers-reduced-motion through disableForReducedMotion, and reset() before firing means a page restored from the back/forward cache cannot stack a second canvas. The asset is vendored the way htmx and Lucide are: the file is unmodified from the published npm tarball, with the license beside it, so script-src 'self' stays as it is. It is deliberately not in the page shell, because Static() serves assets uncompressed and a shell script would make every page pay for a celebration only one page uses. Refs #01M5XZ7T4R88BA9KV1KTSV7ZXP
docs/ui-plan.md +10
| @@ -290,6 +290,16 @@ time; nothing is loaded from a CDN and no template inlines CSS or JS. The passke | |||
| 290 | 290 | script is an ordinary asset (`static/auth.js`) and runs under the same CSP as the | |
| 291 | 291 | rest: `script-src 'self'`. | |
| 292 | 292 | ||
| 293 | One asset is fetched on demand. Landing a change request redirects to the request | ||
| 294 | page with `?merged=1`, and `static/app.js` answers that parameter by loading | ||
| 295 | `static/confetti.browser.js` (canvas-confetti 1.9.3, ISC, license at | ||
| 296 | `server/web/static/canvas-confetti.LICENSE`) and firing one burst. The parameter is | ||
| 297 | read once and removed from the address with `replaceState`, so a reload, a bookmark | ||
| 298 | or a shared link is an ordinary visit; the library honours | ||
| 299 | `prefers-reduced-motion` through `disableForReducedMotion`. Every other page pays | ||
| 300 | nothing for it, which is why the 25 KB bundle is acceptable where a | ||
| 301 | loaded-always library would not be. | ||
| 302 | |||
| 293 | 303 | The route table is `server/routes.go`, one function per surface (assets, global, | |
| 294 | 304 | auth, admin, repository, git). Routes are grouped by prefix rather than by | |
| 295 | 305 | registration order because `ServeMux` ranks by pattern specificity, and the | |