Vibecoding a simple feature with Claude

It went pretty well

My side project has been entirely handcoded in the backend, until today. I’ve used Claude Code a great deal for frontend work — I am no web designer — but I’ve tended my backend carefully with my own hands.In fact using my hands is part of the point, being effective rehab while recovering from an injury. Today I decided to break that habit and try adding a feature using Claude to generate all the code edits.

BunTool (git) is for making PDF bundles for use in court and legal settings, and one feature requested by a colleague (who absolutely knows what she is talking about and should be listened to) was the ability to add a custom coversheet. That’s a great test case, because the feature is easy to conceptualise and express, it touches multiple points in the bundle-making pipeline from frontend to output, and because I can hold the logic in my head from beginning to end for checking purposes.

Framework

Also a good chance to test a new (to me) claude.md variant. I heard from a friend today that Forrest Chang’s Karpathy-Inspired Claude Code Guidelines was usefulDescribed as “A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy’s observations on LLM coding pitfalls.” I’ve used Claude enough in the past that I think I’ll be able to spot differences, though this is a slightly different exercise., so installed it as a plugin before I got started. This was pretty easy using claude’s inline plugin management commands.

Specifying

I decided to work from a markdown checklist and iterate through the steps one by one, so started by planning out my spec for the feature:

# Adding coversheet checklist

## Backend

- [ ] buntoolconfig.js - add bool option
- [ ] validate cover page function: check file = 1 page or extract first page, return first page
- [ ] Add validation call in buntoolMain.js
- [ ] at 3/11 in buntoolMain.js Creation of TOC entries, page numbers +1 if coversheet
- [ ] at 5/11 buntoolMain.js (generating TOC pages) page number needs to respect toc entries setting if coversheet present (just check carries through)
- [ ] After current step 7/11 buntoolMain.js (add new step before current step 8, after toc is merged), the result of the step7 merge should then be merged again with coversheet
- [ ] the abbreviated justtheeindex flow in buntoolMain.js should merge with coversheet


## frontend

- [ ] Button to add optional coversheet
- [ ] call validate function at point of upload (belt and braces)
- [ ] show selected filename
- [ ] clear/remove button
- [ ] error handling for invalid file
- [ ] submit logic to accommodate coversheet as parameter coversheetFile
- [ ] add mention in tutorial

This is spec’d by reference to the logic flow in my buntoolMain.js main logic flow, but those steps in turn call out to various submodules.

Step by step

Setting Claude to ask-before-edits gave me peace of mind, and then I prompted it to follow stepwise ("ok let’s do the coversheet adding plan step by step. start with step 1: show me your proposed edits"). Baby steps from the interface within VSCode:

Claude politely making edits without fluff
Claude politely making edits without fluff

And so it proceeded.

Overall it went very well. There were a few nits and irritations though:

So I ended up being quite hands-on and I couldn’t surrender control entirely. Having said that, if I were using Claude for maintaining a lot of this wouldn’t matter a jot.

I let the LLM have the satisfaction of checking things off its list, and it took the opportunity for some sassy backchat.
I let the LLM have the satisfaction of checking things off its list, and it took the opportunity for some sassy backchat.

At one point while testing I found quite a subtle bug with hyperlinking, which took a while to solve because it seemed to be only intermittently reproduciblea sort of Heisenbug, since trying to debug it with my preferred PDF viewers (which give richer control than a browser viewer) led to a different experience.. This was very annoying but I eventually worked out that it was due to relying on undefined behaviour being handled in a certain way. This wasn’t Claude’s fault, but Claude confidently proposed a fix that broke things much more acutely. I fixed it by hand in the end.

Overall?

But I didn’t get the most out of it because I’m apparently very stuffy about edits to my own handcoded work. It wasn’t quite as smooth as I hoped, but that was partly because I was so opinionated about how things should look that I tended to want to micromanage the result anyway. In the frontend I’m perfectly happy to deploy UI features via Claude.