Why I built my site without CMS
Every time I see someone build a personal portfolio today, it’s a Next.js or Astro app with 300 MB of dependencies just to display three project links and a couple of paragraphs.
I didn’t want that. I wanted something that loads instantly, costs $0 to run, and most importantly won’t break when I ignore it for two years.
So I kept it simple:
- Portfolio (ekmanoj.info): Plain HTML, one CSS file, and a tiny bit of vanilla JS. No build step at all.
- Blog (ekmanoj.online): A few Markdown files compiled with Jekyll.
- Hosting: Cloudflare Pages / Workers static assets.
The whole thing weighs around 25 KB.
Why skip the modern stacks?
1. I hate maintenance debt on personal projects
At work, dealing with dependency upgrades, deprecation warnings, and framework migrations is part of the job. In my free time, it’s the last thing I want to do.
If I don’t touch this repo until 2030, standard HTML, CSS, and Markdown will still work. I won’t have to spend an evening debugging npm audit or figuring out why a bundler broke after a Node update.
2. It’s text on a screen
Most of the web has forgotten how fast HTML actually is when you don’t load 400 KB of JavaScript first.
Because there’s no runtime bundle or hydration step:
- The site renders almost the millisecond you tap a link.
- It doesn’t drain phone battery.
- Cloudflare’s CDN caches the raw static files right next to wherever the reader is.
What about the “cons”?
When people argue against this approach, they usually bring up a few things:
- “You don’t have reactive components.”
For what? It’s a blog. If I need a dark mode switch or a copy to clipboard button on code blocks, 10 lines of vanilla JavaScript does it without pulling in React. - “Writing without a visual CMS is annoying.”
I already live in VS Code. Creating a.mdfile, typing what I want, and doinggit pushis ten times faster than logging into some CMS dashboard. - “Jekyll doesn’t scale to huge enterprise sites.”
I don’t have 50,000 pages. For a personal blog, Jekyll builds in about one second.
Showing work from private repos
A lot of my actual work lives in private repositories or Homelab repos that I can’t just link to on GitHub.
Instead of leaving an empty GitHub link or a generic list of tech logos, I use simple case studies on the portfolio: the actual problem, the architecture I chose, and what it solved.
Permanence and Content Ownership
At the end of the day, my content lives as clean, readable text files in a Git repository.
If I ever want to switch static site generators, move away from Cloudflare, or self-host on a Raspberry Pi in my homelab, I can do it in under an hour without database dumps or migrations.