I spent more time deciding the shape of this portfolio than putting the first version online.
The hard part was not code. It was deciding enough to start: Astro or another framework, static site or SSR, MDX or something else, Tailwind or simpler CSS.
I used Claude Code to talk through those choices and test them in the project. That removed a lot of friction.
Scope
I wanted three things:
- a decent home page,
- a project list,
- a simple MDX blog.
That helped me avoid adding more than I needed. The site did not need a CMS, database, admin panel, or a bunch of internal flows. It needed to be easy to edit and publish.
Stack
I chose Astro v6 with static output, React 19 for interactive components, shadcn/ui + Tailwind v4 for the interface, and MDX for posts.
Deployment runs on Cloudflare Pages through GitHub Actions. Infrastructure lives in Terraform.
Nothing too unusual. I wanted a stack that kept content close to code and did not require much maintenance.
One annoying decision was code highlighting. I ended up disabling Astro’s native syntax highlighting and using rehype-pretty-code directly. Claude Code helped there because I could test the idea in the project right away.
How I Built It
I built it in short CLI sessions. Each one had a small task:
- Base structure: Starfolio theme scaffold adapted to my content
- Design system: theme colors in OkLch, typography with Outfit Variable and Geist Mono, dark/light mode with CSS tokens
- Content sections: skills with icons via
@icons-pack/react-simple-icons, projects, references - Blog with MDX: rehype-pretty-code setup, typed frontmatter, pagination
- Infrastructure: Terraform for Cloudflare Pages, GitHub Actions for CI/CD
Claude Code mostly helped with execution speed and checking choices. I still had to decide what made sense, cut what did not, and review the result.
In the end, the site stayed small. That was the goal. Now the harder part is keeping the writing just as honest.