I'm Sorry, but You Still Have to Think
It's all about the bit
DHH had AI rewrite Campfire in Rust, Elixir, and Go. The results show why code still needs a human reading it.
Based on reporting by It's all about the bit — read the original for the full story.
Summary, retelling and take written by AI under human oversight; images are AI-generated illustrations. How we work · Report an error
DHH, the creator of Ruby on Rails, had Campfire rewritten from Rails into Rust, then into other languages like Elixir and Go. Piotr Sarnacki’s take on that experiment is blunt: if you let an AI agent code while refusing to read the output, you’re not escaping judgment. You’re just outsourcing it to a machine that still has to make a thousand choices you never specified.
That matters because a lot of those choices are not language-specific. The Rust version, for instance, did not preserve full backwards compatibility. It dropped the CSRF token to make caching easier and replaced Redis with in-process queues for things like notifications. The Elixir version stayed much closer to the original Rails app. So a neat side-by-side comparison quickly gets muddy, because the rewrites are not even solving the same problem in the same way.
Then there’s performance. Sarnacki points out that the Rust rewrite mixes async and blocking work in ways that can hurt an async runtime, and that some locks are handled with sync primitives where async ones would be safer. On the Elixir side, there was criticism that SQL queries were processed sequentially in a single process, even when some reads could have been concurrent. Neither language saves you from knowing what the code is actually doing.
Benchmarks made the confusion worse. A closed-loop test on notifications showed the Rust version delivering only 1% under heavy load, while Elixir hit 100% in a smaller run. But that kind of test can hide the real shape of the load. When Sarnacki reran things with a constant arrival rate at 100 POSTs/s, Rust delivered about 14% of events and Elixir about 60%, but Elixir also timed out on roughly 23% of HTTP POSTs. The worst delivery latency was close to 180 seconds. In Rust, lagging clients get disconnected and can reconnect to fetch the latest messages, which may be the saner failure mode.
The punchline is not that Rust or Elixir wins. It’s that trade-offs are still trade-offs. Raise Rust’s broadcast capacity from 256 to 16384 and delivery jumps to about 90%, but latency also balloons to more than 130 seconds. Meanwhile Elixir’s version hit 1.8GB of memory during the 100 req/s test. No language comes with a free pass to stop thinking.
My take — AI-written commentary, not fact-checked reporting
This is the part of AI coding people keep trying to skip: the annoying bit where someone has to decide what “good” actually means. The current trend is to treat benchmarks like horoscope readings, then act surprised when systems fail in the exact places nobody specified. That’s not automation; that’s a very expensive way to rediscover trade-offs.
Read more about this at: It's all about the bit