Building This Portfolio: From Research to Deployment
When I decided to finally build a personal portfolio and blog, I found myself down a familiar rabbit hole: which technology should I use?
The Options on the Table
I already had a VPS running other services with Traefik as a reverse proxy, so I knew I wanted something that could integrate smoothly into that setup. Here were my options:
HTML/CSS from Scratch
The purist approach. Full control, no dependencies, no build step. But also no templating, no component reuse, and manually managing every page. For a blog with growing content, this quickly becomes tedious.
Hugo
The speed champion of static site generators. Written in Go, blazingly fast builds, mature ecosystem. It’s been around since 2013 and powers countless sites.
Astro
The newer contender. Component-based architecture, “island” hydration for interactive elements, and first-class support for content collections. TypeScript out of the box.
Making the Decision
I found this comparison on ThemeFisher helpful for understanding the tradeoffs. I also used Claude to help think through the decision.
The key factors for me:
-
Markdown support: Built-in content collections for organizing blog posts with frontmatter validation.
-
Developer experience: Clear documentation, straightforward setup, and predictable behavior. As someone who primarily works in backend languages, I wanted minimal friction.
-
Future flexibility: If I ever need interactive islands (a contact form, a code playground), Astro makes that trivial without shipping unnecessary JavaScript.
-
Tailwind integration: First-class support with
@astrojs/tailwind.
Hugo would have been a solid choice too, especially for pure content sites. But Astro’s developer experience won me over.
The Setup
The final stack:
- Astro for static site generation
- Tailwind CSS for styling
- Docker + nginx for containerized deployment
- Traefik for reverse proxy and automatic SSL via Let’s Encrypt
- GitHub Actions for CI/CD
When I push to main, GitHub Actions SSH into my VPS, pulls the latest code, builds the Docker image locally, and restarts the container. No external registry needed.
What’s Next
This is just the beginning. I plan to:
- Add more portfolio projects
- Write about things I learn
- Maybe add an RSS feed for the three people who still use RSS readers
If you’re considering building your own portfolio, my advice: don’t overthink it. Pick something, ship it, and iterate. The best stack is the one you’ll actually use.