101 Commits
Author SHA1 Message Date
Lucas WintherandClaude Opus 5.5 7d9a0054b2 docs: handoff for spec 009; drop its plan before merging
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:24:22 +01:00
Lucas WintherandClaude Opus 5.5 cf53e4280a test(e2e): axe-core WCAG A/AA checks on every kind of page
Colour contrast is left out until the dim tokens are retuned (owner looks first).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:12:17 +01:00
Lucas WintherandClaude Opus 5.5 5491230807 docs(agents): work-k2 is the visual truth for /work/
Owner asked for the rules file change on 2026-11-12.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 10:56:29 +01:00
Lucas WintherandClaude Opus 5.5 974b3eb0df feat(work): CV-first work page, six proud projects, record and courses (spec 009)
- CV header with highlights and keeping-up summary replaces the intro and Now strip
- "Projects I'm proudest of": up to six featured panels; screenshots muted until hover
- "Also made" list; searching it also lists matching courses
- Record section: recognition & volunteering, courses by topic
- /work/learning/: searchable course list (plain script), in the sitemap
- Top bar: Projects, Record, Writing, CV; no Bluesky link in the work footer
- Highlights: only the placement takes the accent (owner, after the preview)

Owner looked at the rendered preview on 2026-11-12 before this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 10:44:46 +01:00
Lucas WintherandClaude Opus 5.5 249e4a8017 feat(core): course summary and search
courseSummary groups courses by topic, ordered by course time;
courseMatches searches title, provider, topic and keywords;
formatHours and monthYear format the numbers the page shows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 10:06:29 +01:00
Lucas WintherandClaude Opus 5.5 43a22adc7a feat(library): recognition.yml and courses.yml
Two optional content files for spec 009: competitions and volunteering,
and completed courses and labs. Every malformed field is reported by
file and field; unknown fields are errors. Synthetic fixtures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 10:05:59 +01:00
Lucas WintherandClaude Opus 5.5 1041c8e5b8 docs(specs): 009 work page, CV first, with its plan and mockup rounds
Six rounds of mockups with the owner on 2026-11-12; K v2 picked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 10:03:26 +01:00
Lucas WintherandClaude Fable 5.2 5457cb4368 docs: pre-merge checks in the handoff; note a one-off fixture build hang
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 10:59:55 +01:00
Lucas WintherandClaude Fable 5.2 2ed5401928 docs(handoff): the 2026-11-11 stack is merged; drop the plans for 006 and 007
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 10:50:48 +01:00
Lucas WintherandClaude Fable 5.2 3c094522f2 docs(handoff): state after the 2026-11-11 audit session; /simple mockups
Spec 008 is approved and on hold at the owner's request; its mockups and
screenshots move into mockups/ so they outlive the session.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 10:48:46 +01:00
Lucas WintherandClaude Opus 5.5 4ddc79e9f4 docs(plans): 008 /simple side index with pins
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:47:23 +01:00
Lucas WintherandClaude Fable 5.2 839a216d41 docs(specs): 008 /simple side index with pins
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 10:45:07 +01:00
Lucas WintherandClaude Fable 5.2 ecd788af49 docs(audit): findings 8 and 9 fixed by spec 007
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 10:41:58 +01:00
Lucas WintherandClaude Opus 5.5 38a11ebb47 docs(specs): 007 implemented
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:40:38 +01:00
Lucas WintherandClaude Opus 5.5 82cc2a9fc9 fix(site): an SVG is never a link preview image
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:30:35 +01:00
Lucas WintherandClaude Opus 5.5 77dd15ac03 chore(deploy): SITE_URL defaults to the public address in the image; docs for the sitemap and feeds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:28:30 +01:00
Lucas WintherandClaude Opus 5.5 ab611c2de8 feat(site): canonical, Open Graph and feed links in every head; sitemap and Atom feeds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:27:24 +01:00
Lucas WintherandClaude Opus 5.5 765b6ba906 feat(site): site address in site data; sitemap pages and feed entries
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:24:03 +01:00
Lucas WintherandClaude Opus 5.5 679964ee35 feat(site): link preview head tags and SITE_URL parsing as pure functions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:22:13 +01:00
Lucas WintherandClaude Opus 5.5 59bab7a001 feat(site): Atom feed and sitemap XML as pure functions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:21:26 +01:00
Lucas WintherandClaude Opus 5.5 ec876b01ed docs(plans): 007 link previews, sitemap and feeds
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:19:48 +01:00
Lucas WintherandClaude Fable 5.2 f020372b44 docs(audit): finding 3 fixed by spec 006
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 10:14:56 +01:00
Lucas WintherandClaude Opus 5.5 c3413c07b4 docs(specs): 006 implemented
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:14:02 +01:00
Lucas WintherandClaude Opus 5.5 e9d02cc112 test(e2e): a stored preference is pressed from the first paint on / and /work/
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 10:06:01 +01:00
Lucas WintherandClaude Opus 5.5 fdad3e86a0 feat(site): the start page's gate is a plain page script, no React
Gate.tsx (an island that rendered nothing) becomes scripts/gate.ts with its key
handling and readout text as pure functions. With the switch already plain, the
start page has no island and loads none of the React runtime.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 09:49:38 +01:00
Lucas WintherandClaude Opus 5.5 35415e774d feat(site): preference switch as plain HTML, pressed from the first paint
The React PreferenceSwitch island is replaced by PreferenceSwitch.astro: static
markup, an inline script that presses the stored choice before first paint, and
a page script for clicks and lw:pref. Used on the start page and the work bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 09:38:57 +01:00
Lucas WintherandClaude Opus 5.5 39148fa7f0 feat(site): plain preference switch script with a first-paint painter
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 09:36:02 +01:00
Lucas WintherandClaude Opus 5.5 bef8ddf2e6 docs(plans): 006 start page without React
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 09:35:13 +01:00
Lucas WintherandClaude Fable 5.2 137f2a4ad5 docs(specs): 006 start page without React, 007 link previews, sitemap and feeds
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 09:29:38 +01:00
Lucas WintherandClaude Fable 5.2 07854c6a2b fix: stop inlining fonts into CSS, page the Ghost fetch, audit small fixes
- vite assetsInlineLimit 0: fonts-work.css 42.8 KB -> 5.9 KB
- Ghost posts fetched with limit=100&page=N instead of limit=all
- 404 title uses site.name; drop the duplicate js-class script on /everything/
- deploy/compose.yml: LISTENBRAINZ_USER
- HANDOFF and TODO: the site is live and the sources ran

Audit findings 2, 6, 7, 18, 19, 21 (docs/audits/2026-11-11-audit.md).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 09:23:14 +01:00
Lucas WintherandClaude Fable 5.2 d21eb92bd0 docs(audit): 2026-11-11 audit report
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 09:21:57 +01:00
Lucas WintherandClaude Opus 5.5 a29ede61fd docs(todo): LISTENBRAINZ_USER is in the homelab config (lucwin-config d7c08ed)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 14:45:17 +01:00
Lucas WintherandClaude Opus 5.5 5dcd59aeb0 docs(handoff): spec 005 merged
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 14:42:55 +01:00
Lucas WintherandClaude Opus 5.5 cbc26937a5 docs(handoff): specs 003 and 004 merged
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 14:42:55 +01:00
Lucas WintherandClaude Opus 5.5 c9a5b9d6ea perf(gate): grain as a pre-rendered tile mask instead of a live noise filter; note the hover-lag investigation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 14:40:23 +01:00
Lucas WintherandClaude Opus 5.5 115096e7f0 feat(gate): cassette shows a strip of the song cover with title and artist; collage stacks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 14:19:08 +01:00
Lucas WintherandClaude Opus 5.5 7a9405d410 docs: spec 004 implemented; deploy env, decisions, todo, handoff
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:44:24 +01:00
Lucas WintherandClaude Opus 5.5 ed534c1d28 feat(sources): ListenBrainz top track of the last 7 days
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:42:36 +01:00
Lucas WintherandClaude Opus 5.5 453262f4fc docs(specs): spec 004 listening this week from ListenBrainz; plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:41:15 +01:00
Lucas WintherandClaude Opus 5.5 e97f68f2f3 fix(site): drop the record from song cards; the sleeve spans the card
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:37:40 +01:00
Lucas WintherandClaude Opus 5.5 779d91884f docs: spec 003 implemented; remove its plan; handoff
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:32:10 +01:00
Lucas WintherandClaude Opus 5.5 5712051d8e fix(sources): page through film ratings until the last film's rating; skip undated history
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:32:03 +01:00
Lucas WintherandClaude Opus 5.5 576ede4be6 docs: record spec 003 decisions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:29:49 +01:00
Lucas WintherandClaude Opus 5.5 acfd9c09b4 feat(site): film posters alternate sides on the wall
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:27:15 +01:00
Lucas WintherandClaude Opus 5.5 dcb1c93312 feat(sources): last film from Trakt history replaces watching
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:26:40 +01:00
Lucas WintherandClaude Opus 5.5 c5d95d1f31 docs(specs): spec 003 last film, alternating posters, band photo; plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:24:53 +01:00
Lucas WintherandClaude Opus 5.5 88e88479a9 fix(gate): name at 20/24px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 13:11:59 +01:00
Lucas WintherandClaude Opus 5.5 36b73e567d fix(gate): larger name across the seam
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 12:54:47 +01:00
Lucas WintherandClaude Opus 5.5 23217f573f docs(handoff): spec 002 merged and pushed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 12:51:50 +01:00
Lucas WintherandClaude Opus 5.5 e6ad1dd86e docs(handoff): soundtrack tray link chosen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 12:49:09 +01:00