After 20 years of backend work, I finally sat down to build a proper personal site. The constraints I set were intentional: no bundler, no component framework, no database. Just Express, EJS, and a stylesheet I could own completely.
Why Not Next.js or Astro?
Both are excellent tools. But this site is a learning exercise as much as a product. I wanted to understand the browser, CSS layout, and server-rendered HTML on first principles before reaching for abstractions that hide them.
There is also something clarifying about a stack with no magic. When something breaks, there is nowhere to hide — the bug is mine.
The Stack
- Runtime: Node.js with Express 5
- Templates: EJS — logic in markup, no virtual DOM
- Styles: Vanilla CSS with custom properties
- Hosting: TBD (likely Fly.io or a plain VPS)
What Surprised Me
CSS clamp() for fluid type sizing. I had heard about it but never used it in production.
A single rule like font-size: clamp(42px, 8vw, 68px) handles the entire responsive
headline without a single media query breakpoint. That felt genuinely elegant.
The fixed nav backdrop blur was also easier than expected:
background: rgba(247, 245, 242, 0.88);
backdrop-filter: blur(10px);
Two lines, and it looks like a native macOS interface element.
Next Steps
The blog you are reading right now is the next feature. Markdown files, gray-matter
for frontmatter, marked for rendering. No CMS, no database — just files in a directory
and a route handler that reads them.
The full source will be on GitHub once I am happy with it.