Archilyzer · Source

archilyzer

Archilyzer
git clone https://archilyzer.pages.dev/source/archilyzer.git
Log | Files | Refs | README | LICENSE

commit 98d9528e164548769d897fc0f3f18e334a4454c7
parent e8421a7b1d1415fe2a147f5a021b9d4e9e210c5c
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Sat, 26 Sep 2026 18:38:09 -0400

plans: slice O as shipped — the Ko-fi mark on every site (the official symbol, last in every footer's social row; the hub's text link gone; both workers cache it) and the export [Unreleased] bullet

Gates: tsc clean; common 1,956; export build ok (61 s); e2e site-branding
7/7, hub official-instances 3/3, export full 204/204 (8.8 min), e2e:hub
24/24 (54.7 s); the flipped tests fail on main's Footer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Diffstat:
Mexport/CHANGELOG.md | 1+
Mplans/release-10.md | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 129 insertions(+), 0 deletions(-)

diff --git a/export/CHANGELOG.md b/export/CHANGELOG.md @@ -4,6 +4,7 @@ - **The hub lists its official instances in the homepage's order, and each wears one colour everywhere.** The cards and the scope chips follow the homepage (most transcripts first) instead of `hub-sites.json`'s alphabetical order. An archive whose site sets no accent wears its homepage card's colour, and now on every surface: its card, its chip's dot, the left edge of its search results and its channel group. Before, it had a card stripe and nothing else. The hub waits for `/hub-summary.json`, which is requested together with the list, before it lists the official instances, so they never reorder a moment later. - **The hub's Ask AI searches only the archives the scope chips leave in.** An archive switched off on the hub's front page is not fetched on `/ask` either, so the chat answers from what the search showed. It still waits for every archive in scope before it answers. With every archive switched off, the question box is disabled and one line under it says why. Before, a question went out over no records at all. - **A member archive with no live chat is ready about a second sooner on the hub.** Its missing subs manifest (a 404) is read as "no live chat" at once, instead of as an error and a second request. A subs manifest that fails for any other reason is asked for once more. If it fails again, the archive is searched without its live chat, and its chip reads ready. +- **Every archive's footer ends with Ko-fi's mark.** The last icon of the footer's social row, on every site and on the hub, is Ko-fi's official symbol in Ko-fi's own colours. It links the project's Ko-fi page (`https://ko-fi.com/archilyzer`) in a new tab. Its accessible name is "Ko-fi", and no text sits beside it. The file is served as `/kofi-symbol.svg`, exactly as Ko-fi publishes it, and both service workers keep it for offline use, as they do the icons. The hub's "Ko-fi" text link is gone, so each footer has one Ko-fi link. ## [0.9.0] - 2026-09-26 - **A reader picks a ground and an accent; the five theme families are gone.** The header's theme menu has **Base** (System, Light, Sepia, Dark) and **Accent** (Signal, Brass, Vermilion, Violet, Sakura, Blue, Green, with the site's own tagged *default*, and *Site colour* first on a site with a custom hex). The toggle beside it cycles System → Light → Sepia → Dark; on a phone both lists are in the menu sheet. A site opens on the reader's system setting in the accent from its `site.json` (a named id such as `brass`, or a hex), rendered as `<html data-accent>` so it is right before any script runs; the hub opens on Dark in Signal, already in the server markup. A reader's accent is stored only while it differs from the site's. A stored theme from before carries over once (Archive light becomes Sepia) and the old keys are deleted. Type is Archivo, IBM Plex Sans and IBM Plex Mono; status text reads at 4.5:1 on its tinted fill on every ground; charts have fixed colours per ground; the browser bar follows the ground (a light/dark pair for a site, dark for the hub). diff --git a/plans/release-10.md b/plans/release-10.md @@ -1166,6 +1166,134 @@ nit N1 taken). **Gates** (`m-gate4.log`): tsc clean (whole workspace); **mcp 269/269**, 16 s. +### Slice O, as shipped — the Ko-fi mark on every site (2026-09-26) + +Branch `export/kofi-mark` off `main` `9860bcbe`, worktree `/home/user/Projects/export-kofi-mark`, +one Opus implementer. The plan is [`kofi-mark-on-sites.md`](kofi-mark-on-sites.md), Implementation +items 1–5. The operator's 2026-09-26 ruling supersedes the 2026-09-25 one ("a site build carries no +Ko-fi link"). Every export build, each site and the hub, now ends its footer's social row with +Ko-fi's official symbol. "No copy" still holds: the accessible name is exactly "Ko-fi" and nothing +else is visible. The homepage is untouched and keeps its bare text link (decision 4). + +**The asset.** `export/public/kofi-symbol.svg` is `kofi_brandasset/kofi_symbol.svg` from +`~/Downloads/kofi_brandasset.zip`, byte-for-byte: 3,234 bytes, sha256 +`f5a2d5f1abb5c7f13392ecf6e7d5dffc8bef77917ab59c28a6080deab52f5078`. The same hash comes from the +unpacked copy, from `unzip -p` of the zip, from the tracked file and from the build's +`out/kofi-symbol.svg`. It is a tracked real file beside the five starter SVGs. `.gitignore` names +the generated `export/public` entries one by one, so nothing ignores it, and the worktree's +`export/public` links from the primary leave it alone. + +**The footer** (`export/app/components/Footer.tsx`). +- The social `<ul>` now always renders. The operator's links are mapped first (an empty list maps + to nothing), then one last `<li>`: `<a href={KOFI_URL} title="Ko-fi" aria-label="Ko-fi" + target="_blank" rel="noopener noreferrer">` holding `<img src="/kofi-symbol.svg" alt="" + width={20} height={20} className="block w-full h-full object-contain">`. `object-contain` + letterboxes the 241 × 194 mark in the 20 px square (20 × 16). +- It never goes through `normalizeSocialSvg` / `sizeSocialSvg`, so it keeps Ko-fi's colours. The + hover is `hover:opacity-80`, where the operator's icons change colour. +- The `<img>` carries `eslint-disable-next-line @next/next/no-img-element`, umtool's precedent. The + export's images are `unoptimized`, and `next/image` adds nothing for an SVG. `eslint` on the four + changed TS files is clean. +- **The hub's "Ko-fi" text link is removed**, and its comment block is replaced by the plan's. +- `KOFI_URL`'s comment in `common/lib/project.ts` said "A site build never shows it". It now says + where the link renders. This is a comment-only edit outside `export/`. + +**Offline** (decision 4). Neither service worker precaches anything, and `offlineCache.ts` +enumerates only archive documents. Both workers route by prefix, so `/kofi-symbol.svg` fell +through to the network, and an installed app opened offline would draw an empty 20 px link. Both +workers (`site-sw.js`, `sw-hub.js`) now give it the `/icons/` rule, network-first into `shell-v2`. +No cache was renamed, and nothing is evicted. `common/lib/archive/serviceWorkerRouting.test.ts` +gains +1 per worker: online, the mark is fetched and stored; offline, it is served. The test fails +with the site worker's old condition. + +**The specs.** +- One helper, `expectKofiMarkLast(page)` in `export/e2e/helpers.ts`, which the hub spec already + imports from. It checks: + - exactly one Ko-fi link in the footer, and one on the page (`/ko-?fi/i` and `a[href=KOFI_URL]`), + so the hub's text link is gone; + - the link is visible, with href `KOFI_URL`, `target=_blank` and `rel="noopener noreferrer"`; + - its `innerText` is empty; + - it holds an `img[src="/kofi-symbol.svg"]` with `alt=""`, which is drawn (`complete && + naturalWidth > 0`); + - it is the LAST `<li>` of the footer's social `<ul>`; + - `/kofi-symbol.svg` is served 200 as `image/svg+xml`, with the official sha256. +- `site-branding.spec.ts`: "a site build carries no Ko-fi link" becomes "every build carries the + Ko-fi mark, last in the social row". It adds that the row has two items and the fixture's GitHub + link is first. +- `e2e-hub/official-instances.spec.ts`: "the hub footer carries a bare Ko-fi link" becomes "the + hub footer carries the Ko-fi mark, once, last in the social row". +- **The tests bite.** With `main`'s `Footer.tsx` put back, both fail: + - the site test: `toHaveCount(1)`, received 0; + - the hub test: the empty-text check, received "Ko-fi". + +**Docs.** There is no `export/README.md`, and `AGENTS.md` does not mention Ko-fi, so neither +changes (item 4). `SITE.md` and `SETTINGS.md` are generated and gain no key. The changelog bullet +is in `export/CHANGELOG.md` `[Unreleased]`, which every site's `/changelog` reads, beside L1's +three hub bullets. + +| sha | what | +|---|---| +| `17ee125d` | `export:` vendor the official `kofi_symbol.svg` as `public/kofi-symbol.svg` (sha256 in the message) | +| `f27b1a83` | `export:` the mark as the last `<li>` of every footer's social row; the hub's text link removed; the `KOFI_URL` comment | +| `f144c85e` | `export:` both service workers cache `/kofi-symbol.svg` like the icons; `serviceWorkerRouting.test.ts` +2 | +| `7e0989e8` | `export(e2e):` `expectKofiMarkLast`; the site-branding and hub official-instances tests flipped | +| _this_ | `plans:` this record; the `export/CHANGELOG.md` `[Unreleased]` bullet | + +**Gates**, all from the worktree root; the logs are `o-*.log` in the job's scratch dir. +- **tsc:** + - `pnpm -r --no-bail --workspace-concurrency=1 exec tsc --noEmit` is clean on the tip tree, in + 109 s (`o-tsc2.log`). + - The two intermediate states are clean too: `f27b1a83` and `f144c85e`, each with the later + edits stashed, under `--filter export --filter yt-dlp-transcript-common` (`o-tsc-c1.log`, + `o-tsc-c2.log`). + - The asset commit has no code, and the base tree was clean (`o-tsc1.log`). +- **common 1,956/1,956** (1,954 + the 2 worker tests), 41 s. Editor unit, `test:scripts` and mcp + were not run, because nothing under `editor/`, `scripts/`, `mcp/` or `umtool/` changed. +- **`pnpm --filter export exec next build`: ok, in 61 s.** + - `out/kofi-symbol.svg` has the official sha256, and `out/index.html` carries the mark. + - The one Turbopack warning is the existing NFT trace of `export/next.config.ts`, which is not + this slice. +- **e2e** (queued, detached, `node scripts/worktree.mjs run -- …`; no queue wait on any run): + + | run | passed | failed | time | + |---|---|---|---| + | `e2e site-branding.spec.ts` | 7 | 0 | 45.4 s | + | `e2e:hub official-instances.spec.ts` | 3 | 0 | 17.3 s | + | bite check (`main`'s Footer, `-g "Ko-fi"`), site + hub | 0 | 1 + 1 | — | + | **export full** | **204** | **0** | **8.8 min** | + | **`e2e:hub` full** | **24** | **0** | **54.7 s** | + + - `e2e:2origin` was not run: it asserts nothing about the footer. + - The homepage suite was not run: the homepage is untouched. + - The worktree's tree was clean after every run. Its `public/sw.js` is the config's real copy, + not a link, so nothing wrote through to the primary. +- **Screenshots** (the job's scratch dir): `o-footer-light.png` and `o-footer-dark.png`, with + `-row` crops of the social row. + - Taken from a static `serve` of the build's `out/` at `localhost:3710`, 1280 px wide at 2×, + with `colorScheme` emulated. + - The page is the default site that a worktree build renders. Its row is the worktree + `settings.json`'s two operator links (Kiwi Farms, x.com), then Ko-fi. + - The mark is drawn in both, as a 20 × 20 box at the right end of the row. +- **Numbers tool: none.** + +**Found and left.** +- **Decision 5 was too pessimistic about dark.** The official file's first path is a white halo + around the whole mark, so on the dark ground the mark is outlined in white. The `#202020` ring + sits inside it, and the cup and heart read. +- **The operator's x.com icon is near-invisible on the light ground**, which you can see in + `o-footer-light.png`. Its `<path>` carries `fill="white"`, and `normalizeSocialSvg` sets + `currentColor` only on the root `<svg>`. This predates the slice and is operator data + (`settings.json` `socialLinks`), so it is not touched here. Two possible fixes: re-paste the + icon without the path fill, or have `normalizeSocialSvg` strip child fills. +- **Files outside `export/`:** the `KOFI_URL` comment (`common/lib/project.ts`) and the worker + test (`common/lib/archive/serviceWorkerRouting.test.ts`). Neither touches slice N's files. +- **Commit trailers:** they carry `Claude Opus 5.5 (1M context)`, as slice M's commits do, and not + the rules file's `Claude Fable 5.1`, because this implementer is Opus. +- **Rollout** is the plan's: every site plus the hub rebuild and redeploy (runbook steps 5–6). + Check live with `curl -sI https://<site>/kofi-symbol.svg` (expect 200) and look for the + footer's Ko-fi link on each site. An installed PWA picks up the worker change on its next + update check, and no data cache moves. + ## Rollout Nothing is rolled out, except that **Jeralyzer is already on the brand, in Signal** (a build-deploy