Chris Shabsin

Chris Shabsin's personal page for tracking projects and such.

View My GitHub Profile

22 January 2026

I'm back...

by cshabsin

So last year was the year I got into vibe coding, both at work and at home. I redid my homepage with it, telling it to look at my old homepage code from decades ago, and modernize it. I replaced the image, too, but I managed to give it a similar feel.

I played around with some spec-driven development in a private project to modernize our invitation software codebase (the Python AppEngine code that we ported to Go AppEngine… is now getting ported to Typescript on Firebase). It’s going well, but I got sidetracked by a couple of other projects.

I used Gemini to write The River Delta, a co-operative Poker game (which has also been commercialized as The Gang, though my version doesn’t have their additional Challenge Cards or Specialist Cards) and put it out on the web. It uses Firestore as its backend so it’s a bit slow on the communications side; gotta consider alternatives there, but at least this is really cheap to run.

I also recently used Gemini to port the classic Super Star Trek video game from BASIC to Typescript to run in a browser, and then vibe coded up a “modern” UI to boot. You can play it here at cshabsin.github.io/startrek. When the navigation rules seemed wonky, I fixed it just by saying “hey, this doesn’t seem right - when I use these nav settings, I expect to go up 2 squares and left 1 square, but it only goes 1 and 1. Can we add a test case for this and figure out why it fails?” Now there’s test coverage for navigation and navigating by the “click” shortcut seems pretty solid.

I’m still looking at ways to formalize some of the vibe coding “memory” things but I’ve been having decent luck with an ad hoc style of memory: “write a markdown file in the notes directory describing the design of our datastore and the invariants.” Or sometimes I have the AI put them in the comments directly in the code. It seems to work reasonably well, until it doesn’t.

I do try to keep an eye on what the AI is doing, but I sometimes get swept up in the speed of development and get to the point where I have a lot of code to review before I can be sure the codebase is solid again. Oops. I mostly didn’t bother with Star Trek, and I’ve been letting The River Delta slide a bit, as well… at one point I had three different branches that needed a painstaking merge (from working on the laptop and the desktop, and then trying to rewind once and be more methodical… but lost track of that branch too). AI helped me take that merge slowly, too.

If you look at some of my public codebases (the Star Trek one is definitely public, at least), you can see that I’ve gotten Gemini to create commits about once per prompt, using the GEMINI.md snippet:

  • When a task is complete, ask permission to create a git commit with a message containing a brief description of what you did, a blank line, then “Gemini commit: “ followed by the prompt that generated the code.

  • Write the commit message to the temporary file gemini_commit_message.txt.

  • For any git repository you interact with, check .gitignore for the presence of gemini_commit_message.txt, and add it if it’s not already in there.

That last bullet point gets a little wonky sometimes, since sometimes it just tosses it in there with echo >> .gitignore without checking if it’s already present or if the file ends with a newline. I should take the time to refine it sometime, but it only does it occasionally and I keep forgetting to deal. But, for the most part, it’s pretty nice, and it provides a bit of a paper trail of how I’m communicating with the AI (though it does not, by any means, contain all the prompts I use; not every prompt generates a commit.)

Anyway, that’s what’s been up over here in my GitHub spaces. I’ll write more another time. Maybe I’ll figure out what I can say about work.

tags: