clone

a personal forge on plain git: static pages, stacked-diff reviews, signed local ci, repo sites and releases

Take the paper texture off the pages

cat committed 405cc89
commit
405cc8922e99bb7b3d7cd79223e4b5820c965d5a
parent
18f36c258544798926347c1bfabdae0b979a76ea
author
cat <admin@dev.site>
ci
✓ passed in 75s, signed by cat
kind
chore risk score 1.3 of 3, Jev's estimate
review
#13 A design system: tokens, three fonts, no caps, real controls
ci attestation
forge-attestation 1
type ci
commit 405cc8922e99bb7b3d7cd79223e4b5820c965d5a
tree 40e482b4837b5903f930b653ffe44e5469eeff0b
script .forge/ci 38df37c0d5a6382f60569079a0dd821094e37e4a
result pass
exit 0
started 2026-10-19T02:55:22Z
duration 75s
runner (not shown here; refs/notes/ci has it)
system Darwin 25.5.0 arm64
env host
log sha256:25a792fd406b863213bd2ef581ba77a44ae2b0cc717c266868d35c67ba078737 253 lines
|remote: review #4: /dami/greet/reviews/4/
|pushed wip/i18n
|9ad6211 running .forge/ci: greet.sh: say what it is
|  | sh: /bin/sh
|  | ok   greet
|9ad6211 pass in 0s, signed
|pushed main
|remote: review #4: /dami/greet/reviews/4/
|pushed wip/i18n
|c91d5ad running .forge/ci: wave at the world
|  | sh: /bin/sh
|  | FAIL greet : got 'hello, world o/', want 'hello, world'
|c91d5ad fail in 1s, signed
|forge: 1 commit(s) did not pass
|remote: review #6: /dami/greet/reviews/6/
|pushed ana/wave
|faf335e running .forge/ci: update the test for the wave
|  | sh: /bin/sh
|  | ok   greet
|faf335e pass in 0s, signed
|remote: review #6: /dami/greet/reviews/6/
|pushed ana/wave
|warning: You appear to have cloned an empty repository.
|site home: deployed e51edc7 -> /sites/ana/dotfiles/home/
|created ana/notes
|remote: review #1: /ana/notes/reviews/1/
|pushed ana/todo
|landing #1 A todo list: ana/todo -> main
|39c017b running .forge/ci: web, server and Python versions of greet
|  | sh: /bin/sh
|  | ok   greet
|39c017b pass in 0s, signed
|pushed main
|109a293 running .forge/ci: messages: notes for the later regions
|  | sh: /bin/sh
|  | ok   greet
|109a293 pass in 0s, signed
|remote: review #7: /dami/greet/reviews/7/
|pushed dami/regions
|created dami/forge
|warning: You appear to have cloned an empty repository.
|site guide: deployed 683d359 -> /sites/dami/forge/guide/
|(node:68463) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built ana/dotfiles in 0s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.LimtiJ/wt/demo/root/.forge/www
|(node:68587) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built ana/notes in 1s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.LimtiJ/wt/demo/root/.forge/www
|(node:68724) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built dami/forge in 1s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.LimtiJ/wt/demo/root/.forge/www
|(node:68854) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built dami/greet in 1s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.LimtiJ/wt/demo/root/.forge/www
|(node:69538) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time
|(Use `node --trace-warnings ...` to show where the warning was created)
|built - in 0s -> /var/folders/b4/mv8w4c8j0zj0_mldppxdbdw00000gn/T/forge-ci.LimtiJ/wt/demo/root/.forge/www
|226 of 226 pages render the same without 11ty
|guide: 4 files, links ok
|ok

Signature: good, cat

4 files changed, +7 -20
Mlib/assets.ts11+++++------
Dsite/assets/paper-dark.webpbin
Dsite/assets/paper.webpbin
Msite/assets/style.css16++--------------
M lib/assets.ts +5 -6
@@ -1,7 +1,6 @@
11 // Assets under content-hashed names, /assets/style.<hash>.css, so browsers2-// can cache them forever: the stylesheet, the logo, the page textures, the3-// vendored scripts, our4-// TypeScript with its types stripped, mermaid, sqlite-wasm (its script and2+// can cache them forever: the stylesheet, the logo, the vendored scripts,3+// our TypeScript with its types stripped, mermaid, sqlite-wasm (its script and54 // its .wasm, for code search), and @simplewebauthn/browser (passkeys, on65 // the sign-in page). 11ty's bundle plugin76 // writes the templates' own CSS next to them, also named by a hash.
@@ -43,7 +42,7 @@ export interface Asset {
4342 data: Buffer;4443 }4544 46-// By short name: style, logo, paper, paper-dark, fixi, ssexi, diffs, keys, live,45+// By short name: style, logo, fixi, ssexi, diffs, keys, live,4746 // search, query, codesearch, login, ui, mermaid, sqlite3, sqlite3wasm, webauthn.4847 export type Assets = Record<string, Asset>;4948
@@ -59,8 +58,8 @@ export function assets(): Assets {
5958 if (memo?.key === key) return memo.assets;6059 // Our scripts import each other as './query.ts', which Node and tsc read6160 // as it is; shipped, that is the other file's hashed name, so a script's62- // name changes with what it imports. The stylesheet's url(./paper.webp)63- // becomes the image's hashed name the same way.61+ // name changes with what it imports. A url(./x.webp) in the stylesheet62+ // becomes that file's hashed name the same way.6463 const local = (base: string, dep: string): Asset => {6564 const d = files.find(([, b, p]) => b === dep && path.dirname(p) === src);6665 if (!d) throw new Error(`${base} links ./${dep}, which is not in site/assets`);
D site/assets/paper-dark.webp +0 -0

Binary file.

D site/assets/paper.webp +0 -0

Binary file.

M site/assets/style.css +2 -14
@@ -3,8 +3,7 @@
33 template or include ({% css %}), and reaches only the pages that use it. */44 /* The look: square corners, content on the page between 1px rules, labels55 in small uppercase monospace, one accent (#3148F6) for links, the current6- tab's bar, focus and primary actions, and a faint paper texture behind it7- all, the same paper in dark mode. */6+ tab's bar, focus and primary actions, on a plain page. */87 :root {98 --bg: #e9e9e9;109 --fg: #1c2127;
@@ -31,10 +30,6 @@
3130 --fail: #c7162b;3231 --warn: #b46a00;3332 --merged: #3148f6;34- --texture: url(./paper.webp);35- --texture-size: 448px 300px;36- --texture-blend: multiply;37- --texture-opacity: 0.35;3833 --sans: "Ubuntu", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;3934 --mono: ui-monospace, SFMono-Regular, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;4035 color-scheme: light dark;
@@ -63,19 +58,12 @@
6358 --fail: #f0606e;6459 --warn: #e3a33b;6560 --merged: #8e9bff;66- --texture: url(./paper-dark.webp);67- --texture-blend: screen;68- --texture-opacity: 0.32;69- }61+ }7062 }7163 7264 *, ::before, ::after { box-sizing: border-box; border-radius: 0; }7365 html { -webkit-text-size-adjust: 100%; }7466 body { margin: 0; background: var(--bg); color: var(--fg); font: 15px/1.5 var(--sans); }75-/* The texture: CC0 scans (ambientCG), fixed to the window behind the76- content, so scrolling never repaints it. */77-body::before { content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none; background: var(--texture) 0 0 / var(--texture-size) repeat; mix-blend-mode: var(--texture-blend); opacity: var(--texture-opacity); }78-@media (prefers-reduced-transparency: reduce) { body::before { display: none; } }7967 a { color: var(--link); text-decoration: none; }8068 a:hover { color: var(--deep); text-decoration: underline; }8169 :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }