I tried out Claude Code on a little project - a static blog generator for this blog to be run on GitHub Pages. I used Gemini to help come up with a temporary name just so I could create the folder and move on. I asked for two words that rhyme, starting with "static" and it came up with Static Attic.
I got the html5 template from there too and got to work. I wanted a super minimal template, so I just started hand-crafting some html that would serve as the first post, the design and also an example for Claude as to what I want.
Claude helped to kickstart a CLAUDE.md. This then caused me to have all sorts of questions like what I should use for parsing YAML front matter out of a file that's otherwise markdown, what to use for rendering markdown in a GitHub Markdown compatible way, how to syntax hilight code blocks so that it generates static html with no react or other client-side JavaScript necessary.. This way I could refine the plan, the features, the tech stack, the style, etc.
One of claude's suggestions was to go with no template engine. So I figured I could just use JavaScript template strings. But then how do you render those if your template is in its own file? According to Gemini 'This is a classic "gotcha" in JavaScript.' and it taught me about the function constructor technique. Which I then told Claude to use.
I got a bit side-tracked with which node.js library to use to parse YAML front matter out of .md files since none of them seemed to have any recent updates. I settled on gray-matter after a brief detour trying front-matter in a modern TypeScript and JavaScript module setup.
Along the way I remembered that I wanted to play with TypeScript's erasable syntax so that I can execute .ts files with node directly. This meant a minimum node.js version of 24.
I also felt that it is time I try out pnpm over npm. Not that it would matter with such a simple project's lock file.
For markdown and syntax hilighting I landed on markdown-it and @shikijs/markdown-it. I realised that YouTube embeds' iframes got escaped so you would see the html rather than get the embed and Gemini pointed out that I have to pass html: true to markdown-it's options.
And that was basically it. Claude generated a working project structure with eslint, prettier, tests and everything set up on first try, it generated the validation script, it even made a build script. At some point I ran out of tokens and switched to copilot to do some minor refactors so that the style would be more like how I would do it, but really it was fine. I asked copilot to help me with the GitHub workflow so it would publish whenever I push to main, got it to fill out some tests and the README file and that was it. Done.
Admittedly the smallest project imaginable, but I'm still quite impressed with the result. And happy. I've got something small, minimal and self contained that I fully understand and can extend if/when I ever need more.
Was it faster than if I'd have written it myself? I'm not sure. I still did quite a bit of researching, thinking, planning and designing especially up front. I was still quite opinionated and particular about how I wanted it to work and what aesthetic I'm going for. We'll see how my behaviour evolves over time.