Simon's Blog

Software and Other Systems

In 2025, I spent a lot of time on a project to help me find a flat using a cloud-hosted LLM. This was interesting enough and helped me with my CKAD exam, but for 2026, I’ve decided to do something that scratches a more philosophical itch.

Abiogenis is a theorised process whereby nonliving matter develops into prototypical forms of living matter: simple self-replicating structures, RNA, proto-cells. I find this transition from chemistry to biology very interesting, because:

  • It could explain the origins of life on Earth (and elsewhere)
  • It should be possible to simulate without resorting to extremely simplified models, like rigid body physics for animals.
  • The molecular/cellular scale can have an otherworldly aesthetic, which may work with the generative music part of the project.

What am I planning to build?

Here are the rough ideas as they stand: I want to build some web-based software that allows users to navigate space and time in a primordial soup. Time may be folded into space, and then the four dimensions (instead of the usual three) projected onto two. Instead of exerting agency, the viewer will be a passive observer. Generative music, the sophistication of which follows that of the simulated molecules, will be a big part of the viewer’s experience.

I plan to use WebGL and WebAssembly in a relatively low-level manner to handle potentially complex 3D scenes and heavy computation for the state. I’ll probably use Rust, as this is the only low-level language I’ve built anything with. Rust as a technical choice may fall over because I also intend to use as much AI tooling as possible. An older and simpler language like C is likely easier on LLMs and to have greater representation in the training data. I’ll adapt to the constraints of the tools. I’ll mainly rely on AI to augment my basic mathematical knowledge and utilize my experience in building software to ensure that the code is structured sanely. I'll likely write the music-related code in JavaScript and use something like SuperSonic as a synthesis engine; I'm imagining a few subtractive voices and lots of reverb.

While I could have chosen a less ambitious project to test AI coding tools, I feel that enough of my time is spent being pragmatic in my professional life. I don’t want to use my limited spare time to create a React app, Django HTTP API, or some Go microservices.

Why?

I haven’t read much philosophy since attempting a journal article on AI and the machinic unconscious over six years ago. I’ve been busy and have only read humanities books that strongly piqued my interest. One of these was a review of consciousness in recent analytical philosophy. I found the clear communication and modest claims of analytical philosophy refreshing, especially after doing two arts degrees where continental thought is far more popular (with notable exceptions). At worst, continental and continental-inspired writing is a sequence of complex sentences telling the reader how a constellation of different abstract concepts relate to each-other with no definitions or reference to facts. However, there are trade-offs: analytical philosophy can be dull. Much of the book could be summed up as follows: The hard problem of consciousness is indeed hard. There is overwhelming evidence that mental states correlate with brain states; we can’t agree on the details. Let’s find a palatable way of representing the situation that best fits our everyday experience of embodied rational agency. Here is a menagerie of -isms and some thought experiments.

If I wanted satisfaction, I should have read a book about a problem that can be solved. This brings me to abiogenesis. While no one has produced biology from non-living chemicals in a lab, there are a lot of models and theories for how it might work, and more on how primitive life works today. Attempting to make a computer simulation of how consciousness functions in relation to brain activity would be impossible. Where would you start? Large language models have passed the Turing test, but like all machine learning models, we have no reason to believe they’re any more conscious than a wheel of Camembert. We could set about tracing information as it flows through systems that populate a person’s mind; it might be interesting social science, but it wouldn’t address the hard problem of consciousness. Chemical and biological processes are more compatible than physical and mental substances, properties, whatever.

The final thing I’d like to share is a passage from a book that hit the sweet spot between the analytical and continental: Manuel de Landa’s A Thousand Years of Nonlinear History. He adapts and applies some of the most notoriously impenetrable continental ideas from Deleuze and Guattari in a concrete, historically grounded way. The book talks about the material flows that drive history through geology, biology, and language. I remembered a particular passage when thinking about abiogenesis:

[…] positive feedback links between these flows began to form closed-circuits: antimarket money flowed into mining regions and intensified coal production and iron extraction, which triggered a flow of mechanical energy (steam), which in turn triggered a flow of cotton textiles, which created the flow of profits that financed further experimentation with coal, iron and steam technology. These loops of triggers and flows were behind the explosive urban growth in England between 1750 and 1850. […] And precisely these autocatalytic loops were what kept this self-organised structure going.”

Autocatalysis is a likely step in the path from non-living to living matter. I find the idea that this kind of process also emerges at the macro level quite inspiring.

Last year, I created an engineering-focused blog on hashnode.dev. It was easy, and it served its purpose. However, as time went on, I developed a few niggles with the blogging platform — mainly these:

  • Writers are at the mercy of the business, which can start charging for things and generally enshitifiying the platform at any time. They could paywall writers' content, like Medium does.
  • My blog was associated with the general reputation of content on the platform, which wasn't always favourable.
  • I don't only want to write about software engineering, and that is the focus of the platform.

My reasons for choosing a self-hosted WriteFreely are essentially the inverse of the above points, with a couple more:

  • Writefreely has an ActivityPub integration, so my blog can be a true citizen of the Fediverse.
  • WriteFreely is very simple. It's a Go monolith that can (and in the case of this site, does) run with a SQLite database. It uses Markdown, so no fancy text-editing widgets.

How did I do it?

Now that I've outlined why, I can move on to the unashamedly geeky part of this post. My main objectives were to run Writefreely in a way that was both simple and cheap.

Simplicity

I got a lot of simplicity for free with this WriteFreely Docker image, which neatly encapsulates the initial configuration of WriteFreely as well as data migrations. The image doesn't leverage Writefreely's built-in automatic HTTPS. Luckily, another Go-based project, Caddy, does this, on top of being a solid reverse proxy.

Those of you who have used the likes of Apache or NGINX, but not Caddy, please take a moment to admire the two lines of configuration necessary to reverse proxy this blog:

simoncrowe.blog

reverse_proxy localhost:8080

Yes, this is all that's required to serve this blog and automatically provision TLS certificates using Let's Encrypt!

Frugality

The localhost origin in my Cadddyfile above isn't typical of a Docker-compose setup. It's a result of my trying to save money by not renting a public IPv4 address from Hetzner and only using a free IPv6 address. Caddy needed an internet-routable IPv6 address to get responses from Let's Encrypt's servers, and using the “host” network mode was the simplest way to achieve this.

The laptop I'm typing this on doesn't have an IPv6 address, so I couldn't SSH into the server, even if I wanted to. To get around this for HTTPS traffic, I used Cloudflare as a DNS registry and proxy. This means that simoncrowe.blog resolves to some of CloudFlare's v4 IPs. CloudFlare handles everything between the Hetzner IPv6 origin and its own dual-stack infrastructure, at no cost.

Trade-off time: My insistence on not paying the tiny IPv4 address fee has probably increased the complexity of this. The no SSH constraint is what motivated me to write a Terraform/OpenTofu module. Using the Hetzner web shell to configure even a simple setup like this would have been a miserable experience compared to SSH from the comfort of my laptop's terminal emulator. Because I've been lazy and put the database in the same machine as the HTTP server, I've already consigned the server to a long existence as a pet. Immutable Infrastructure is not happening here, so doing everything via the Hetzner web console and SSH would have been reasonable.

On the other hand, maybe my code will help someone else run their own WriteFreely. Here's the repo.

Cheap compute with a cloud API! What else can Hetzner do?

Since I managed to throw something functional together in a weekend, I'm wondering what one could do with Hetzner and IaC tooling like OpenTofu, given some time.

While I haven't explored their full networking and compute capabilities, the impression I got is that they'd be fine to run an early stage European startup's backend (with some caveats). Anything approaching a scale-up with global ambitions would be better off with a major public cloud provider. The main reason I say this is that they only have data centres in Germany, Finland, the US and Singapore (the latter two being rack-space in 3rd party data centres).

To me, Hetzner feels somewhere between a typical shared LAMP stack web hosting provider one might use for a Joomla/WordPress site and a mail server — and rudimentary AWS (mainly ec2, some s3 and recently a bit of route53). When creating VMs manually on Hetzner, you can install one piece of common software. Like the LAMP hosting, options include WordPress, but also more advanced things like Docker and Prometheus/Grafana. Unlike typical web hosting, you can provision infrastructure using an API, and you get root access to your servers. Rather quaintly, when a server spins up, you get an email with the default root password (luckily, sshd isn't running out of the box).

If I were a frugal European startup founder, the only thing that would stop me from choosing Hetzner is the lack of managed databases. The VMs could easily run stateless workloads where new software versions are rolled out smoothly using OpenTofu lifecycle policies. While one could run a database on such a VM, one would need to be very careful about backups and learn database administration. A tolerable middle ground might be running production databases using AWS RDS/Aurora in AWS regions geographically close to Hetzner locations; sure, there would be some extra latency, but it might be manageable.

I'll keep an eye on Hetzner. I'm impressed with how straightforward everything is with them. At the top of my wish list would be managed stateful services like Postgres and Kubernetes, a container registry, and guarantees around availability zones (high availability in general). Serverless versions of every imaginable thing, I can live without.