I can't stop vibe-coding

vibing on chemo & two small projects

October 28, 2025*

*Last modified 29-Oct-25

Tags: llms, programming, cancer

I just keep vibe coding. I don’t think I’ve written about this on my blog before but I was diagnosed with classical hodgkin’s lymphoma (CHL) in late June and have been on medical leave basically since then doing ABVD chemo1. I want to write a post on that at some point (and PET scans, medical imaging is pretty cool), but the relevance for this post is that (1) I have kind of a lot of time, (2) sometimes a strong need for escapism, and (3) sometimes I am kind of out of it2. I had infusion 5 on October 17 (hopefully second-to-last), and after an infusion I’m kinda out of it, but also pretty nauseous and can’t watch movies or tv or play games because the moving images trigger nausea. Turns out, vibe coding is pretty great though. You can turn off your brain and let the robot make something interesting at your direction, with only a bit of text moving around on the screen.

This really scratches an itch for me. I’ve always liked to explore various technical/programming realms by making little side projects, and never felt like I have had enough time for them. The point of medical leave is recovery of course, but the part of me that always wanted more time feels like “well now you have it, you should use it” — even if I can’t really, because I’m sick. I’ve also always liked tooling, and LLMs are surely a very weird supercharged kind of tooling. Lastly, I feel a bit less “useless” if I’m making things, even if those things are themselves useless. I think some of that is more about autonomy and control rather than pure capitalism-induced-need-for-producitivity.

There’s another angle as well which I think makes it hard for me to put LLMs down. With one decent prompt, Claude code can do a sizable amount of work. So for any given project, if I just take a minute or two to dash off a prompt, I could advance that project a fair bit. So then when I ask myself, for example, should I go to bed, the answer is “yes yes of course, but let’s just give it something to do overnight”. But then that finishes by the time I’ve brushed my teeth and maybe I should go back to the computer and spend a bit more time prompting 😅. Also, I can work on a few projects at once3, dashing off prompts to propose this or implement that, in some kind of weird hyperactive loop.

So they’ve really been quite addicting to me recently. Which I think is basically OK for me at this very particular time in my life, and I’m pretty sure I’ll find them less compelling when I’ve got other stuff going on my life like work or in-person activities.

I want to also share two of my projects and why I find them interesting.

plazaespana.info

Plaza España events page showing current events
Plaza España events page.

plazaespana.info is an open source static site that surfaces upcoming events at or near Plaza España in Madrid, near where I live. I like the idea of a hyper-local ad-free site with useful info. There’s often lots of cool events in the plaza that I miss and only see workers taking down a stage or such some Sunday evening, instead of seeing the event earlier in the weekend.

Spain in general and Madrid in particular have pretty good open data systems and values, and there’s JSON event feeds for city and cultural events, as well as for weather. So I just wanted to put it all in one place, with everything filtered down to that one particular plaza.

Plaza España this week view with cultural events
This week view with weather information.

On the technical side, I wanted to explore the technique of having a dynamic-ish static site by re-generating the whole site periodically. I don’t remember where I first heard about this technique but it’s somehow very appealing. In the large-user regime, you are just serving some small HTML/css per-user (i.e. cheap and fast), while doing the relatively expensive data fetching/processing once per time point (i.e. not scaling with users). Of course my site will never be in the large user regime, but for me the point is more to explore the design space.

In this way, you push all the dynamicism back a few levels; it’s not dynamic on the client (no JS), nor on the webserver, but rather on the site-generator level.

For my site, the generator is a basic pipeline of fetch city event, cultural event, and weather data, filter it down to the right region, match weather to events, and then render it out to HTML/css. It also outputs a “build report” that we serve at Build Report - Madrid Events, which makes it easy for me to check on it:

Build report page showing pipeline overview and metrics
Build report showing data pipeline performance.

I considered using an existing static site generator but decided to roll my own. Claude wrote it for me in Go, a language I’ve done the smallest amount of tinkering with for LicenseCheck.jl for which I needed to write a C interface4. I still 100% do not know Go because Claude wrote it all. I think occasionally someone will say something like that as a point of pride or to show they’ve embraced the technology so much that they no longer value knowing things, that isn’t me and I don’t think it’s a good thing. But I also don’t think it’s totally bad because I wasn’t trying to learn Go for this project, rather I was trying to make a site I wanted to exist and to explore this static site generator architecture5. And at least the latter I was able to do at some level by making sure Claude actually used the dynamicism at the correct level by placing it in the generator process, rather than shipping the feeds to the user and using a bunch of JS to render it on their site. I think with anything, the amount and kind of learning you get out it is based on what you put in.

As an aside, I actually think LLMs can help with learning programming languages, but not by dumping out a project. The traditional advice to learn a programming language by diving in with a project does not work with LLMs, because you can’t learn when you aren’t making active choices. But they can be learning assistants if you ask them to explain some syntax or synthesize information on design patterns or whatever; they are less transformative here than in building things, but the fact you can ask followup questions can be nice.

Back to plazaespana.info. This architecture of regenerate-the-site-periodically is pretty different than the one used by valuetier.org (see also my blog post on it). That’s also a static site, but one where we’ve pushed the dynamicism fully into the client. There, we basically ship our users an offline application and execute it on their machine; it just happens to be written in JS executing in the browser environment. Again, there’s no dynamicism on the webserver side (particularly, no telemetry or user data leaves their machine), and also no periodic rebuilds or anything like that. We build the app once, then ship it to whoever wants it (i.e. people who go to the site), and that’s it.

Both of these are “more dynamic” in some ways than this blog, which neither ships a bunch of JS to the browser nor is generated periodically. Rather, it’s re-generated when there’s a new post. This reflects the fact that the blog is not trying to serve live data like plazaespana.info or run a mini application like valuetier.org, it’s just shipping some text.

The site is live and working, but I’m not sure it’s that useful yet. I think I will have to use it for a bit and find out what it is missing.

gh-notifications

I also worked on a Gleam application I’m calling gh-notifications, as a tool to basically mimic the GitHub notifications page, but then add features I wanted.

This basically works!

GitHub notifications UI showing smart filters and notification list
GitHub notifications interface with smart filtering.

It uses currently single-user only with no auth, so I only run it locally on my laptop. It polls the /notifications GitHub endpoint for notifications, and enriches them by pulling PR/issue/comment information, and caches data in sqlite. It also allows org-level filtering so I can separate Julia stuff from work stuff better. The main feature are “smart” filters where I use heuristics to try to identify interesting notifications that I might otherwise miss. For example, “might need reply”, i.e. threads in which I’ve been pinged, review-requested (individually, not by team), or commented, but I’m not the last commenter. For these perhaps someone replied and I should followup, but it could get lost in the sea of notifications if they weren’t in a special section.

From a technical perspective, we use Gleam’s OTP actor system with a poller actor hitting up /notifications and putting results in the db periodically, an “enricher” actor periodically querying the db for missing info from other endpoints and populating it, and a metrics actor aggregating performance metrics. Then we use a wisp webserver to serve the feeds populated with info from the db.

Here is a diagram I asked Claude to make showing the design (without metrics):

/notifications

IngestThreads

/pulls/:num
/comments

reads

GitHub API

Poller
every 60s

Ingestor
batches writes

Enricher
every 60s

SQLite

Web Server
:8000

And here’s the metrics view:

Metrics dashboard showing system health, poller activity, and GitHub API stats
Real-time metrics dashboard.

I think the project is OK, but I’d need to figure out auth if I ever wanted to put it online since it needs access to GitHub tokens. I’ve kind of paused it for now as my interested moved on. Also, I think I do want to learn more Gleam, and having Claude build everything has been a disservice to that. So if I pick it up again later, I might approach it differently with that in mind.

I now have some other projects I’m working on which I might blog about later.


  1. I am in remission with one infusion left! ↩︎

  2. I guess “chemo brain”, but I don’t know if that’s only reserved for when its more serious ↩︎

  3. I’ve been using Claude Code on the web a lot. They run a sandbox for Claude to execute in, which is nice both for parallelism (you can do a few at once), and security. ↩︎

  4. that was pre-LLM era, so it was written by composing snippets of stackoverflow… ↩︎

  5. Well since I made this immediately post-infusion, the real goal was basically to escape feeling like crap by occupying myself, but I guess there’s sometimes multiple levels of goals ↩︎