v0.21.0 ef38ad0

ASSETS.md RawHistoryFolder

Vendored web assets

static/ is embedded in the binary and served under /-/static/ with content-hashed names. Nothing is fetched at runtime.

File What Source SHA-256
static/js/htmx.min.js htmx 4.0.0 (BSD Zero Clause, static/js/htmx-LICENSE) mockups/assets/htmx/htmx.min.js of the design e484d9171a9db30a39c8f16e3d709d4137f3211c659f8e6125816635033d593f
static/js/hx-live.min.js htmx 4 hx-live extension mockups/assets/htmx/ext/hx-live.min.js adf9b90949d57baf20dc2eaf1d1fd46c81347ac82c090a5e2912ce6b37726734
static/js/hx-sse.min.js htmx 4 hx-sse extension mockups/assets/htmx/ext/hx-sse.min.js 8a834680c4000a9034d79228872372a92e140c810a075cb6d4a76690dfc13085
static/js/ermite.js key sequences to k-* events, the functions the keys and inputs call (window.ermite), the live fragments (ermiteLive), the diff table of contents observer mockups/d/js/ermite.js, extended here
static/js/log.js the live log of a running job (window.ermiteLog, tested in Node by jstest/log.test.mjs) written here
static/js/files.js the Files view: a tree whose directories open in place and walk by keyboard (window.ermiteTree, tested in Node by jstest/tree.test.mjs), the fuzzy file finder and the palette's file hits (window.ermiteFinder; its core is tested in Node by jstest/files.test.mjs) written here
static/js/passkey.js passkey sign-in on /-/login and passkey registration on /-/passkeys: a delegated click handler on [data-passkey] that runs the WebAuthn JSON API flow (window.ermitePasskey; tested in Node by jstest/passkey.test.mjs) written here
static/css/56-chroma.css syntax classes of the code view, mapped to the --syn-* tokens (no colour of its own) generated by go run scripts/chroma-css.go from chroma's token classes
static/css/*.css native CSS, served as one stylesheet in name order; relative url(fonts/…) and url(icons/…) become hashed URLs written here
static/fonts/atkinson-next.woff2, atkinson-next-italic.woff2 Atkinson Hyperlegible Next, variable weight, latin subset (SIL OFL 1.1, static/fonts/OFL-next.txt) Google Fonts 18b2a1a39a2fa298b0ba5390aca68462669826c90925656f1c1f6796e0e1bbaf, 4a5037bfaf6680f40147407407ec09fa42925774bde809a579283d27f9f08106
static/fonts/atkinson-mono.woff2 Atkinson Hyperlegible Mono, variable weight, latin subset (SIL OFL 1.1, static/fonts/OFL-mono.txt) Google Fonts 2706b1ee4f452e744ea91f7e4908cbde9c5d35521bf5ffffc71a382a2de89613
static/icons/*.svg interface icons, used as CSS masks; brand.svg is a grey picture shown as is. Only the icons in use are copied, one file each: branch, search, tag, file, chevron, user, key, log-in, log-out, download are Lucide 1.8 (git-branch, search, tag, file-text, chevron-down, user-round, key-round, log-in, log-out, download; ISC, https://lucide.dev/license) Lucide; brand.svg written here
static/app/*.png icons of the installed web app (manifest, apple-touch-icon), rendered from brand.svg with resvg; the maskable and Apple icons have the picture in the safe zone on #181818 generated here
static/sw.js the service worker of the installed app: a network-only passthrough (no cache), served at /-/sw.js with Service-Worker-Allowed: / and revalidated on each check (not a hashed asset) written here
static/rules.json speculation rules: prefetch the light same-origin pages on hover (Speculation-Rules header); the heavy ones (tree, blob, commit, commits, compare, refs, raw, MR "since") are excluded, each costs several Git reads on the server written here

The three htmx files are the exact files the approved mockup was built with. To upgrade, replace the file, update the checksum here, and run the web tests (go test ./internal/app -run TestWeb).

*_templ.go files are generated by go tool templ generate (templ is pinned in go.mod) and committed; scripts/templ-drift.sh fails when they are stale.

source
1# Vendored web assets
2
3`static/` is embedded in the binary and served under `/-/static/` with
4content-hashed names. Nothing is fetched at runtime.
5
6| File | What | Source | SHA-256 |
7| --- | --- | --- | --- |
8| `static/js/htmx.min.js` | htmx 4.0.0 (BSD Zero Clause, `static/js/htmx-LICENSE`) | `mockups/assets/htmx/htmx.min.js` of the design | `e484d9171a9db30a39c8f16e3d709d4137f3211c659f8e6125816635033d593f` |
9| `static/js/hx-live.min.js` | htmx 4 `hx-live` extension | `mockups/assets/htmx/ext/hx-live.min.js` | `adf9b90949d57baf20dc2eaf1d1fd46c81347ac82c090a5e2912ce6b37726734` |
10| `static/js/hx-sse.min.js` | htmx 4 `hx-sse` extension | `mockups/assets/htmx/ext/hx-sse.min.js` | `8a834680c4000a9034d79228872372a92e140c810a075cb6d4a76690dfc13085` |
11| `static/js/ermite.js` | key sequences to `k-*` events, the functions the keys and inputs call (`window.ermite`), the live fragments (`ermiteLive`), the diff table of contents observer | `mockups/d/js/ermite.js`, extended here | |
12| `static/js/log.js` | the live log of a running job (`window.ermiteLog`, tested in Node by `jstest/log.test.mjs`) | written here | |
13| `static/js/files.js` | the Files view: a tree whose directories open in place and walk by keyboard (`window.ermiteTree`, tested in Node by `jstest/tree.test.mjs`), the fuzzy file finder and the palette's file hits (`window.ermiteFinder`; its core is tested in Node by `jstest/files.test.mjs`) | written here | |
14| `static/js/passkey.js` | passkey sign-in on `/-/login` and passkey registration on `/-/passkeys`: a delegated click handler on `[data-passkey]` that runs the WebAuthn JSON API flow (`window.ermitePasskey`; tested in Node by `jstest/passkey.test.mjs`) | written here | |
15| `static/css/56-chroma.css` | syntax classes of the code view, mapped to the `--syn-*` tokens (no colour of its own) | generated by `go run scripts/chroma-css.go` from chroma's token classes | |
16| `static/css/*.css` | native CSS, served as one stylesheet in name order; relative `url(fonts/…)` and `url(icons/…)` become hashed URLs | written here | |
17| `static/fonts/atkinson-next.woff2`, `atkinson-next-italic.woff2` | Atkinson Hyperlegible Next, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-next.txt`) | Google Fonts | `18b2a1a39a2fa298b0ba5390aca68462669826c90925656f1c1f6796e0e1bbaf`, `4a5037bfaf6680f40147407407ec09fa42925774bde809a579283d27f9f08106` |
18| `static/fonts/atkinson-mono.woff2` | Atkinson Hyperlegible Mono, variable weight, latin subset (SIL OFL 1.1, `static/fonts/OFL-mono.txt`) | Google Fonts | `2706b1ee4f452e744ea91f7e4908cbde9c5d35521bf5ffffc71a382a2de89613` |
19| `static/icons/*.svg` | interface icons, used as CSS masks; `brand.svg` is a grey picture shown as is. Only the icons in use are copied, one file each: `branch`, `search`, `tag`, `file`, `chevron`, `user`, `key`, `log-in`, `log-out`, `download` are Lucide 1.8 (`git-branch`, `search`, `tag`, `file-text`, `chevron-down`, `user-round`, `key-round`, `log-in`, `log-out`, `download`; ISC, https://lucide.dev/license) | Lucide; `brand.svg` written here | |
20| `static/app/*.png` | icons of the installed web app (manifest, `apple-touch-icon`), rendered from `brand.svg` with resvg; the maskable and Apple icons have the picture in the safe zone on `#181818` | generated here | |
21| `static/sw.js` | the service worker of the installed app: a network-only passthrough (no cache), served at `/-/sw.js` with `Service-Worker-Allowed: /` and revalidated on each check (not a hashed asset) | written here | |
22| `static/rules.json` | speculation rules: prefetch the light same-origin pages on hover (`Speculation-Rules` header); the heavy ones (tree, blob, commit, commits, compare, refs, raw, MR "since") are excluded, each costs several Git reads on the server | written here | |
23
24The three htmx files are the exact files the approved mockup was built with.
25To upgrade, replace the file, update the checksum here, and run the web tests
26(`go test ./internal/app -run TestWeb`).
27
28`*_templ.go` files are generated by `go tool templ generate` (templ is pinned
29in `go.mod`) and committed; `scripts/templ-drift.sh` fails when they are stale.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 4

Tags 45

↑↓ moveenter openesc close