Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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