Site refresh: writing system, bio rewrite, package upgrades#1
Conversation
- Add /writing index + /writing/[slug] pages with categorized post list (Essays, Notes, Curiosities & Observations) - Add lib/posts.js (gray-matter frontmatter parsing) and lib/rss.js (prebuild RSS feed) - Rewrite about.md in a more human, precise voice - Add Current Work, Recent Writing, and Projects sections to homepage - Add hairline left-rule treatment to post and publication list items - Upgrade all packages to latest: Next.js 16, React 19, Tailwind 4, FontAwesome 7, markdown-to-jsx 9, p-throttle 8 - Migrate to Tailwind 4 CSS-first config (removes tailwind.config.js) - Fix Next.js 16 Turbopack incompatibility via --webpack flag - Fix FontAwesome React 19 crash (FA6 → FA7 + react-fontawesome 3.3) - Fix p-throttle v8 API change in lib/pubs.js - Fix next/image and next/link API changes for Next.js 13+ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Review of PR #1: Site refreshContextPR adds a The review below is grouped by severity. Three of the issues are build-blockers given the current branch state; everything else is cosmetic or a judgment call.
🔴 Blockers1.
|
Blockers: - lib/posts.js: return [] on ENOENT (missing posts/ dir no longer crashes build) - pages/writing/index.js: serialize Date fields before returning from getStaticProps - package.json: replace `next start` with `npx serve out` (output: export drops next start) Other fixes: - pages/writing/[slug].js: remap markdown h1 → h2 to avoid duplicate h1 with page title - components/post-card.js: extract shared PostCard (was duplicated in index + writing) - next.config.js: add comment explaining why webpack fs/path fallback is necessary - lib/pubs.js: add comment documenting p-throttle v8 behavior (limit:25/interval:1000) - lib/rss.js: escape single quotes in escapeXml - .gitignore: exclude public/feed.xml (regenerated by prebuild script each build) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- lib/posts.js: getPostBySlug returns null on ENOENT (safe for draft/delete workflows)
- pages/writing/[slug].js: return { notFound: true } when post is null
- pages/writing/index.js: category headings h1 → h2 (page has no single h1; multiple h1s broke document outline)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace sm:max-w-fit + sm:justify-between with max-w-(--breakpoint-md) mx-auto, matching the constraint used on nav, /writing, and /writing/[slug]. Adds pt-[30px] to match the writing page top padding. Removes float-left from figure (already in flex container); adds shrink-0 so the headshot width is stable. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Always render border-b-2 with border-transparent so hover doesn't add height. Applies to both the name link and the icon links. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Summary
/writingindex and/writing/[slug]post detail pages with categorized sections (Essays, Notes, Curiosities & Observations), powered by markdown files in/posts/with gray-matter frontmatterabout.mdin a more human, precise voice; adds Current Work, Recent Writing, and Projects sections to the homepageNotes
posts/on-sequence-space.md) is intentionally excluded from this PR — add real posts before merging or in a follow-uppublic/feed.xmlis committed as a seed; it will be regenerated at each build via theprebuildscript inpackage.json--webpackflag on dev/build due to a Next.js 16 Turbopack incompatibility with Pages Router +fsusage in server modulesTest plan
yarn dev— home,/writing,/writing/[slug]all load; dark mode works on all pagesyarn buildsucceeds, all static paths resolve/feed.xmlis valid RSS (open in browser or feed validator)🤖 Generated with Claude Code