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.

Highlight with Prism in a worker and gzip text responses

306f36fcef89c145abcd0c5331453d0b179f37ce · Keenan Nemetz · 12d ago · parent e5542ac6

Highlight with Prism in a worker and gzip text responses

The code browser now names a blob's language and lets the browser colour it.
Chroma is gone: server/web/highlight.go is an extension table, and
static/prism-worker.js runs Prism — every language Prism ships — off the main
thread. The server sends escaped lines with their numbers and L# anchors, so a
page is complete and scrollable before any script runs and the worker only swaps
the contents of each line cell. The table covers 186 languages; a file it does
not claim stays plain rather than being coloured by a guess.

The bundle those grammars make is 545 KB, so the instance now gzips text
responses itself instead of relying on a proxy, and static assets carry a
content ETag so a browser revalidates with a 304 rather than re-downloading the
bundle on every code page. The raw-download route opts out with
Cache-Control: no-transform because it promises an exact Content-Length.

This also makes JavaScript a requirement rather than a nicety: the label and
assignee token inputs lose their noscript save buttons and their comma-separated
text fallback, and the docs say so.

Measured: release binary 26.08 MB -> 22.70 MB; /r/{repo}/code 11.1 KB -> 2.6 KB
over the wire; the Prism bundle 545 KB -> 206 KB gzipped, fetched once.

scripts/vendor-prism.py regenerates the bundle from Prism's components.json
require graph, and --check fails if the committed assets drift.

docs/operations.md +6

@@ -181,6 +181,12 @@ the linked sections explain each in full.
181 181 request arrives over TLS, or `public_url` is `https://`, Vole sends HSTS on
182 182 every response, not only on the pages that use passkeys. See
183 183 [Configuration](configuration.md).
184 - **Compression is already here.** Pages, the stylesheet, scripts and source
185 blobs are gzipped when the client asks for it, so a proxy in front should not
186 compress them again: double compression costs CPU and hides the `ETag`
187 revalidation that keeps the 545 KB Prism bundle to one download per browser.
188 Archives, LFS objects, Git responses and ranged downloads are passed through
189 untouched.
184 190 - **SSH firewalled.** The SSH listener is the only write transport and the only
185 191 place an account is authenticated. Expose it to the people who push, not to the
186 192 internet at large, and leave it on a port other than 22 unless you also run