- Blind mode tutorial
lichess.org
Donate
A chessboard with some computers around it

Google Gemini

BLUNDERbuss: Vibe coding a chess app to help avoid blunders

Software DevelopmentAnalysisPuzzleChessLichess
I decided to try coding a chess app without any programming.

I’ve been reading a lot about vibe coding lately and decided to give it a try. For those unfamiliar, vibe coding is about describing what you want an AI to build—your vision, functionality, and design—and letting the AI handle the heavy lifting.

My idea was simple: create an app that pulls a player’s games from Lichess and turns their blunders into puzzles. Why? Because I hypothesised that players tend to make similar mistakes repeatedly. If they could practice those exact error patterns, they’d eventually recognise and avoid them in real games.
(Curious? Try it out at blunderbuss.jhudsy.org.)


Starting with Descriptions, Not Code

I began by writing text files describing the user interface—what pages I wanted, what each page should do, and the overall “look and feel.” I also outlined the server logic in relatively technical terms, including:

  • How puzzles would be selected (random vs. structured repetition)
  • How data would be stored
  • Which technologies to use

Here’s an excerpt from the server spec:

...
/settings
Users can adjust:
- Number of days to pull puzzles from Lichess
- Game types: blitz, rapid, classical
- Error types: Blunder, Inaccuracy, Mistake
- Max puzzles stored per user (older puzzles are removed if exceeded)
...
The backend stack included:
- Flask (>3.1)PonyORM for persisting user state (puzzles, spaced repetition)
- Lichess API for game datapython-chess for PGN parsing
- Plus extras like gunicorn for deployment
...

In short, I knew what needed to be done—and how the AI should do it.


Letting the AI Build It

I fired up Visual Studio Code in agent mode, told it to read my description files, and asked it to create the system. After some “thinking,” it generated a bunch of webpages, Python files, and more.
Excitedly, I launched the server, visited the site, and...
...it didn’t work. Errors everywhere.
So I fed the error messages back to the AI. It fixed some files. I tried again. Each iteration reduced the bugs, and eventually, I had a working app.
As I “developed,” new feature ideas popped up. Adding them was trivial—just ask the AI. When bugs appeared, I asked the AI to fix those too.
The current version is live at blunderbuss.jhudsy.org, and the source code is on GitHub.


Lessons Learned

  • Speed is the killer feature. I’m a competent programmer, but generating 5,000 lines of (mostly working) code in minutes is incredible.
  • Debugging needs guidance. Prompts like “This is broken because of X/Y/Z; fix it by A/B/C” were invaluable.
  • Code quality can suffer. AI-generated code is often messy. Asking for refactoring is essential (though still imperfect).
  • Bug fixing is surprisingly good. Feeding error messages often leads to quick, accurate fixes.
  • Documentation discipline matters. Specs changed over time, and I didn’t always update them. If I had, recreating the system from scratch would be far easier.

Vibe coding isn’t magic—but it’s a fascinating shift in how we build software. If you’re curious, give it a try. You might be surprised at what you can create.