Before I settled on a generator, I built a version of this site with nothing but a single Node script. No framework, no plugins, just a file called build.mjs. It was a good exercise, and it taught me exactly where the line is between freedom and homework.
One script, one page
The whole thing was refreshingly small. The script read some data, looped over it, stitched together a string of HTML, and wrote a single index.html to disk. I could read the entire build in one sitting and hold it all in my head. When something rendered wrong, there was no magic layer to blame. There was just my code, and the bug was always mine.
Total control, no surprises
That is the real pull of hand-rolling it. Nothing happens that I did not write. No hidden conventions, no lifecycle I have to learn, no config file whose keys I half understand. If I wanted a page to behave a certain way, I wrote the lines that made it behave that way. For a small, opinionated site, that control feels great.
The parts you end up hand-rolling
The catch shows up the moment the site wants to grow. Routing is on me. If I want a second page, I write more file-writing code. A feed is on me too, which means learning the XML by hand and hoping I got the dates right. Sitemaps, pagination, tag pages: each one is another block of script I have to author and then maintain.
Content baked into arrays
The quiet problem is where the content lives. In a hand-rolled build, posts tend to end up as objects in a JavaScript array right inside the script. Writing a new post means editing code, escaping quotes, and being careful not to break the build with a stray character. The content and the machinery are tangled together, and that tangle gets heavier with every entry.
When the freedom is worth it
I would still reach for a build.mjs for a landing page, a one-off experiment, or anything where the whole point is a handful of pages I control down to the byte. The freedom is real and the code is tiny. It is only when the page count starts climbing that the homework starts to outweigh the control.