After running a Flask-based portfolio for a few years, I decided to rebuild from scratch using the modern Next.js stack. The goal was a site that was easier to maintain, faster to load, and capable of supporting MDX-powered project and blog content without a CMS.
Why the Rebuild
The Flask version worked, but adding new projects meant editing Python templates and redeploying. Content and code were tangled together. Moving to file-based MDX content means I can add a project by dropping a .mdx file — no code changes required.
Technical Decisions
Next.js 16 with App Router — The App Router's server components make it straightforward to read the filesystem at build time without any additional data-fetching complexity.
Tailwind CSS v4 — The new v4 approach with CSS-first configuration is cleaner than the old JS config files. Less boilerplate, same utility-first power.
gray-matter + next-mdx-remote — Frontmatter parsing for structured metadata, MDX rendering for rich content in project and blog pages.
Static export to Render — No server needed. next build produces a static ./out directory that deploys anywhere.
Design System
Dark background (#0a0a0a), electric blue accent (#3b82f6), Bricolage Grotesque for headings, IBM Plex Sans for body text. The aesthetic draws from Linear and Vercel — clean, developer-native, no generic "AI startup" gradients.
