# Astro + Strapi Rebuild — TODO Tracking doc for the `astro-migration` branch. See the locked spec in the approved plan for full rationale on each decision referenced below. ## Done - [x] Scaffold pnpm workspace (`apps/site` Astro, `apps/cms` Strapi + SQLite) - [x] Switch tooling to pnpm-only, add Biome for lint/format - [x] Define shared `content/` schema (writings, portfolio, bookshelf, blogs) with TOML frontmatter matching the legacy Zola format - [x] Bookshelf schema covers both books (ISBN) and papers (DOI/arXiv id) - [x] Custom Astro content loader parsing `+++` TOML frontmatter directly (no YAML conversion step) - [x] Basic list/detail pages for all four content types, verified running end-to-end in-browser (`pnpm --filter site dev`) - [x] CLAUDE.md updated: no agent self-attribution in commits/PRs, commit regularly after each working step - [x] Strapi content-type definitions matching the `content/` schema exactly (writings, portfolio, bookshelf, blogs) — verified boots and registers all four REST routes - [x] `apps/cms/Dockerfile.dev` + root `docker-compose.yml` for running Strapi locally in a container (node:24-bookworm-slim, matches local Node version); `apps/cms/Dockerfile` production multi-stage build for later Dokploy deployment. Verified: builds, boots, admin panel and API reachable, shared `content/` volume mounted at the right relative path ## Content pipeline - [x] Strapi custom provider/lifecycle hooks that read + write the same Markdown files in `content/` (Strapi's DB stays a disposable cache) — `apps/cms/src/utils/content-{file,sync}.ts`, wired in `src/index.ts` - [x] Verify round-trip: edit in Strapi admin → file on disk updates, and vice versa, without drift — verified create/update/delete via the content-manager API, plus idempotent re-import across a restart - [x] Bookshelf ISBN lookup hook with local cover caching — `apps/cms/src/utils/bookshelf-covers.ts` fetches from Open Library by ISBN and caches into `apps/site/public/covers/`; verified end-to-end (real cover downloaded, `cover_image` synced to file, cleaned up on delete) - [x] Bookshelf paper lookup hook — Semantic Scholar backfills title/authors by DOI/arXiv id when missing. No cover/thumbnail: neither Semantic Scholar nor arXiv offers a reliable image source for papers, so `cover_image` stays manually-set for papers (or gets one later from the OG-image pipeline below) - [ ] OG image auto-generation extended from the legacy per-post script to all three content types (writings, portfolio, bookshelf) — **blocked on the design system**: `scripts/generate-og-images.mjs` is hard-coded to the old "CASE FILE" hacker-terminal branding being fully replaced; building this now would just be redone once the new visual identity lands - [x] `llms.txt` generation extended to cover all content types — unblocked once `site.config.ts` existed (built above for feeds/meta anyway): `scripts/generate-llms.astro-site.mjs` reads all four content directories directly, wired into `apps/site`'s build script ## Design system - [x] New typography scale + color system — dark-first (warm near-black, cream text, coral accent) with a warm-paper light mode; Fraunces (display/italic) + Newsreader (body) + JetBrains Mono (nav/meta/code), fluid clamp() type scale. `src/styles/tokens.css`. Referenced pixperk.tech and mcyoung.xyz — see the commit for specifics - [x] Motion primitives: CSS + native Web Animations API spring utility — `apps/site/src/lib/spring.ts` (damped-oscillator keyframes, `prefers-reduced-motion` aware). Not wired into any component yet — the Three.js centerpiece below is the natural first user - [x] Base layout/components replacing the placeholder `Base.astro` — real header/nav with active-link state, theme toggle, footer with social links. Verified light + dark in-browser across home, a writing detail page (TOC/headings), bookshelf, and 404 - [x] Homepage redesign around the Three.js centerpiece as hero — the constellation sits above a 3-column dashboard (latest writings, portfolio, bookshelf), verified rendering and hover/click working in-browser - [x] New 404 page concept (terminal easter egg retired) — "Page Fault", now fully styled with the rest of the design system ## Three.js centerpiece - [x] Constellation data model: nodes are real content entries (writings, portfolio, bookshelf), edges are shared-tag connections — the same relationship "related posts" already uses, drawn instead of listed. No decorative/fake data. `src/lib/constellation-data.ts` - [x] Built as an isolated component (`Constellation.astro` + a plain client `