<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Simon&#39;s Blog</title>
    <link>https://simoncrowe.blog/</link>
    <description>Software and Other Systems</description>
    <pubDate>Mon, 27 Jul 2026 09:01:49 +0000</pubDate>
    <item>
      <title>Scaling Searle&#39;s Chinese Room For Large Language Models</title>
      <link>https://simoncrowe.blog/scaling-searles-chinese-room-for-large-language-models-jtj6</link>
      <description>&lt;![CDATA[Today I&#39;m borrowing a 46-year-old philosophical idea and applying it to contemporary generative AI. I’m curious about what happens to this idea when applied to AI that, unlike what was speculated about in Searle’s time, has actually been built. &#xA;&#xA;John Searle devised his famous Chinese Room thought experiment in response to what he called strong AI. This wasn’t the idea of human-like or superhuman artificial general intelligence (AGI) tech CEOs rave about, but the idea that machines that behave as though they think truly think. One reason these ideas were entertained at the time was that the frontier of artificial intelligence was symbolic rather than numerical, meaning that systems were structured according to formal grammar and logicsup1/sup. A scholar who thinks about rules underpinning language all day may be attracted to the idea of a rule-based system that itself thinks. It’s less compelling to imagine that a concatenation of matrix multiplications and other computations understands the sequences of tokens it builds.&#xA;&#xA;I won’t go into detail about the thought experiment, though I’d encourage you to read it in a href=&#34;https://rintintin.colorado.edu/~vancecd/phil201/Searle.pdf&#34;the original article/a. The basic idea is that someone can produce convincing text-based answers to questions in a language they know nothing about without understanding the questions or answers. All they need are exhaustive formal rules in a language they do know about, on how to respond to sequences of — to them — meaningless symbols.&#xA;&#xA;Because software that lived up to Searle’s room was never actually builtsup2/sup, it benefits from an undefined scale. A single person can plausibly follow the potentially vast set of rules because no one formalised them. Due to the number of computations involved in frontier LLM inference and the limited speed at which people can perform arithmetic operations, the subject would need to live for around 380,000 years to generate a token in a conversation with a chatbot. sup3/sup Constrained by human lifetimes, the computation would need to be carried out by a deeply rigid and dogmatic civilisation organised around the purpose of ingesting and producing holy numbers. Even such a dystopia, similar in size to 19th-century England, using telegraph to communicate would produce only five tokens a year. sup4/sup&#xA;&#xA;I&#39;m not the first to scale this idea up to population size. Ned Block got there before Searle even wrote his paper: his 1978 &#34;China Brain&#34; imagined the entire population of China, linked by radio, simulating a brain neuron by neuron. Searle himself later answered the connectionists with a &#34;Chinese Gym&#34;: a hall of monolingual English speakers hand-cranking a neural network. So the move I&#39;m making here is a well-worn one. What&#39;s changed is that the machine on the other side of the analogy now actually exists, which means the scale is no longer a matter of taste: we can put numbers on it.&#xA;&#xA;Let&#39;s circle back to Searle&#39;s point about incomprehension. I&#39;ll try to sketch it out. The scribes or human computers carrying out the calculation wouldn&#39;t know what the numbers meant or what they corresponded to. Those privileged few who could access the vaults where the consecrated weight numbers and numbers for divined and generated tokens were stored would not know what symbols the numbers mapped to. The high-ranking bureaucrats who organised inference computation would blindly follow a kind of bureaucratic scripture: their command and control infrastructure operating in the spirit of the Soviet factories that, graded on tonnage, produced chandeliers heavy enough to tear down ceilings, and nail plants that met their quotas with a handful of railway-spike-sized nails. &#xA;&#xA;Scientists caught researching the inference process or building mechanical computers would be publicly executed as heretics. Those who pursued their research in secret would live lonely lives, questioning the consistency of the system they were enmeshed in but lacking a solid basis for any conclusions. Even during the great conjunctions that occur once a generation, the seers who divined new input token numbers from the entrails of sacrificial animals would not know what the numbers meant.&#xA;&#xA;So there it is: an updated Chinese Room, in all its absurdity. It works better as an illustration of just how big large language models are than as a thought experiment. Searle&#39;s room has the advantage of not being a closed system, where questions and answers can simply pass under the door. My civilisation has to smuggle its inputs in through an oracle: the divination.&#xA;&#xA;---&#xA;&#xA;span id=&#34;fn1&#34;1./span This is now known as GOFAI: good old-fashioned AI, a term coined by the philosopher John Haugeland in 1985. Think of SHRDLU, which parsed typed English commands to manipulate a virtual world of coloured blocks; MYCIN, which diagnosed blood infections by chaining through roughly 600 hand-written if-then rules; or Cyc, a decades-long attempt to hand-code common sense as millions of logical assertions. Or ELIZA, the 1966 chatbot that parodied a Rogerian psychotherapist using simple pattern-matching rules, fooling some users into feeling understood, which is precisely the illusion Searle was attacking.&#xA;&#xA;span id=&#34;fn2&#34;2./span This kind of symbolic AI Searle was talking about didn’t make it past R&amp;D, let alone being deployed commercially on a planetary scale like generative AI is today. Despite some early hype, research into expert systems and the like was eventually abandoned, leading to the second AI winter starting in the late 1980s.&#xA;&#xA;span id=&#34;fn3&#34;3./span GPT-4.5, which passed the Turing test most of the time in a a href=&#34;https://arxiv.org/abs/2503.23674&#34;2025 study/a, had hundreds of billions of parameters; OpenAI never disclosed a figure, but following a href=&#34;https://www.interconnects.ai/i/158107244/what-gpt-45-is-good-for&#34;an educated guess/a let’s say 600 billion active parameters. Assuming two computations for each parameter to generate a token, it would take an immortal, tireless human 3,169 years to complete a single layer of the transformer that drove GPT-4.5. A single token would take at least 380,000 years. This is based on 0.1 arithmetic operations per second for a human scribe.&#xA;&#xA;span id=&#34;fn4&#34;4./span A significant amount of computation that a transformer does is embarrassingly parallel: the vanilla feed-forward neural network that follows the self-attention magic. This could be parallelised across a galaxy if it weren’t for the speed of light nullifying any parallel gains with a huge communication cost. Barring a mega-structure like a Dyson sphere, the distances signals would need to travel within a solar system for each layer of a transformer would be prohibitive. Within a single small landmass, however, batches of computation can be sent by telegraph to outlying population centres very quickly. A core city of 1 million scribes working around the clock in two 12-hour shifts, 10 million more spread across the land, could generate a GPT-4.5 token in just over two months. See the diagram below for an illustration of this. See also a href=&#34;https://bbycroft.net/llm&#34;this website/a for a useful illustration of how transformers and LLMs work.&#xA;&#xA;                    O N E   T O K E N   B Y   T E L E G R A P H&#xA;&#xA;             the forward pass at city scale: a capital, its towns, a wire&#xA;&#xA;  model      600 B parameters, 120 sequential layers, dmodel 20,412&#xA;  payload    one hidden state = 20,412 values x 16 bit  ~=  327 kbit&#xA;  the wire   100 bit/s telegraph, signals at 0.7c -- the 300 km costs a&#xA;             millisecond and a half of flight and hours of keying; at this&#xA;             scale bandwidth is the tyrant, never the distance&#xA;&#xA;         &#xA;        /\       +&#xA;   |(+)|     |&#xA;  /\  | : |    /   \      +                ~ 300 km of wire ~&#xA;  | |  | : |   /     \    /\   ~        ,       ,       ,       ,          +&#xA;  | |  | : |  /       \   | |  ~        -+-------+-------+-------+-        /\&#xA; | | | : | |         |  | |          |       |       |       |   /\    | |   /\&#xA; | : | | : | |  :: ::  | | ||    |     |       |       |       |  /_\  | | /\&#xA; | : | | : | |  :: ::  | | : || [] |     |       |       |       |  |[]|  | : | |[]|&#xA;|__||__||________||||||__|_|_||||_||_|&#xA;&#xA;            C A P I T A L                     the telegraph            T O W N S&#xA;       1,000,000 core scribes         100 bit/s, signals at 0.7c   10,000,000 scribes&#xA;&#xA;-------------------------------------------------------------------------------------&#xA;                     ONE LAYER  --  k of 120, strictly in order&#xA;-------------------------------------------------------------------------------------&#xA;&#xA;  clock         CAPITAL (core)                             TOWNS (periphery)&#xA;            1e6 scribes, 10 km wide                     1e7 scribes, 300 km out&#xA;    .                  |                                           |&#xA; +0.0 h    +-----------+-----------+                               |&#xA;    .      | SELF-ATTENTION        |                               |&#xA;    .      | half the city on duty |                               |&#xA;    .      | (two 12-hour shifts)  |                               |&#xA;    .      | core only: every desk |                               |&#xA;    .      | may read the whole    |                               |&#xA;    .      | token census          |                               |&#xA;    .      |  9.4 h arithmetic     |                               |&#xA;    .      | +1.8 h keying across  |                               |&#xA;    .      |  the city&#39;s own wires |                               |&#xA;+11.3 h    +-----------+-----------+                               |&#xA;    .                  |                                           |&#xA;    .                  |          MLP inputs for layer k           |&#xA;+11.3 h                |------- 327 kbit ~ 0.9 h of keying -------  |&#xA;    .                  |       (300 km of light-lag: 1.4 ms)       |&#xA;    .                  |                                           |&#xA;+12.2 h    +-----------+-----------+                 +-------------+-------------+&#xA;    .      | MLP: capital&#39;s share  |                 | MLP FEED-FORWARD          |&#xA;    .      | the on-duty half joins|     .  .  .     | ten million desks, each   |&#xA;    .      | 0.9 h                 |     in step     | on its own slice; no town |&#xA;    .      |                       |     .  .  .     | consults another  (0.9 h) |&#xA;+13.0 h    +-----------+-----------+                 +-------------+-------------+&#xA;    .                  |                                           |&#xA;    .                  |          MLP outputs for layer k          |&#xA;+13.0 h                |&lt;------ 327 kbit ~ 0.9 h of keying --------|&#xA;    .                  |                                           |&#xA;+13.9 h    +-----------+-----------+                               |&#xA;    .      | residual add + norm   |                               |&#xA;    .      | file the layer record |                               |&#xA;    .      | (negligible)          |                               |&#xA;    .      +-----------+-----------+                               |&#xA;    .                  |                                           |&#xA;    v                  v                                           v&#xA;             hidden state to layer                       towns sit idle until&#xA;             k+1: back to the top                      the next dispatch keys in&#xA;&#xA;-------------------------------------------------------------------------------------&#xA;  THE BILL&#xA;-------------------------------------------------------------------------------------&#xA;&#xA;  one layer     9.4 + 1.8 + 0.9 + 0.9 + 0.9   =   13.9 hours&#xA;  one token     13.95 h  x  120 layers        =   69.7 days&#xA;  the split     74% labour / 26% communication&#xA;&#xA;  the capital keys and computes around the clock: two 12-hour shifts, half a&#xA;  million desks always lit. the towns need no relief -- each works 0.9 h in&#xA;  every 13.9, and the wire itself schedules their rest.&#xA;&#xA;  every communication hour is serialization -- a fist tapping 327,000 bits&#xA;  onto the wire at 100 per second. propagation never shows up on the bill:&#xA;  the light-lag budget for the whole token is about a third of a second.&#xA;&#xA;`]]&gt;</description>
      <content:encoded><![CDATA[<p>Today I&#39;m borrowing a 46-year-old philosophical idea and applying it to contemporary generative AI. I’m curious about what happens to this idea when applied to AI that, unlike what was speculated about in Searle’s time, has actually been built.</p>

<p>John Searle devised his famous Chinese Room thought experiment in response to what he called strong AI. This wasn’t the idea of human-like or superhuman artificial general intelligence (AGI) tech CEOs rave about, but the idea that machines that behave as though they think truly think. One reason these ideas were entertained at the time was that the frontier of artificial intelligence was symbolic rather than numerical, meaning that systems were structured according to formal grammar and logic<sup><a href="#fn1">1</a></sup>. A scholar who thinks about rules underpinning language all day may be attracted to the idea of a rule-based system that itself thinks. It’s less compelling to imagine that a concatenation of matrix multiplications and other computations understands the sequences of tokens it builds.</p>

<p>I won’t go into detail about the thought experiment, though I’d encourage you to read it in <a href="https://rintintin.colorado.edu/~vancecd/phil201/Searle.pdf">the original article</a>. The basic idea is that someone can produce convincing text-based answers to questions in a language they know nothing about without understanding the questions or answers. All they need are exhaustive formal rules in a language they do know about, on how to respond to sequences of — to them — meaningless symbols.</p>

<p>Because software that lived up to Searle’s room was never actually built<sup><a href="#fn2">2</a></sup>, it benefits from an undefined scale. A single person can plausibly follow the potentially vast set of rules because no one formalised them. Due to the number of computations involved in frontier LLM inference and the limited speed at which people can perform arithmetic operations, the subject would need to live for around 380,000 years to generate a token in a conversation with a chatbot. <sup><a href="#fn3">3</a></sup> Constrained by human lifetimes, the computation would need to be carried out by a deeply rigid and dogmatic civilisation organised around the purpose of ingesting and producing <em>holy numbers</em>. Even such a dystopia, similar in size to 19th-century England, using telegraph to communicate would produce only five tokens a year. <sup><a href="#fn4">4</a></sup></p>

<p>I&#39;m not the first to scale this idea up to population size. Ned Block got there before Searle even wrote his paper: his 1978 “China Brain” imagined the entire population of China, linked by radio, simulating a brain neuron by neuron. Searle himself later answered the connectionists with a “Chinese Gym”: a hall of monolingual English speakers hand-cranking a neural network. So the move I&#39;m making here is a well-worn one. What&#39;s changed is that the machine on the other side of the analogy now actually exists, which means the scale is no longer a matter of taste: we can put numbers on it.</p>

<p>Let&#39;s circle back to Searle&#39;s point about incomprehension. I&#39;ll try to sketch it out. The scribes or human <em>computers</em> carrying out the calculation wouldn&#39;t know what the numbers meant or what they corresponded to. Those privileged few who could access the vaults where the consecrated weight numbers and numbers for divined and generated tokens were stored would not know what symbols the numbers mapped to. The high-ranking bureaucrats who organised inference computation would blindly follow a kind of bureaucratic scripture: their command and control infrastructure operating in the spirit of the Soviet factories that, graded on tonnage, produced chandeliers heavy enough to tear down ceilings, and nail plants that met their quotas with a handful of railway-spike-sized nails.</p>

<p>Scientists caught researching the inference process or building mechanical computers would be publicly executed as heretics. Those who pursued their research in secret would live lonely lives, questioning the consistency of the system they were enmeshed in but lacking a solid basis for any conclusions. Even during the great conjunctions that occur once a generation, the seers who divined new input token numbers from the entrails of sacrificial animals would not know what the numbers meant.</p>

<p>So there it is: an updated Chinese Room, in all its absurdity. It works better as an illustration of just how big large language models are than as a thought experiment. Searle&#39;s room has the advantage of not being a closed system, where questions and answers can simply pass under the door. My civilisation has to smuggle its inputs in through an oracle: the divination.</p>

<hr>

<p><span id="fn1">1.</span> This is now known as GOFAI: good old-fashioned AI, a term coined by the philosopher John Haugeland in 1985. Think of SHRDLU, which parsed typed English commands to manipulate a virtual world of coloured blocks; MYCIN, which diagnosed blood infections by chaining through roughly 600 hand-written if-then rules; or Cyc, a decades-long attempt to hand-code common sense as millions of logical assertions. Or ELIZA, the 1966 chatbot that parodied a Rogerian psychotherapist using simple pattern-matching rules, fooling some users into feeling understood, which is precisely the illusion Searle was attacking.</p>

<p><span id="fn2">2.</span> This kind of symbolic AI Searle was talking about didn’t make it past R&amp;D, let alone being deployed commercially on a planetary scale like generative AI is today. Despite some early hype, research into expert systems and the like was eventually abandoned, leading to the second AI winter starting in the late 1980s.</p>

<p><span id="fn3">3.</span> GPT-4.5, which passed the Turing test most of the time in a <a href="https://arxiv.org/abs/2503.23674">2025 study</a>, had hundreds of billions of parameters; OpenAI never disclosed a figure, but following <a href="https://www.interconnects.ai/i/158107244/what-gpt-45-is-good-for">an educated guess</a> let’s say 600 billion active parameters. Assuming two computations for each parameter to generate a token, it would take an immortal, tireless human 3,169 years to complete a single layer of the transformer that drove GPT-4.5. A single token would take at least 380,000 years. This is based on 0.1 arithmetic operations per second for a human scribe.</p>

<p><span id="fn4">4.</span> A significant amount of computation that a transformer does is embarrassingly parallel: the vanilla feed-forward neural network that follows the self-attention magic. This could be parallelised across a galaxy if it weren’t for the speed of light nullifying any parallel gains with a huge communication cost. Barring a mega-structure like a Dyson sphere, the distances signals would need to travel within a solar system for each layer of a transformer would be prohibitive. Within a single small landmass, however, batches of computation can be sent by telegraph to outlying population centres very quickly. A core city of 1 million scribes working around the clock in two 12-hour shifts, 10 million more spread across the land, could generate a GPT-4.5 token in just over two months. See the diagram below for an illustration of this. See also <a href="https://bbycroft.net/llm">this website</a> for a useful illustration of how transformers and LLMs work.</p>

<pre><code>=====================================================================================

                    O N E   T O K E N   B Y   T E L E G R A P H

             the forward pass at city scale: a capital, its towns, a wire

=====================================================================================

  model      600 B parameters, 120 sequential layers, d_model 20,412
  payload    one hidden state = 20,412 values x 16 bit  ~=  327 kbit
  the wire   100 bit/s telegraph, signals at 0.7c -- the 300 km costs a
             millisecond and a half of flight and hours of keying; at this
             scale bandwidth is the tyrant, never the distance


         _
        /_\       +
   +   |(+)|     _|_
  /_\  | : |    /   \      +                ~ 300 km of wire ~
  | |  | : |   /     \    /_\   ~        ,       ,       ,       ,          +
  | |  | : |  /       \   | |  ~        -+-------+-------+-------+-        /_\
 _| |_ | : | |         |  | |   _  _     |       |       |       |   /\    | |   /\
 | : | | : | |  :: ::  | _| |_|    |     |       |       |       |  /__\  _| |_ /__\
 | : | | : | |  :: ::  | | : || [] |     |       |       |       |  |[]|  | : | |[]|
_|___|_|___|_|_________|_|___||____|_____|_______|_______|_______|__|__|__|___|_|__|_

            C A P I T A L                     the telegraph            T O W N S
       1,000,000 core scribes         100 bit/s, signals at 0.7c   10,000,000 scribes


-------------------------------------------------------------------------------------
                     ONE LAYER  --  k of 120, strictly in order
-------------------------------------------------------------------------------------

  clock         CAPITAL (core)                             TOWNS (periphery)
            1e6 scribes, 10 km wide                     1e7 scribes, 300 km out
    .                  |                                           |
 +0.0 h    +-----------+-----------+                               |
    .      | SELF-ATTENTION        |                               |
    .      | half the city on duty |                               |
    .      | (two 12-hour shifts)  |                               |
    .      | core only: every desk |                               |
    .      | may read the whole    |                               |
    .      | token census          |                               |
    .      |  9.4 h arithmetic     |                               |
    .      | +1.8 h keying across  |                               |
    .      |  the city&#39;s own wires |                               |
+11.3 h    +-----------+-----------+                               |
    .                  |                                           |
    .                  |          MLP inputs for layer k           |
+11.3 h                |------- 327 kbit ~ 0.9 h of keying -------&gt;|
    .                  |       (300 km of light-lag: 1.4 ms)       |
    .                  |                                           |
+12.2 h    +-----------+-----------+                 +-------------+-------------+
    .      | MLP: capital&#39;s share  |                 | MLP FEED-FORWARD          |
    .      | the on-duty half joins|     .  .  .     | ten million desks, each   |
    .      | 0.9 h                 |     in step     | on its own slice; no town |
    .      |                       |     .  .  .     | consults another  (0.9 h) |
+13.0 h    +-----------+-----------+                 +-------------+-------------+
    .                  |                                           |
    .                  |          MLP outputs for layer k          |
+13.0 h                |&lt;------ 327 kbit ~ 0.9 h of keying --------|
    .                  |                                           |
+13.9 h    +-----------+-----------+                               |
    .      | residual add + norm   |                               |
    .      | file the layer record |                               |
    .      | (negligible)          |                               |
    .      +-----------+-----------+                               |
    .                  |                                           |
    v                  v                                           v
             hidden state to layer                       towns sit idle until
             k+1: back to the top                      the next dispatch keys in


-------------------------------------------------------------------------------------
  THE BILL
-------------------------------------------------------------------------------------

  one layer     9.4 + 1.8 + 0.9 + 0.9 + 0.9   =   13.9 hours
  one token     13.95 h  x  120 layers        =   69.7 days
  the split     74% labour / 26% communication

  the capital keys and computes around the clock: two 12-hour shifts, half a
  million desks always lit. the towns need no relief -- each works 0.9 h in
  every 13.9, and the wire itself schedules their rest.

  every communication hour is serialization -- a fist tapping 327,000 bits
  onto the wire at 100 per second. propagation never shows up on the bill:
  the light-lag budget for the whole token is about a third of a second.

=====================================================================================

</code></pre>
]]></content:encoded>
      <guid>https://simoncrowe.blog/scaling-searles-chinese-room-for-large-language-models-jtj6</guid>
      <pubDate>Sun, 05 Jul 2026 16:20:32 +0000</pubDate>
    </item>
    <item>
      <title>Abiogenis: a New Project</title>
      <link>https://simoncrowe.blog/abiogenis-a-new-project</link>
      <description>&lt;![CDATA[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.&#xA;&#xA;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:&#xA;&#xA;It could explain the origins of life on Earth (and elsewhere)&#xA;It should be possible to simulate without resorting to extremely simplified models, like rigid body physics for animals.&#xA;The molecular/cellular scale can have an otherworldly aesthetic, which may work with the generative music part of the project.&#xA;&#xA;What am I planning to build?&#xA;&#xA;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.&#xA;&#xA;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&#39;ll likely write the music-related code in JavaScript and use something like SuperSonic as a synthesis engine; I&#39;m imagining a few subtractive voices and lots of reverb.&#xA;&#xA;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.&#xA;&#xA;Why?&#xA;&#xA;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.&#xA;&#xA;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.&#xA;&#xA;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:&#xA;&#xA;  […]  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.&#34;&#xA;&#xA;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.]]&gt;</description>
      <content:encoded><![CDATA[<p>In 2025, I spent a lot of time on <a href="https://simoncrowe.hashnode.dev/building-a-flat-hunting-shortlist-with-ai-and-a-polyglot-cloud-backend">a project</a> to help me find a flat using a cloud-hosted LLM. This was interesting enough and helped me with my <a href="https://training.linuxfoundation.org/certification/certified-kubernetes-application-developer-ckad/">CKAD</a> exam, but for 2026, I’ve decided to do something that scratches a more philosophical itch.</p>

<p>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:</p>
<ul><li>It could explain the origins of life on Earth (and elsewhere)</li>
<li>It should be possible to simulate without resorting to extremely simplified models, like <a href="https://www.youtube.com/watch?v=oFqwcngsts8">rigid body physics for animals</a>.</li>
<li>The molecular/cellular scale can have an otherworldly aesthetic, which may work with the generative music part of the project.</li></ul>

<h2 id="what-am-i-planning-to-build">What am I planning to build?</h2>

<p>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.</p>

<p>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&#39;ll likely write the music-related code in JavaScript and use something like <a href="https://sonic-pi.net/supersonic/demo.html">SuperSonic</a> as a synthesis engine; I&#39;m imagining a few subtractive voices and <strong>lots</strong> of reverb.</p>

<p>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.</p>

<h2 id="why">Why?</h2>

<p>I haven’t read much philosophy since attempting a <a href="https://spheres-journal.org/contribution/micropolitics-of-a-recommender-system-machine-learning-and-the-machinic-unconscious/">journal article</a> 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 <a href="https://www.goodreads.com/book/show/32486030-consciousness">review of consciousness in recent analytical philosophy</a>. 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 <a href="https://monoskop.org/images/4/46/Kosuth_Joseph_1969_1991_Art_After_Philosophy.pdf">notable exceptions</a>). 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: <em>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.</em></p>

<p>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 <em>substances</em>, <em>properties</em>, whatever.</p>

<p>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:</p>

<blockquote><p>[…]  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.”</p></blockquote>

<p>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.</p>
]]></content:encoded>
      <guid>https://simoncrowe.blog/abiogenis-a-new-project</guid>
      <pubDate>Sun, 28 Dec 2025 14:26:20 +0000</pubDate>
    </item>
    <item>
      <title>I deployed this WriteFreely Blog on a Cheap Hetzner VM using OpenTofu (IaC)</title>
      <link>https://simoncrowe.blog/i-deployed-this-writefreely-blog-on-a-cheap-hetzner-vm-using-opentofu-iac</link>
      <description>&lt;![CDATA[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:&#xA;&#xA;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&#39; content, like Medium does.&#xA;My blog was associated with the general reputation of content on the platform, which wasn&#39;t always favourable.&#xA;I don&#39;t only want to write about software engineering, and that is the focus of the platform.&#xA;&#xA;My reasons for choosing a self-hosted WriteFreely are essentially the inverse of the above points, with a couple more:&#xA;&#xA;Writefreely has an ActivityPub integration, so my blog can be a true citizen of the Fediverse.&#xA;WriteFreely is very simple. It&#39;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.&#xA;&#xA;How did I do it?&#xA;Now that I&#39;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. &#xA;&#xA;Simplicity&#xA;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&#39;t leverage Writefreely&#39;s built-in automatic HTTPS. Luckily, another Go-based project, Caddy, does this, on top of being a solid reverse proxy. &#xA;&#xA;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:&#xA;simoncrowe.blog&#xA;&#xA;reverseproxy localhost:8080&#xA;Yes, this is all that&#39;s required to serve this blog and automatically provision TLS certificates using Let&#39;s Encrypt!&#xA;&#xA;Frugality&#xA;The localhost origin in my Cadddyfile above isn&#39;t typical of a Docker-compose setup. It&#39;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&#39;s Encrypt&#39;s servers, and using the &#34;host&#34; network mode was the simplest way to achieve this.&#xA;&#xA;The laptop I&#39;m typing this on doesn&#39;t have an IPv6 address, so I couldn&#39;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&#39;s v4 IPs. CloudFlare handles everything between the Hetzner IPv6 origin and its own dual-stack infrastructure, at no cost.&#xA;&#xA;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&#39;s terminal emulator. Because I&#39;ve been lazy and put the database in the same machine as the HTTP server, I&#39;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.&#xA;&#xA;On the other hand, maybe my code will help someone else run their own WriteFreely. Here&#39;s the repo.&#xA;&#xA;Cheap compute with a cloud API! What else can Hetzner do?&#xA;Since I managed to throw something functional together in a weekend, I&#39;m wondering what one could do with Hetzner and IaC tooling like OpenTofu, given some time.&#xA;&#xA;While I haven&#39;t explored their full networking and compute capabilities, the impression I got is that they&#39;d be fine to run an early stage European startup&#39;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).&#xA;&#xA;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&#39;t running out of the box).&#xA;&#xA;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.&#xA;&#xA;I&#39;ll keep an eye on Hetzner. I&#39;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.]]&gt;</description>
      <content:encoded><![CDATA[<p>Last year, I created an <a href="https://simoncrowe.hashnode.dev/">engineering-focused blog on hashnode.dev</a>. It was easy, and it served its purpose. However, as time went on, I developed a few niggles with the blogging platform — mainly these:</p>
<ul><li>Writers are at the mercy of the business, which can start charging for things and generally <em>enshitifiying</em> the platform at any time. They could paywall writers&#39; content, like Medium does.</li>
<li>My blog was associated with the general reputation of content on the platform, which wasn&#39;t always favourable.</li>
<li>I don&#39;t <em>only</em> want to write about software engineering, and that is the focus of the platform.</li></ul>

<p>My reasons for choosing a self-hosted WriteFreely are essentially the inverse of the above points, with a couple more:</p>
<ul><li>Writefreely has an ActivityPub integration, so my blog can be a true citizen of the Fediverse.</li>
<li>WriteFreely is very simple. It&#39;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.</li></ul>

<h2 id="how-did-i-do-it">How did I do it?</h2>

<p>Now that I&#39;ve outlined <em>why</em>, 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.</p>

<h3 id="simplicity">Simplicity</h3>

<p>I got a lot of simplicity for free with <a href="https://git.madhouse-project.org/algernon/writefreely-docker/src/branch/main">this WriteFreely Docker image</a>, which neatly encapsulates the initial configuration of WriteFreely as well as data migrations. The image doesn&#39;t leverage Writefreely&#39;s built-in automatic HTTPS. Luckily, another Go-based project, <a href="https://caddyserver.com/">Caddy</a>, does this, on top of being a solid reverse proxy.</p>

<p>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:</p>

<pre><code>simoncrowe.blog

reverse_proxy localhost:8080
</code></pre>

<p>Yes, this is all that&#39;s required to serve this blog and automatically provision TLS certificates using Let&#39;s Encrypt!</p>

<h3 id="frugality">Frugality</h3>

<p>The <code>localhost</code> origin in my <code>Cadddyfile</code> above isn&#39;t typical of a Docker-compose setup. It&#39;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&#39;s Encrypt&#39;s servers, and using the “host” network mode was the simplest way to achieve this.</p>

<p>The laptop I&#39;m typing this on doesn&#39;t have an IPv6 address, so I couldn&#39;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 <code>simoncrowe.blog</code> resolves to some of CloudFlare&#39;s v4 IPs. CloudFlare handles everything between the Hetzner IPv6 origin and its own dual-stack infrastructure, at no cost.</p>

<p>Trade-off time: My insistence on not paying the tiny IPv4 address fee has probably increased the complexity of this. The <em>no SSH</em> 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&#39;s terminal emulator. Because I&#39;ve been lazy and put the database in the same machine as the HTTP server, I&#39;ve already consigned the server to a long existence as a pet. <em>Immutable Infrastructure</em> is not happening here, so doing everything via the Hetzner web console and SSH would have been reasonable.</p>

<p>On the other hand, maybe my code will help someone else run their own WriteFreely. Here&#39;s <a href="https://github.com/simoncrowe/terraform-writefreely-hetzner">the repo</a>.</p>

<h2 id="cheap-compute-with-a-cloud-api-what-else-can-hetzner-do">Cheap compute with a cloud API! What else can Hetzner do?</h2>

<p>Since I managed to throw something functional together in a weekend, I&#39;m wondering what one could do with Hetzner and IaC tooling like OpenTofu, given some time.</p>

<p>While I haven&#39;t explored their full networking and compute capabilities, the impression I got is that they&#39;d be fine to run an early stage European startup&#39;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 <a href="https://docs.hetzner.com/cloud/general/locations/">data centres</a> in Germany, Finland, the US and Singapore (the latter two being rack-space in 3rd party data centres).</p>

<p>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 <code>ec2</code>, some <code>s3</code> and recently a bit of <code>route53</code>). 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, <code>sshd</code> isn&#39;t running <em>out of the box</em>).</p>

<p>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 <a href="https://opentofu.org/docs/language/meta-arguments/lifecycle/">lifecycle policies</a>. 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 <em>some</em> extra latency, but it might be manageable.</p>

<p>I&#39;ll keep an eye on Hetzner. I&#39;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). <em>Serverless</em> versions of every imaginable thing, I can live without.</p>
]]></content:encoded>
      <guid>https://simoncrowe.blog/i-deployed-this-writefreely-blog-on-a-cheap-hetzner-vm-using-opentofu-iac</guid>
      <pubDate>Sat, 06 Dec 2025 23:57:04 +0000</pubDate>
    </item>
  </channel>
</rss>