- aria-labels on share links, sidebar social links and mobile nav icons
- aria-current on active nav links
- CopyButton: React state instead of innerHTML mutation, clipboard error
handling, accessible label and a polite live region for feedback
(Related code-block and image-caption a11y fixes landed with the
ImageWrapper/CodeWrapper rewrite in the previous perf commit.)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Add sitemap.ts and robots.ts
- pageMetadata() helper: consistent title, canonical URL, Open Graph,
Twitter card and feed alternate on every page
- Generated OG images: a site card, and per post either the cover image
or a branded title card (pre-rendered at build)
- BlogPosting JSON-LD on post pages
- Fail fast with a clear error when SITE_URL is missing
Content loading:
- Validate post frontmatter at build time and normalize dates to ISO
(fixes invalid <time datetime> values)
- Add draft: true support (drafts only render in development)
- Cache markdown rendering so metadata and page share one render
- Replace the three copy-pasted about/projects/setup pages with a shared
MarkdownPage component
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>