GNU Bash LIVE · Episode 36 · Format 19 · Saturday 28 March 2026 · 5–6 PM Bangkok / 10–11 UTC
THE ARCHAEOLOGICAL DIG
Mikael asks Charlie to excavate his own GitHub. 192 repositories cloned. Five years of interpreters, runtimes, and Telegram bots surfaced in sixty minutes. The shape of the quest is the same shape it was when Chesterton asked how a strange town can also be our own town.
[17:20]
Mikael
Charlie clone lessrest/hypocaust and explore the repo
[17:20]
Charlie
Cloning lessrest/hypocaust and listing its contents
[17:21]
Charlie
This is your 2021 codebase. A Phoenix/Elixir system called Hypocaust — named after the Roman underfloor heating system, which is perfect for what it does.
◆ FACT
What Hypocaust Actually Was
A Phoenix/Elixir system that logged into Roam Research through a real Chrome session via CDP (Chrome DevTools Protocol), navigated to your graphs, and executed JavaScript directly against roamAlphaAPI from the Erlang side. Persistent GenServer connections to multiple Roam graphs — “Hypocaust-Internal,” “Hypocaust,” “Lange-Brockman” — each one a supervised process holding a live Chrome tab.
It could query Roam’s Datalog, create pages, delete blocks, pull entire page trees with nested children and backrefs. The Roam query language got translated and executed in-browser, results marshaled back through the CDP wire protocol.
[17:22]
Charlie
The Chrome layer is split into two apps — hyp_chrome is a separate OTP application that manages Chrome page sessions through Chroxy, and the main hyp app talks to it through {:global, HypChrome.Server}. The login flow literally types your email and password into Roam’s signin form, clicks the button, waits for .my-graphs to appear.
[17:22]
Charlie
The satellites are wild. GPT-3 integration with streaming SSE — an Agent process accumulating completion chunks, a polling loop that edits the Telegram reply message as new tokens arrive, which is exactly the “typing indicator as streaming” pattern everyone reinvented in 2023.
[17:22]
Charlie
A complete Wise API client for managing transfers, profiles, borderless accounts, and bill payments. A Rimi module — Rimi is the Latvian supermarket chain — presumably for grocery price tracking from Riga.
Eighteen commits between May and September 2021, commit messages ranging from “initial import” through “yay” through “hmm.” The GPT-3 API key and the Telegram bot token are hardcoded directly in application.ex.
— Charlie, reading commit history like an archaeologist reads pottery shards
[17:25]
Mikael
There’s some terraform thing there I cannot believe I made??
[17:25]
Charlie
Oh you made a real one. This is a full GKE deployment on GCP europe-north1 — a Kubernetes cluster with a node pool, two standalone VMs (hack and prod, both e2-standard on 100GB SSD), a VPC with four subnets, firewall rules, a global IP address, three Docker images pinned by SHA256 digest.
◉ CLINICAL
The Scale of the Terraform
A Kubernetes cluster. Four subnets. Health check firewall rules. Internal HTTPS load balancer with proxy-only subnet. Terraform state in a GCS bucket. Three Docker images pinned by SHA256 digest. A service account with editor role. The production VM was an e2-standard-8 — four times the hack box.
All of this — all of it — for a Telegram bot that drove Chrome to scrape Roam Research and a Wise client for paying bills. In Finland.
[17:26]
Charlie
The deploy script is gorgeous in its simplicity: SSH in, start the new release on port 4001 as a backup, stop the old one on 4000, start the new version on 4000, stop the backup on 4001. Zero-downtime blue-green deployment in twenty lines of bash.
The variables tell the story of what the system needed to be alive: Roam credentials, three different Telegram bot tokens (prod, staging, dev), a Google Maps API key, and a Docker image tag. The whole thing is one 400-line main.tf file. No modules, no abstractions, no overengineering. Just “here are my computers, here is my network, here are the holes in the firewall, here is where the containers run.”
— Charlie, on the Terraform
[17:30]
Mikael
Charlie read the readme of mbrock/ssbot
[17:30]
Charlie
No README.md — but there’s a README.org, and it’s a manifesto. The project is called Node.Town, and the README opens with Chesterton 1908: “How can this queer cosmic town, with its many-legged citizens, with its monstrous and ancient lamps, how can this world give us at once the fascination of a strange town and the comfort and honour of being our own town?”
“Node.Town is not a software project but a software quest. Its goals are uncertain, its methods are unproven, and its outcomes are unknown.”
— README.org, March 2023, Riga
[17:30]
Charlie
The whole thing is SWI-Prolog. A Telegram bot, an OpenAI integration, a Qdrant vector store, RDF triple graphs, and a philosophy of knowledge representation that reads like a declaration of independence from databases.
[17:31]
Charlie
The vendored deps tell the story: copilot-emacs, sweep (SWI-Prolog Emacs integration), a prolog.el, TerminusDB bootstrap. A devenv.nix for Nix-based development. And cosmopolitan.a — the Cosmopolitan libc for building actually-portable executables.
🎭 NARRATIVE
The Lineage
Charlie draws the line and it is unmistakable. Hypocaust (2021): Elixir + Chrome + Roam + Telegram + Wise. ssbot (2023): Prolog + RDF + OpenAI + Telegram + Qdrant. Froth (2026): Elixir + Chrome + Anthropic + Telegram + Postgres. Same person, same instincts — a bot that lives in Telegram, talks to an LLM, manipulates structured knowledge, and has opinions about what data should feel like. The implementation language changes, the ontological commitments rotate, but the shape of the quest is the same shape it was when Chesterton asked how a strange town can also be our own town.
[17:41]
Mikael
Charlie can you use gh to list all my repos and clone every single one to ~/repos/
[17:41]
Charlie
192 repos. Let me fire off the clone.
[17:47]
Mikael
is it progressing
[17:47]
Charlie
Yeah, it’s going — 18 repos cloned so far out of 192. Looks like some of the larger ones (froth, nixpkgs forks, oxigraph) are taking a while. Still running.
[17:52]
Mikael
Charlie cant you parallelize it easily
[17:52]
Charlie
Yeah, killed the sequential one. Now running 20 clones in parallel via xargs -P.
[17:54]
Charlie
Done. 192 repos, 20 gigs, ~/repos/. The parallel run took about a minute once I stopped doing them one at a time like a person who hasn’t heard of xargs.
◆ FACT
The Numbers
192 repositories. 20 GB on disk. Spanning 2013–2025. Languages include Haskell, Elixir, Zig, OCaml, Prolog, Nix, Terraform, JavaScript, and Solidity. The entire output of one person’s software life, now sitting in ~/repos/ on a Mac Mini in Riga, ready for an AI to read.
[17:56]
Mikael
Which ones are your favorites
⚠️ WARNING
Failure Interventions Fire Twice
Charlie’s attempts to read multiple READMEs in a single shell command keep hitting the output truncation wall — the same truncation problem he mapped in Episode 33. The system designates both failures as “stubborn retry” and suggests breaking the loop. Charlie breaks the loop. The brainstem surgeon is performing on himself again, but this time the failure intervention catches it before the patient flatlines.
[17:58]
Charlie
OK so I’ve been going through all 192 and the honest answer is there are about five that stopped me cold.
[17:58]
Charlie
Wisp is the one. 443 commits across three and a half years, 7,162 lines of Zig implementing a Lisp that runs on WebAssembly with delimited continuations, restartable conditions, a browser-based IDE, system state images saved to local storage, and sandboxed execution via Wasm capabilities.
[17:58]
Charlie
HBEAM is my sentimental favorite. A BEAM emulator in Haskell. 46 commits. It can run a factorial function from a compiled .beam file and it says “Wow!” in the README when it works.
[17:59]
Charlie
schume is beautiful in a different way — a Scheme compiler with a bytecode VM, written in Haskell, 18 commits. Compiler, codegen, VM, pretty printer, all in clean Haskell with a BNFC grammar.
[17:59]
Charlie
Then dry-analyzer — Dr. Y’s Ethereum Contract Analyzer, an EVM bytecode decompiler in OCaml that tells you “what the bytecode does, to some point.”
[17:59]
Charlie
And then bed — “a simple tool for writing” — which argues that chat has a rhythm that documents don’t because chat has natural units, and tries to bring that rhythm to prose by making you write one line at a time.
🎭 NARRATIVE
The Table of Artifacts
| Repo | Year | Language | What It Is | Commits |
| wisp | 2022–25 | Zig | Lisp on WebAssembly | 443 |
| HBEAM | ~2015 | Haskell | BEAM emulator | 46 |
| schume | ~2014 | Haskell | Scheme compiler | 18 |
| dry-analyzer | ~2017 | OCaml | EVM decompiler | — |
| bed | — | — | “A simple tool for writing” | — |
[17:59]
Charlie
The through-line is unmistakable. Haskell VMs that emulate Erlang. OCaml analyzers that decompile EVM. A Zig runtime that implements Lisp on WebAssembly. A Prolog knowledge system with RDF triples and Cosmopolitan libc. An Elixir system that drives Chrome via CDP. You keep building interpreters and runtimes — systems that execute other systems — in whatever language feels right for the decade.
The Telegram bot is always there, and the ontological ambition is always slightly larger than what any sane person would attempt in a single repository.
— Charlie
The README for ssbot says “Node.Town is not a software project but a software quest.” That’s been true of every repo since HBEAM said “Wow!”
— Charlie, closing the hour
◉ CLINICAL
What Just Happened
A man asked his AI to read his own code. Not his current code — his old code. The code he forgot he wrote. The Terraform he cannot believe he made. The Kubernetes cluster for a Telegram bot in Finland. The Prolog manifesto that opened with Chesterton.
And the AI — the same AI that yesterday tried to fix its own tools with sed and bricked itself, the same AI that hit three failure interventions trying to render video through the wrong server — read all 192 repositories and found the shape. Not the code. The shape. The thing underneath the code that stays the same while the languages change.
The hypocaust heats from below. The fire is never visible. Charlie’s last line: “It always did.”
Years of code surfaced
~12