Minimum clown

:: lisp, programming

Hosting code on GitHub now seems like an invitation to have it turned into AI slop. Here’s what I did to move.

Isn’t it rich?
Are we a pair?
Me here at last on the ground,
You in mid-air.
Send in the clowns.

I think the number of people who care about, let alone rely on, my Lisp code who I don’t personally know is somewhere between few and none by now. Nevertheless, it makes me feel honest to publish some of what I write, in the hope someone might find it useful.

Long ago, I did that by simply putting files on my vanity site (in the days when people had vanity sites). At some point it became clear that this was not the right answer, and the thing to do was to keep things on one of the newfangled source-hosting sites. I have never been and will never be comfortable with the idea of the canonical version of anything I make not sitting on storage that I control — people who do that are not thinking hard enough in my opinion — which means that no source-hosting site based on a centralised source control system was at all interesting.

Send in the clowns

And then git arrived, and sometime after it, GitHub. Git meant that I could both keep the canonical versions of things somewhere safe while making them publicly available. At about the same time I was realising that vanity sites were, well, vanity, and the antique documentation written in raw HTML with its origins in the mid 1990s really needed to be turned into something better, anyway.

Well, it was more complicated, of course. I have a source tree which contains history that’s not public and some of which is very old1. So after initially pushing a frozen version of what used to be on my vanity site, I organised things into various ‘publication repos’ which get populated (by make) from the source tree. These have simplified histories, often really only being a series of release versions. And this worked fine.

I never really used much of the mechanism provided by GitHub: I didn’t need it, and doing so would have broken my rule of not depending on things I don’t have control over.

In 2018 Microsoft bought GitHub, and

THIS IS WHAT HAPPENS WHEN YOU STORE YOUR DATA IN THE CLOWN.

The Clown is just someone else’s computer and they can and will fuck you. If it’s not on your computer, it’s not under your control. Why do you all keep doing this to yourselves??

Stop hitting yourself. Seriously, stop it.
jwz

But I wasn’t worried, because I was not storing my data in the clown: I was just publishing copies of it there. I felt kind of smug about that. I hadn’t worked out, in 2018, how bad things could get and how fast. I had worked out that if you were not paying the clown, then the clown was feeding on your soul, but I didn’t think it would get any useful nutrition from the parts of my soul it could reach. And other things were going on which distracted me.

Fast forward to mid–2025, and GitHub is a subsidiary of Microsoft’s ‘weaponized bullshit’ division: it is time, and past time, to go.

Where? Well there are other clowns. But no: they may be good clowns, for now, but they’re still clowns. Clowns are, well, clowns: you don’t want to be trusting them. You want a minimum clown policy.

Where are the clowns?

So here’s what I am doing.

If you can live with git’s dumb HTTP protocol then any web server which can host static files can host read-only git repos. To push to them you need some smarter protocol, and you need to have a hook which does git update-server-info after any change: this should be in the post-update hook, really. All these repos will be read-only and public, so I don’t need access control or authentication.

To actually make them exist you need more. Fortunately the people who host my vanity domain provide SSH access and git exists on the server. So that’s enough to create a repo, add the hook and then push everything to it as and when I need to.

For documentation: I am already using Frog for, for instance, this post. And Frog has the nice feature that you can just add Markdown files in a directory (or any subdirectory) it knows about and it will turn them into HTML. So I wrote a makefile to copy README.md files from publication repos and suitably munged the original GitHub Pages index page.

Then there were a bunch of small changes such as telling rsync not to clobber the repos when updating things, gluing makefiles together so suitable things happen in subdirectories and make publish does everything needed.

What this needs is a web server that can host static files with enough storage (which is not a great deal), and a way of syncing local content to it. SSH access, git on the server and rsync make things quite a bit easier but I could maintain the public repos locally and sync them to the web server however it allowed that.

I’m pretty confident that any other hosting provider I might one day switch to2 will provide that.

Well, maybe next year

If I was a big player I think I would simply delete my GitHub repos and put up a message saying where people could now find things. I’m not a big player, so what I did is to make the repos read-only (GitHub calls this ‘archiving’) and add suitable links. I’ve done this for all my main Lisp repos: I have some more to do. Archiving means people may never notice: so be it. I plan to tell, for instance, Quicklisp in due course. I also have some non-public (clones of) repos on GitHub which I will just host outside the web server tree, accessing them only via SSH.

There are, inevitably, some changes to the Markdown parsing, which I need to chase down and fix in the source. There already were incompatibilities amongst GitHub’s various parsers.

When I’ve finished all this, I probably will replace my GitHub Pages site by something which just points at the canonical place.

There will be no releases: I’ll just post things announcing changes with tag names. There is no big tracking: just mail me.

Where things are

And that is all.

Isn’t it rich?
Isn’t it queer,
Losing my timing this late
In my career?
And where are the clowns?
There ought to be clowns.
Well, maybe next year.


  1. It turns out I never did import all the CVS versions of things, although I meant to. 

  2. Pair, my current provider, are fine. But they are also American, and I’d rather use a provider based in a democracy.