Why MDX for this blog
The blog is filesystem-only on purpose. Posts live as .mdx files in git, the build pulls them in at compile time, and there is no CMS or database in the loop. The whole thing should feel like editing a folder of text files.
Why not Contentlayer / Velite
Contentlayer is archived. Velite works fine but adds a build step and a generated types directory that I would rather not maintain for a personal blog. next-mdx-remote/rsc is what's left: render MDX from arbitrary filesystem paths inside a React Server Component, no build glue.
Why dual-theme syntax highlighting
rehype-pretty-code emits both light and dark Shiki tokens in the same pass. CSS hides one based on the .dark class. No client-side highlighter, no flash on theme switch.