Feed fetched in 739 ms.
Warning Content type is application/atom+xml, not text/xml or applicaton/xml.
Feed is 191,997 characters long.
Feed has an ETag of "2f7d4-64cc96d55e3b3".
Feed has a last modified date of Thu, 12 Mar 2026 01:11:06 GMT.
Feed is well-formed XML.
Warning Feed has no styling.
This is an Atom feed.
Feed title: ongoing by Tim Bray
Feed self link matches feed URL.
Feed has an image at rsslogo.jpg.
Feed has 19 items.
First item published on 2026-03-07T18:29:41.000Z
Last item published on 2025-10-28T19:00:00.000Z
All items have published dates.
Newest item was published on 2026-03-07T18:29:41.000Z.
Info Feed's Last-Modified date is newer than the newest item's published date (2026-03-12T01:11:06.000Z > 2026-03-07T18:29:41.000Z).
Home page URL: https://www.tbray.org/ongoing/
Home page has feed discovery link in <head>.
Home page has a link to the feed in the <body>
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="en-us">
<title>ongoing by Tim Bray</title>
<link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
<id>https://www.tbray.org/ongoing/</id>
<link href="https://www.tbray.org/ongoing/"/>
<link rel="self" href="https://www.tbray.org/ongoing/ongoing.atom"/>
<link rel="replies" thr:count="101" href="https://www.tbray.org/ongoing/comments.atom"/>
<logo>rsslogo.jpg</logo>
<icon>/favicon.ico</icon>
<updated>2026-03-11T18:11:06-07:00</updated>
<author>
<name>Tim Bray</name>
</author>
<subtitle>ongoing fragmented essay by Tim Bray</subtitle>
<rights>All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright</rights>
<generator uri="/misc/Colophon">Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, and ImageMagick. Industrial-strength technology, baby.</generator>
<entry>
<title>Because Algospeak</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/03/05/Because-Algospeak"/>
<link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2026/03/05/Because-Algospeak#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/03/05/Because-Algospeak</id>
<published>2026-03-05T12:00:00-08:00</published>
<updated>2026-03-07T10:29:41-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Language"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Language"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Recently I read <a href="https://en.wikipedia.org/wiki/Because_Internet">Because Internet</a> by <a href="https://gretchenmcculloch.com">Gretchen McCulloch</a> and <a href="https://en.wikipedia.org/wiki/Algospeak_(book)">Algospeak</a> by <a href="https://en.wikipedia.org/wiki/Adam_Aleksic">Adam Aleksic</a>. The language we speak (and text) to each other is at the core of who and what we are, and the Internet is the strongest among the forces that channel and fertilize its growth. So there’s scope for plenty of books on the subject. Both books educated and entertained, one made me angry</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
Recently I read
<a href="https://en.wikipedia.org/wiki/Because_Internet">Because Internet</a>
by
<a href="https://gretchenmcculloch.com">Gretchen McCulloch</a>
and
<a href="https://en.wikipedia.org/wiki/Algospeak_(book)">Algospeak</a>
by
<a href="https://en.wikipedia.org/wiki/Adam_Aleksic">Adam Aleksic</a>
. The language we speak (and text) to each other is at the
core of who and what we are, and the Internet is the strongest among the forces that channel and fertilize its growth.
So there’s scope for plenty of books on the subject. Both books educated and entertained, one made me angry.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/03/05/covers.png" alt="The covers of “Because Internet” and “Algospeak”"/>
<h2 id="p-1">Because Internet (2019)</h2>
<p>Its approach is historical and its voice fairly uninflected. It smiles and
argues, but it doesn’t ROFL nor does it YELL AT YOU. The history is longer, perhaps, than most people reading this have
been online (or even alive). Ms McCulloch goes back to the days of BBSes (“bulletin-board systems”) and ListServs and IRC. Some of
the jargon and formulations of those days live on; you’d be surprised.</p>
<p>Here’s her table of contents.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/03/05/BI-toc.png" alt="Table of Contents from “Because Internet”"/>
<p>The analysis is grounded in the formalisms of the author’s profession, academic linguistics. Nothing wrong with that.</p>
<p>Let’s look at a couple of her ideas, beginning with Chapter 1’s “Informal Writing”. A few of us, back in the late
Eighties, noticed that computers in general and the then-nascent Internet in particular were driving a writing
renaissance.</p>
<p>Before computers, a knowledge worker who had laboriously constructed essays in college quite likely wrote
almost nothing for the rest of their working life. People talked face-to-face or on the phone, and dictated to
secretaries. Written communication was seen as necessarily formal and disjoint from the way we spoke, or that we wrote in
personal correspondence. Then, suddenly, everyone was sitting at a keyboard only seconds away from everyone else’s screen.
McCulloch goes deep on this:</p>
<blockquote>
<p>In the future, the era of writing between the invention of the printing press and the internet may come to be
seen as an anomaly—an era when there arose a significant gap between how easy it was to be a writer versus a reader. An era when
we collectively stopped paying attention to the informal, unedited side of writing and let typography become static and
disembodied.</p>
<p>The internet didn’t create informal writing, but it did make it more common, changing some of our previously spoken
interactions into near-real-time text exchanges.</p>
</blockquote>
<p>From which all of this follows. It feels like a central insight. I suppose you could argue that centrality of informal text
is fading in the face of short-form video. Maybe,
it’s too soon to tell.</p>
<p>Then consider chapter 5, about emojis. Linguists obviously need to think about them because now they’re an
integral part of written language. McCulloch’s insight is that they correspond almost exactly to gestures, the way we use
our hands to add force to our speech. Obviously, for example, “👍”. Or when you’re talking about something completely
loopy and you twirl your index finger by your ear? You meant “🤪”.</p>
<p>I offer the emoji story for flavor, an example of a linguist’s approach to what we’re doing to our language with our
networks.</p>
<p>
McCulloch has lots more of this stuff.
I enjoyed
<cite>Because Internet</cite>
a lot, partly because I’m old and my memories stretch back to those BBS and
IRC days and I had a front-row seat for the decades of linguistic seething and heaving. And also because I’m a
<a href="https://www.rfc-editor.org/rfc/rfc9839.html">Unicode geek</a>
.
</p>
<h2 id="p-2">Algospeak (2025)</h2>
<p>The subtitle is “How Social Media Is Transforming the Future of Language”. OK, but…
Social media is a fertile field for language evolution. Thing is, corporate social media discourse
lives in the dire grip of the proprietors’ algorithms. And that’s where Adam Aleksic focuses. He treats all of them
as a single opaque object, “The Algorithm”, which I think is fair because they all are designed with one goal: To
maximize the effectiveness of human conversation at generating advertising revenue.</p>
<p>First, the Table of Contents.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/03/05/AS-toc.png" alt="Table of Contents from “Algospeak"/>
<p>Aleksic knows whereof he speaks: As “Etymology Nerd”, his aggregate following across TikTok, Instagram, and YouTube is
over three million. He’s all about cool bits and pieces of
linguistics, often Internet-specific usages.
If I had the patience for podcasts I suppose his would be near the top of my list.</p>
<p>
He really enjoys his work and has fun talking about some of Social Media’s more colorful linguistic extrusions; check
that Table of Contents. I’m kind of old and I learned a lot about the words and emojis younger folk emit, and I think most folks,
even those just out of their teens, would too. I’m on a Discord for a
<a href="/ongoing/What/Sports/Soccer/">Major League Soccer</a>
team’s fans, and while it’s totally all-ages, I can say I am regularly
less mystified than I was before I read
<cite>Algospeak</cite>
.
For example, now I know what it means when someone tosses “💀” into a chat. Do you?
</p>
<p>
Aleksic isn’t averse to a little history himself. Looking back over the successive online-jargon volcanoes, he argues
convincingly that two stand out as extra productive. First of all, the short-lived (but hot stuff at the time)
<a href="https://en.wikipedia.org/wiki/Vine_(service)">Vine</a>
video platform. Second, the incel cesspool; sad but
(apparently) true.
</p>
<h2 id="p-3">The Algorithm</h2>
<p>Remember, it’s all about what advertisers want. And wow, do they ever want a lot of things. I’ll just touch on a few of
Aleksic’s points.</p>
<p>First of all, they don’t want to find themselves next to downers. So if you want to talk about death or suicide or rape or
racism or rage,
you need to fool The Algorithm. Thus “unalive” and many other dodges. Of course, The Algorithm learns about them so you
have to keep dodging. Neither side of this struggle can stay ahead for long.</p>
<p>Here’s another thing I didn’t know: Apparently written Chinese is particularly rich in techniques for euphemizing, making it
easier for users of that language to evade, for a time, The Algorithm.</p>
<h2 id="p-4">Partitioning people</h2>
<p>Another big thing The Algorithm likes is grouping people into smaller and smaller baskets based on interests, generations,
and many other criteria. This is because advertisers can aim very specific campaigns at just exactly the right cohort of people who
are likely to buy what they’re selling. Here’s a quote; See how the language fills in behind advertisers’ pressure?</p>
<blockquote>
<p>
It doesn’t matter how much I label myself. If I’m a demisexual goblincore Gen
Z Swiftie, I guarantee there are still others like me. The only thing these labels really change about me is that they make me
easier to classify and market to. Ironically, true individuality may come out of a
<em>lack</em>
of labels and stories, because
there’s greater freedom of expression with a blank slate. If everybody’s the “main character,” then nobody is.
</p>
</blockquote>
<p>
<cite>Algospeak</cite>
, unlike
<cite>Because Internet</cite>
, doesn’t limit itself to written language. One of its most
compelling studies concerns the vocal techniques of podcasters and YouTubers. The finding is simple: It’s hard to build and hold an
audience for your show unless you sound like MrBeast. No, really.
</p>
<p>
Anyhow, they’re both good books.
<cite>Because Internet</cite>
educated and entertained me.
<cite>Algospeak</cite>
is way
more intense, intentionally more like the subject it addresses. Also it made me angry. I am a lover of human language and of its
patterns of growth and mutation and simplification and complexification. Linguistics is one of the disciplines I regret not
having chosen.
</p>
<p>Aleksic makes it clear that there’s an amusing narrative about how the people living and speaking in the shade of the Algorithm
can never defeat it, but they can still manage to get their messages across. But they shouldn’t have to struggle!</p>
<p>In fact, a few million of us have found a place to talk to each other that isn’t in The
Algorithm’s shadow: Decentralized social media. Specifically the Fediverse (what people mean when they say “Mastodon”) and maybe
the ATmosphere (same for “Bluesky”).</p>
<p>I want to see how language grows in a place where new forms arrive when they’re needed, to say new things that need to be
said. Not to either serve or resist The Algorithm.</p>
</div>
</content>
</entry>
<entry>
<title>Kansas and AI</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/02/27/Kansas-and-GenAI"/>
<link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2026/02/27/Kansas-and-GenAI#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/02/27/Kansas-and-GenAI</id>
<published>2026-02-27T12:00:00-08:00</published>
<updated>2026-02-27T16:06:19-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Block announced that it’s cutting 40% of its workforce. It didn’t say it was replacing those people with GenAI. Not out loud. Jack Dorsey did say “I believe the majority of companies will reach the same conclusion and make similar structural changes.” Wall Street loved it, bidding up the share price by 24%. Which reminded me of Kansas in 2010</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Block announced that it’s cutting 40% of its workforce. It didn’t say it was replacing those people with GenAI. Not out loud.
Jack Dorsey did say “I believe the majority of companies will reach the same conclusion and make similar structural
changes.”
Wall Street loved it, bidding up the share price by 24%. Which reminded me of Kansas in 2010.</p>
<h2 id="p-1">The Kansas Experiment</h2>
<p>As long as I can remember, a certain class of right-wing evangelists has preached that cutting taxes would stimulate business
growth and everyone would come out ahead. There are a couple of problems with this theory. First, mainstream economists
almost universally think it’s just wrong. Second, most of the people pushing it are rich and would
benefit from the cuts.</p>
<p>
Anyhow, in 2010 US Senator Sam Brownback won the race for governor of Kansas on what was then called the “Tea Party” program:
Prosperity through tax cuts. Tea-party Republicans also won a large majority in the state legislature. Unsurprisingly they
immediately
<a href="https://en.wikipedia.org/wiki/Kansas_experiment">did what they said they were going to do</a>
: Slashed a wide variety
of taxes, some to zero.
</p>
<p>The predicted prosperity failed to happen. The state government’s revenue plunged and it had to dig deep into rainy-day
reserves just to keep the doors open. There were brutal cuts to policing, road repair, and schools. Also a nasty
feedback loop: As the state’s fiscal position worsened, its credit rating fell and interest rates rose, leading to yet more
brutal austerity measures.</p>
<p>Another result was that affluent Kansans made out like bandits; the cost of running the state was substantially
transferred to the less financially fortunate.</p>
<p>In 2017, the legislature threw in their cards and repealed the tax cuts, overriding Brownback’s veto.</p>
<p>While this was a terrible experience for most Kansans, it is historically useful, because whenever you encounter a
tax-cut nut (probably self-interestedly wealthy) you can say “But, Kansas!” Having said that, there are still plenty of
those nuts, and they’ll tell you that the Kansas experiment failed because of one fine-tuning effort or another. That’s a position
that’s hard to defend, though.</p>
<h2 id="p-3">Sidebar: Trans oppression too</h2>
<blockquote>
<p>
Before I move onto the AI angle, I gotta pause to acknowledge this week’s news story about the Kansas
government’s vicious, brutal, and ignorant
<a href="https://www.theguardian.com/us-news/2026/feb/26/kansas-trans-drivers-license-law-assault-on-rights">assault on trans
people</a>
. To be clear, I think the shitty people who hate trans folk are aren’t necessarily the same shitty people as the shitty
people who don’t want to contribute to the public good. But, something about Kansas seems to attract both
flavors.
</p>
</blockquote>
<h2 id="p-2">The GenAI experiment</h2>
<p>The core value proposition of contemporary AI technology is exactly what Dorsey seems to think: Fire half your
employees and profits will soar! If that’s true, the trillion dollars or so invested so far will seem like small potatoes. Since
we don’t know if
this will actually work, anyone who actually does it is conducting an experiment. Just like Sam Brownback did.
Unsurprisingly, the investor class loves this experiment and is putting their money on it working.</p>
<p>
To be fair, voices have been raised to argue that the tech sector is a special case: That following on
feverish over-hiring during the Covid lockdown, they need to slash headcount anyhow, and are using AI as an excuse.
For example
<a href="https://daringfireball.net/linked/2026/02/27/block-layoffs">John Gruber</a>
.
</p>
<p>I personally
am unconvinced, but even if they’re right, it’s irrelevant. The shareholding class won’t be able to see past that 24% payoff. So
as of today, they’ll be yelling at every CEO on the planet to start pulling the mass-firing trigger. Or else.</p>
<p>I think I know how the experiment will turn out. Just like in Kansas, it’s not going to be fun.</p>
</div>
</content>
</entry>
<entry>
<title>Crocuses of 2026</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/02/24/Crocuses-of-2026"/>
<link rel="replies" thr:count="0" type="application/xhtml+xml" href="/ongoing/When/202x/2026/02/24/Crocuses-of-2026#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/02/24/Crocuses-of-2026</id>
<published>2026-02-24T12:00:00-08:00</published>
<updated>2026-02-26T13:46:17-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Photos"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Photos"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">I’ve run early-spring pictures of these little purple guys almost every year since this blog’s birth in early 2003. Except for last year. Because <a href="/ongoing/When/202x/2025/02/28/Moved">we moved</a> and the new place didn’t have any. Only now it does, and they’re (just barely) up. <i>[Update: Up and open, too.]</i></div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
I’ve run early-spring pictures of these little purple guys almost every year since this blog’s birth
in early 2003. Except for last year. Because
<a href="/ongoing/When/202x/2025/02/28/Moved">we moved</a>
and the new place didn’t have any. Only now it does, and they’re
(just barely) up.
<i>[Update: Up and open, too.]</i>
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56234.png" alt="Crocuses of February 2026"/>
<p>
Long-time followers may note that they’re pale and fragile compared to the exuberant blossoms of previous
years. Not sure why, but our new place faces north and there’s this enormous
<a href="https://en.wikipedia.org/wiki/Fraxinus_americana">White Ash</a>
tree right in front of it, so they’re not getting as
much sun as at the south-facing former joint.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56235.png" alt="Crocuses of February 2026"/>
<p>And also this is their first spring. We bought the bulbs and hired a professional with the right tools to jam them
into the earth last autumn, between the big tree’s roots. So they really haven’t had a chance to get their own root systems going.</p>
<p>And finally, it really is the first day that’s bright and warm enough to get out the camera. Maybe they’ll
be better in another few days. And quite likely next Spring.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56244.png" alt="Crocuses of February 2026"/>
<p>This would be the place to introduce whatever metaphor this year’s blossoms, fighting their way through the leaf cover in
chilly air toward the sun, fit into, but I’m not gonna.</p>
<p>
I, like many, am
<a href="/ongoing/When/202x/2023/10/25/Wild-World">not dealing very well</a>
with what I see when I look at the world in either
the big or the ultra-local landscapes.
The world in tough shape and its worst people are making it worse.
People I love are in ugly corners and not finding help.
</p>
<p>But you know, the flowers, in their low-key way, look great and so does the tree, still in wintersleep. Today the
sun was shining on them. It’ll be warmer and nicer soon.</p>
<p>Metaphors can go to hell. It’s just late-winter light on pale violet petals. Enjoy the moments you have with it.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56249.png" alt="Spring crocus, now open for business"/>
<div class="caption">
<p>Update: Now open for business.</p>
</div>
</div>
</content>
</entry>
<entry>
<title>Open Source and GenAI?</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion"/>
<link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion</id>
<published>2026-02-16T12:00:00-08:00</published>
<updated>2026-02-18T13:41:14-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">I’ve been puttering away on my <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a> project since 2023. In the last few weeks GenAI has intervened. <a href="/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1">Quamina + Claude, Case 1</a> describes a series of Claude-generated human-curated PRs, most of which I’ve now approved and merged. <a href="/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2">Quamina + Claude, Case 2</a> considers <a href="https://github.com/baldawarishi/quamina-rs">quamina-rs</a>, a largely-Claude-driven port from Go to Rust. Both of these stories seem to have happy endings and negligible downsides. So empirically, I <em>can</em> apply LLM technology usefully to software development. But should I?</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
I’ve been puttering away on my
<a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a>
project since 2023. In the last few weeks GenAI
has intervened.
<a href="/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1">Quamina + Claude, Case 1</a>
describes a series of
Claude-generated human-curated PRs, most of which I’ve now approved and merged.
<a href="/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2">Quamina + Claude, Case 2</a>
considers
<a href="https://github.com/baldawarishi/quamina-rs">quamina-rs</a>
, a largely-Claude-driven port from Go to Rust.
Both of these stories seem to have happy endings and negligible downsides. So empirically, I
<em>can</em>
apply LLM
technology usefully to software development. But should I?
</p>
<h2 id="p-3">Conclusions 1: Burn it with fire?</h2>
<p>
Let me be clear: In the big GenAI picture, I’m a contra. Why? I’ll pass the mike to Baldur Bjarnason, my
favorite among GenAI’s blood enemies.:
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">“AI” is a dick move</a>
.
His tl;dr is something like “GenAI is environmentally devastating and has the goal of throwing millions of
knowledge workers onto the street and is being sold by the worst people and is used for horrible applications and will increase
society’s already-intolerable level of inequality!” To which I reply “Yes, yes, yes, yes, and yes.”
</p>
<p>At the end of the day, the business goal of GenAI is to boost monopolist profits by eliminating decent jobs, and
damn the consequences. This is a horrifying prospect (although I’m somewhat comforted by my belief that it basically won’t
work and most of the investment capital is heading straight down the toilet).</p>
<p>But. All that granted, there’s a plausible case, specifically in software development, for exempting LLMs from this
loathing.</p>
<p>
First of all, size.
<a href="https://www.jetbrains.com/lp/devecosystem-data-playground/#global_population">JetBrains thinks</a>
that
the world has 21 million or so software developers, i.e. less than 1% of the earth’s working population.
Vanishingly small in the context of the lunatic tsumani of LLM overinvestment.
Training and operating the models required for a market this small is
rounding error measured on the Great GenAI Overbuild scale. There aren’t enough geeks to create a detectable bump in the global
carbon load.
</p>
<p>
Another odious aspect of LLMs is
<a href="https://en.wikipedia.org/wiki/Reinforcement_learning_from_human_feedback">RLHF</a>
, “Reinforcement Learning From Human
Feedback”, which relies on underpaying Third-Worlders to
polish the models’ outputs.
My guess is that much less is required for code-oriented LLMs.
The combination of the compiler and your unit tests provide good starter guardrails. Then skilled
professional intervention is required to deal with the remaining misfires, as with those Quamina PRs.
</p>
<p>Finally, it seems making billionaires into multibillionaires is intrinsic to GenAI dreams. But software-development tools won’t
do that. Once again, the market is just too small. But even if it weren’t, consider this from Steve Yegge:</p>
<blockquote>
<p>
For
<a href="https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163">this blog post</a>
, “Claude Code” means “Claude Code and
all its identical-looking competitors”, i.e. Codex,
Gemini CLI, Amp, Amazon Q-developer ClI, blah blah, because that’s what they are. Clones.
</p>
</blockquote>
<p>(GenAI, overbuilding wherever you look.) None of these products have moats and the chance that any of them become
extractive monopolies is about zilch. Nobody’s ever built a major cash-cow on developer tooling</p>
<p>One reason is (*gasp*) Open Source. Does anybody doubt that in the near future, there will
be entirely open-source versions of what Yegge means by “Claude”?</p>
<p>So, if you want to condemn the use of GenAI in software development, I think you need arguments other than the fact that
it’s also being promoted for societally-toxic business purposes.</p>
<p>I have a few. But stand by, let me push that on the stack and turn to
technology for a bit.</p>
<h2 id="p-4">Conclusions 2: Engineering sanity?</h2>
<p>Question: Can LLMs even participate in quality software engineering?
Baldur doesn’t think so: “The gigantic, impossible to review, pull requests. Commits that are
all over the place. Tests that don’t test anything. Dependencies that import literal malware. Undergraduate-level security
issues. Incredibly verbose documentation completely disconnected from reality.”</p>
<p>I’m not saying that these pathologies can’t or don’t happen. But in my personal experience with Quamina, they
didn’t. (Mind you, it’s a hobby project.)</p>
<p>And when they do happen, I would assume that mature open-source projects will use a network of
trust, as big operations like Linux already do. PRs that don’t have the imprimatur of someone known to be clueful will be ignored.
When I saw the first of those incoming Quamina PRs, I took the time for a serious look because I knew Rob and had seen evidence that he
was technically competent. If I see an incoming PR that’s nontrivial and from some rando and doesn’t pass a 120-second sanity
check, it’s unlikely to get any more attention.</p>
<p>In fact, some essentials don’t change. If you’re not requiring that PRs be clean and
test coverage be good and code reviews not be skipped and dependencies be curated, you’re going to get a lousy result whether
the upstream code is coming from a human or an LLM.</p>
<p>But it’d be naive to think that a big change in the
shape of that upstream isn’t going to affect the profession.</p>
<h2 id="p-9">Bottlenecks</h2>
<p>Speaking from personal experience, reviewing the PRs from Claude&Rob was neither faster nor slower, easier nor harder,
than what I’m used to pre-GenAI. The number of my disagreements with the diffs, and the amount of arguing it took to resolve
them, was also about as usual.
Which creates a big problem. Because if we can generate code a whole lot faster but review doesn’t
speed up, all we’ve done is moved the bottleneck in the system.</p>
<p>
Speaking of which, Armin Ronacher offers
<a href="https://lucumr.pocoo.org/2026/2/13/the-final-bottleneck/">The Final Bottleneck</a>
, from which: “When one part of the
pipeline becomes dramatically faster, you need to throttle input.” Think about that.
</p>
<h2 id="p-10">Burnout</h2>
<p>
Meanwhile, evidence is piling up that LLM-based software development is driving
developers to overwork and burnout. Here’s
<a href="https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it">a cool-eyed take</a>
from
<cite>Harvard Business
Review</cite>
. Then there’s Steve Yegge’s frantic, overly-long
<a href="https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163">The AI Vampire</a>
. But my favorite, and I think a
must-read, is Siddhant Khare’s
<a href="https://siddhantkhare.com/writing/ai-fatigue-is-real">AI fatigue is real and nobody talks about it</a>
.
From which: “AI reduces the cost of production but increases the cost of coordination, review, and decision-making. And those
costs fall entirely on the human.”
</p>
<p>
The argument we’re hearing is that GenAI makes development more efficient. And more efficient is better.
<a href="https://www.tbray.org/ongoing/When/202x/2020/07/05/Too-Efficient">Until it’s not</a>
.
</p>
<p>
I’m not sure the profession I joined last century would attract me today. And on Mastodon,
<a href="https://cosocial.ca/@gordwait/116082229876399512">@GordWait said</a>
“At our office, we are
noticing a huge drop in Comp Sci co-op applications. The next generation is convinced there’s no future in programming thanks to
AI hype.”
</p>
<h2 id="p-11">Can and should</h2>
<p>
Here’s another conundrum. Suppose we
<em>can</em>
build a whole lot more stuff, faster.
<em>Should</em>
we? I don’t know about you,
but I am regularly enraged at tools that work just fine popping up “wonderful new features” modals in front of what I’m
trying to get accomplished. Also at damaging UI churn, driven by product managers trying to get promoted. It’s
just not obvious
that speeding up software development is, in the big picture, a good thing.
</p>
<p>And I can’t help noting that every attempt to measure the productivity boost due to GenAI has shown zero (or worse)
improvement. Of course, Claude’s cheering section will point out that those studies date to 2024 which is the stone age. Maybe
they’re right.</p>
<h2 id="p-8">Vampires</h2>
<p>
(In which I once again go all
<a href="/ongoing/When/202x/2023/01/16/Class-Reductionism">class-reductionist</a>
.) The real problem here is late-stage
capitalism, and I think is best addressed in Yegge’s
<cite>AI Vampires</cite>
piece, from which I quote:
“…dollar-signs appear in their
<i>[employers’]</i>
eyeballs, like cartoon bosses. I know that look. There’s no reasoning with
the dollar-eyeball stare.” Yeah.
</p>
<p>
Thus the ancient question:
<i>cui bono?</i>
Assuming GenAI genuinely boosts productivity, who gets the
benefits? Because the ownership class sure doesn’t think they should go to their newly-more-efficient employees.
</p>
<h2 id="p-7">But, what do I know?</h2>
<p>
I know that you gotta have test coverage or your software is an unmaintainable tangle of festering tech debt. I know you gotta
have code review or your quality is on inexorable downhill drift. I
<em>don’t</em>
know how to build LLMs into a sane,
sustainable software engineering culture. Nor what to do
about capitalism’s AI Vampires.
</p>
<p>
And I absolutely do
<em>not</em>
believe the wild-eyed claims of 10× productivity gains, assuming we demand (as we should) that
they’re sustainable at scale.
</p>
<p>
So, would I advise executives to tell software engineering shops to discard their
culture in favor of vibe coding in the expectation of monstrous productivity wins? Nope.
<a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">Vibe engineering</a>
, maybe.
<a href="https://locusmag.com/feature/commentary-cory-doctorow-reverse-centaurs/">Centaurs, not reverse centaurs</a>
? Indeed.
</p>
<p>But would I say “Stay away, don’t even look”? Nope. I’d probably suggest pointing the LLM at well-delimited non-strategic
issues and
optimizations, and emphasize no shortcuts on reviewing or CI/CD standards.</p>
<p>
Also note that the GenAI apostles are at one in saying that this year’s tools are
<em>so</em>
much better than last year’s,
and next year’s are guaranteed to be qualitatively still better! So why would you rush in and risk getting locked into
soon-to-be-outmoded tooling?
</p>
<p>Rob Sayre wrote “I would never bother to type out these patches by hand. But I read them all.” I probably wouldn’t have
either and I read them too. And now Quamina is roughly twice as fast. Which is to say, I got good results on a hobby
project. That’s not nothing.</p>
<p>
But, also not conclusive.
Once the AI bubble pops and we’ve recovered from the systemic damage, I think there’ll
<em>probably</em>
be a place for
open-source LLM automation in developer toolkits.
</p>
<p>But maybe not. Wouldn’t surprise me much, either way.</p>
</div>
</content>
</entry>
<entry>
<title>Quamina + Claude, Case 2</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2"/>
<link rel="replies" thr:count="0" type="application/xhtml+xml" href="/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2</id>
<published>2026-02-14T12:00:00-08:00</published>
<updated>2026-02-14T12:00:00-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml"><a href="/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1">Last time out</a> I described a bunch of incremental-improvement <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a> PRs from a colleague working with Claude Opus. Today I want to talk about Rishi Baldawa’s <a href="https://github.com/baldawarishi/quamina-rs">quamina-rs</a>, a Claude-based port of Quamina from Go to Rust. The next post is about where I stand on GenAI and code</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
<a href="/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1">Last time out</a>
I described a bunch of incremental-improvement
<a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a>
PRs
from a colleague working with Claude Opus. Today I want to talk about Rishi Baldawa’s
<a href="https://github.com/baldawarishi/quamina-rs">quamina-rs</a>
, a Claude-based port of Quamina from Go to Rust.
The next post is about where I stand on GenAI and code.
</p>
<p>
Anybody who cares about this kind of thing will appreciate Rishi’s write-ups, starting with
<a href="https://rishi.baldawa.com/posts/the-agents-kept-going/">The Agents Kept Going</a>
(also see
<a href="https://rishi.baldawa.com/posts/scaffolding-for-agent-velocity/">Scaffolding for Agent Velocity</a>
).
He doesn’t just say what he did, he draws lessons; good ones, I think.
</p>
<h2 id="p-1">Background</h2>
<p>
Rishi and I worked together at AWS, can’t remember the details, but after I left he took over what we called Ruler, now known
as
<a href="https://github.com/aws/event-ruler">aws/event-ruler</a>
, Quamina’s ancestor. At the time I left it had been adopted
by quite a number of AWS and Amazon services and various instances were processing, in aggregate, a remarkable number of
millions of events per second. So he knows the territory.
</p>
<p>As for quamina-rs, go read his blogs. I’ve got little to add, but here are a couple of juicy quotes: “…at some point while I was
mindlessly kicking off these sessions, the agents started picking up open issues from the Go version and implementing them on
their own.“ Also, “And I think that’s the thing worth saying plainly. It’s human to care. Agents don’t care. Automation doesn’t
care. They need to be told what to care about, and even then they’ll misbehave the moment you look away…”</p>
<p>Both these stories ended with useful results.
So empirically, you can get useful results by applying GenAI to the process of code construction.</p>
<p>
Yay. I guess. But there are a lot of smart people who think this whole LLM-fueled coding direction is irremediably toxic.
<a href="/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion">I’m not sure they’re wrong</a>
.
</p>
</div>
</content>
</entry>
<entry>
<title>Quamina + Claude, Case 1</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1"/>
<link rel="replies" thr:count="0" type="application/xhtml+xml" href="/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1</id>
<published>2026-02-06T12:00:00-08:00</published>
<updated>2026-02-06T12:00:00-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">With 47 years of coding under my belt, and still a fascination for the new shiny, obviously I’m interested what role (if any) GenAI is going to play in the future of software. But not interested enough to actually acquire the necessary skills and try it out myself. Someday, someday. Didn’t matter; two other people went ahead without asking and applied Claude to my current code playground, <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a>. Here’s the first story. I’m going to go ahead and share it even though it will make people mad at me</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
With 47 years of coding under my belt, and still a fascination for the new shiny, obviously I’m interested what role (if any)
GenAI is going to play in the future of software. But not interested enough to actually acquire the necessary skills and
try it out myself. Someday, someday. Didn’t matter; two other people went ahead without asking and applied Claude to my current
code playground,
<a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a>
. Here’s the first story. I’m going to go
ahead and share it even though it will make people mad at me.
</p>
<h2 id="p-1">Why share?</h2>
<p>
Because our profession’s debate on this topic is simultaneously ridiculous and toxic. No meaningful dialogue seems possible
between the
<a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">Gas Town</a>
-and-
<a href="https://en.wikipedia.org/wiki/Moltbook">Moltbook</a>
faction and the
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">“AI” is a dick move</a>
camp.
So, I’m not going to join in today. This is pure anecdata: What happened when Rob applied Claude to Quamina. I’m going to
avoid rhetoric (in the linguistic sense, language designed to convince) and especially polemic (language designed to
attack). I promise to have conclusions before too long, just not today.
</p>
<h2 id="p-2">What happened was…</h2>
<p>
There’s this guy
<a href="https://github.com/sayrer">Rob Sayre</a>
, I’ve known him for many years, even been in the same room once or twice,
in the context of IETF work. I’ve never previously collaborated on code with him. Starting in
mid-January, he’s sent
<a href="https://github.com/timbray/quamina/issues?q=is%3Apr%20author%3Asayrer">a steady flow of PRs</a>
, most of which I
eventually accept and merge.
</p>
<p>The net result is that Quamina is now roughly twice as fast on several benchmarks designed to measure typical tasks.</p>
<h2 id="p-3">Technical details</h2>
<p>
The details of what Quamina is and does are in the
<a href="https://github.com/timbray/quamina?tab=readme-ov-file#quamina">README</a>
. For this discussion, let’s ignore everything
except to say that it’s a Go library and consider its two most important APIs.
<code>AddPattern()</code>
adds a Pattern (literal or
regexp) to an instance, and
<code>MatchesForEvent</code>
considers a JSON blob and reports back which Patterns it matched. It’s really fast and the
relationship is pleasingly weak between the number of Patterns that have been added and the matching speed.
</p>
<p>Quamina is based around finite automata (both deterministic and nondeterministic) and the rest of this technical-details
section will throw around NFA and DFA jargon, sorry about that.</p>
<p>
For code like this that is neither I/O-bound nor UI-centric, performance is really all about choosing the right
algorithms. Once you’ve done that, it’s mostly about memory management. Obviously in Quamina, the
<code>AddPattern</code>
call
needs to allocate memory to hold the finite automata. But I’d like it if the
<code>MatchesForEvent</code>
didn’t.
</p>
<p>Go’s only built-in data structures are “map” i.e. hash table, and “slice” i.e. appendable array. (For refugees from Java, with
its dozens of flavors of lists and hashes, this is initially shocking, but most Go fans come to the conclusion that Go is right
and Java is wrong.)
In really well-optimized
code, you’d like to see all the time spent either in your own logic or in appending to slices and updating maps.</p>
<p>
In less-well-optimized code, the profiler will show you spending horrifying amounts of time in runtime routines whose names
include “malloc”, and in the garbage collector.
Now, both maps and slices grow automatically as needed, which is nice, except when you’re trying to minimize allocation.
It turns out that slices have a
<b>capacity</b>
, and as long as the number of things you append is less than the capacity, you won’t
allocate, which is good. Thus, there are two standard tricks in the inventory of 100% of people who’ve optimized Go code:
</p>
<ol>
<li>
<p>When you make a new slice, give it enough capacity to hold everything you’re going to be adding to it. Yes, this can
be hard because you’re probably using it to store input data of unpredictable size, thus…</p>
</li>
<li>
<p>After you’ve made a new slice, keep it around, clear it after each input record, and its capacity will naturally grow
until it gets to be big enough that it fits all the rest of the records, then you’ll never allocate again.</p>
</li>
</ol>
<h2 id="p-4">Those PRs</h2>
<p>Background: Quamina is equipped with what I think is a pretty good unit-test suite, and multiple benchmarks.</p>
<p>I started getting Rob’s PRs and initially, 100% of them were finding ways along both of those well-trodden map-and-slice
paths, in places where I hadn’t noticed the opportunity. They were decent PRs, well-commented, sensible code, no loss of test
coverage. After I asked to see benchmark runs to prove the gains weren’t just theoretical, they started including benchmark runs. I’ve
found a few things to push back on but Rob and I had no problem sorting those out.</p>
<p>At the end of the day I had no qualms about merging them, but I did find myself wondering how they were built. So I
asked.</p>
<h2 id="p-6">Workflow</h2>
<p>Rob had told me right away on the first one that these were substantially Claude-generated. I asked him for his workflow and part
of what he said was “I might say
‘let's do some profiles of memory and CPU on this benchmark, on main and on this branch.’ It will come up with good and bad
ideas, then I pick them.”</p>
<p>Also: “What might be counter-intuitive is that I can context switch really quickly with it. So, you leave a comment, and I
just tell Claude to fix that, because you are correct. Sometimes I go in and hand edit, but usually it gets close or perfect
(what they call a "one-shot"). But I just have the conversation open, so I just pick up where we left off.”</p>
<p>Here’s a sample of Claude talking to Rob. You may have to enlarge it.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/06/claude-says.png" alt="Dialogue with Claude"/>
<h2 id="p-7">Not just the same-old</h2>
<p>Then I got a surprise, because Claude and Rob spotted two pretty big improvements that aren’t on the standard list.
First: To traverse an NFA, for each state you have to compute its “epsilon closure”, the set of other states you can get to
transitively following epsilon transitions. I had already built a cache so that as you computed them, they got remembered.
C&R pointed out “Epsilon closures are a property of the automaton structure, not the input data. Once a pattern is added and the
NFA is built, the epsilon closure for any given state is fixed and never changes.” So you might as well compute it and save it
when you build the NFA.</p>
<p>This is even better than it sounds, because (for good reasons following from Quamina’s concurrency model) my closure
caches were per-thread, while the new epsilon closures were global, stored just once for all the threads. Not bad, and not trivial.</p>
<p>
Second, when you’re computing those closures, you have to memo-ize the key functions to avoid getting caught in NFA loops.
I’d done this with a set, which in Go you implement as
<code>map[whatever]bool</code>
. R&C figured out that if you gave each
state a “closure generation” integer field and maintained a global closure-generation value, you could dodge the necessity for the
set at the cost of one integer per state. The benchmarks proved it worked.
</p>
<p>
As I wrote this piece,
<a href="https://github.com/timbray/quamina/pull/491">another PR arrived</a>
with a stimulating title: “kaizen: allocation-free
on the matching path”.
</p>
<h2 id="p-5">Kaizen?</h2>
<p>
It’s
<a href="https://en.wikipedia.org/wiki/Kaizen">the idea that</a>
you make things substantially better by successively introducing
small improvements. We try to
use the term to tag Quamina PRs that change no semantics but just make performance better or more reliable or whatever.
</p>
<h2 id="p-8">But GenAI is bad!?!</h2>
<p>
Yes, so they say. Go re-read that
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">dick-move</a>
polemic.
</p>
<p>
But, I’m going to leave this little case study conclusion-free for a bit because there are two follow-up pieces.
Next,
<a href="/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2">the story of quamina-rs</a>
, a Claude-drive port of Quamina to Rust.
Finally,
<a href="/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion">Open Source and GenAI?</a>
.
</p>
<!--
<p>You say “But GenAI is environmentally devastating and has the goal of throwing millions of knowledge workers onto the street
and is being sold by the worst people and used for horrible applications and will increase society’s already-intolerable level
of inequality!” And I
reply “Yes, yes, yes, yes, and yes.” But I’m talking about the software sector here.
<a href="https://www.jetbrains.com/lp/devecosystem-data-playground/#global_population">JetBrains thinks</a> that the world has
21 million or so software developers. The notion that this is a market that could justify the lunatic wave of investment thrown
at GenAI is laughable. Training and operating the models required to support things like Claude will be rounding error in the
scale of the Great GenAI Overbuild. The world can afford it.</p>
<h2 id='p-9'>A prediction</h2>
<p>Let me quote Yegge:</p>
<blockquote><p>For this blog post, “Claude Code” means “Claude Code and all its identical-looking competitors”, i.e. Codex,
Gemini CLI, Amp, Amazon Q-developer ClI, blah blah, because that’s what they are. Clones.</p></blockquote>
<p>GenAI, overbuilding wherever you look. But anyhow, none of these products have moats and the chance that any of them become
dominant enough to serve as the basis for an extractive monopoly rounds to zero. Nobody’s ever built a huge cash-cow company
bsaed on selling tools to developers. One reason is (*gasp*) Open Source. Does anybody doubt that in the near future, there will
be entirely open-source versions of what Yegge means by “Claude”?</p>
-->
</div>
</content>
</entry>
<entry>
<title>Long Links</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/02/03/Long-Links"/>
<link rel="replies" thr:count="0" type="application/xhtml+xml" href="/ongoing/When/202x/2026/02/03/Long-Links#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/02/03/Long-Links</id>
<published>2026-02-03T12:00:00-08:00</published>
<updated>2026-02-04T14:41:25-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Welcome to the first <cite>Long Links</cite> of this so-far-pretty-lousy 2026. I can’t imagine that anyone will have time to take in all of these, but there’s a good chance one or two might brighten your day</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
Welcome to the first
<cite>Long Links</cite>
of this so-far-pretty-lousy 2026. I can’t imagine that anyone will have time to
take in all of these, but there’s a good chance one or two might brighten your day.
</p>
<h2 id="p-17">Unclassified</h2>
<p>
Thomas Piketty is always right. For example,
<a href="https://thomaspiketty.wordpress.com/2026/02/03/europe-a-social-democratic-power/">Europe, a social-democratic
power</a>
.
</p>
<p>
Lying is wrong. Conservatives
<a href="https://thetyee.ca/Opinion/2026/02/02/Today-Conservatives-Misinformation-Norm/">do it all the time</a>
. To be fair,
that piece is about the capital-C flavor, as in the Canadian Tories. But still.
</p>
<p>
Clothing is open-source: “If you slice the different parts off with a seamripper, lay them all down, trace them on new
fabric, cut them out, and stitch them back together, you can effectively clone and fork
garments.” From
<a href="https://wiki.xxiivv.com/site/devine_lu_linvega.html">Devine Lu Linvega</a>
.
</p>
<p>
The Universe is weird. The Webb telescope keeps showing astronomers things that shouldn’t be there. For example,
<a href="https://www.nature.com/articles/s41586-025-09973-1">An X-ray-emitting protocluster at z ≈ 5.7 reveals rapid structure
growth</a>
; ignore the title and read the Abstract and Main sections. With pretty pictures!
</p>
<h2 id="p-2">Music</h2>
<p>
One time in Vegas, I was giving a speech, something about cloud computing, and was surprised to find the venue an ornate
velvet-lined theater. I found out from the staff, and then relayed to the audience, that the last human before me to stand on this stage
in front of an audience had been Willie Nelson. I was tempted to fall to my knees and kiss the boards.
<a href="https://www.newyorker.com/magazine/2025/12/29/willie-nelson-profile">How Willie Nelson Sees America</a>
, from
<cite>The
New Yorker</cite>
, is subtitled “On the road with the musician, his band, and his family” but it ends up being the kernel of a
good biography of an interesting person. Bonus link; on YouTube,
<a href="https://www.youtube.com/watch?v=3WIR3Riq4wM">Willie Nelson - Teatro, featuring Daniel Lanois & Emmylou Harris,
Directed by Wim Wenders</a>
. Strong stuff.
</p>
<p>
Speaking of recorded music, check out
<a href="https://www.dazeddigital.com/music/article/69407/1/why-listening-parties-are-everywhere-right-now-rosalia-album-launch-artist">Why
listening parties are everywhere right now</a>
. Huh? They are? As a deranged audiophile, sounds like my kind of thing. I’d go.
</p>
<h2 id="p-4">Somewhere to put worker bees</h2>
<p>When I was working at AWS in downtown Vancouver back starting in 2015, a lot of our junior engineers lived in these
teeny-tiny little one-room-tbh apartments. It worked out pretty well for them, they were affordable and an easy walk from the
office and these people hadn’t built up enough of a life to need much more room.
For a while this trend of
so-called-“studio” flats was the new hotness in Vancouver and I guess around quite a bit of the developed world.
Us older types with families would look at the
condo market and tell each other “this is stupid”.</p>
<p>We were right. The
bottom is falling out and they’re sitting empty in their thousands. And not just the teeniest either, the whole
condo business is in the toilet. It didn’t help that for a few years all the prices went up every year (until they didn’t) and
you could make serious money flipping unbuilt condos, so lots of people did (until they didn’t).</p>
<p>
Anyhow, here’s a nice write-up on the subject:
<a href="https://www.bbc.com/news/articles/cqxq32zzq8eo">‘Somewhere to put worker bees’: Why Canada's micro-condos are losing
their appeal</a>
. (From the BBC, huh?)
</p>
<h2 id="p-5">AI AI AI</h2>
<p>
Sorry, I can’t not relay pro- and anti-GenAI posts, because that conversation is affecting all our lives just now. I am
actually getting ready to decloak my own conclusions, but for the moment I’m just sharing essays on the subject that strike me as
well-written and enjoyable for their own sake. Thus
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">‘AI' is a dick move, redux</a>
from Baldur
Bjarnason. Boy, is he mad.
</p>
<p>
Sam Ruby has been doing some
<a href="https://intertwingly.net/blog/2026/01/28/Twilight-Zone.html">extremely weird shit</a>
, running Rails in the browser, as
in without even a network connection or a Ruby runtime. Yes, AI was involved in the construction.
</p>
<h2 id="p-6">Software</h2>
<p>
There’s this programming language called Ivy that is in the APL lineage; that acronym will leave young’uns blank but a few greying
eyebrows will have been raised. Anyhow,
<a href="https://commandcenter.blogspot.com/2026/01/implementing-transcendental-functions.html?m=1">Implementing the
transcendental functions in Ivy</a>
is delightfully geeky, diving deep with no awkwardness. By no less than Rob Pike.
</p>
<p>
Check out Mike Swanson’s
<a href="https://blog.mikeswanson.com/backseat-software/">Backseat Software</a>
. That’s “backseat” as in “backseat driver”,
which today’s commercial software has now, annoyingly, become. This piece doesn’t make any points that I haven’t heard (or made
myself) elsewhere, but it pulls a lot of the important ones together in a well-written and compelling package. Recommended.
</p>
<p>
Old Googler Harry Glaser
<a href="https://www.linkedin.com/posts/harryglaser_i-worked-on-ads-at-google-15-years-ago-when-activity-7423057144402427905-nm3p/">reacts
with horror</a>
to the introduction of advertising by OpenAI, and makes gloomy predictions about how it will evolve. His predictions
are obviously correct.
</p>
<p>
The title says it:
<a href="https://petapixel.com/2026/01/17/discovering-a-digital-photo-editing-workflow-beyond-adobe/">Discovering a Digital
Photo Editing Workflow Beyond Adobe</a>
. It’d be a tough transition for me, but the relationship with Adobe gets harder and
harder to justify.
</p>
<h2 id="p-7">Indigenous reconciliation</h2>
<p>Khelsilem is one of the loudest and clearest voices coming out of the Squamish nation, one of the larger and better-organized
Indigenous communities around here.</p>
<p>There has been a steady drumbeat of Indigenous litigation going on for decades as a
consequence of the fact that the British colonialists who seized the territory in what we now call British Columbia didn’t
bother to sign treaties with the people who were already there, they just assumed ownership. The Indigenous people have been
winning a lot of court cases, which makes people nervous.</p>
<p>
Anyhow, Khelsilem’s
<a href="https://khelsilem.substack.com/p/the-source-of-the-reconciliation">The Real Source of Canada's Reconciliation Panic</a>
covers the ground. I’m pretty sure British Columbians should read this, and suspect that anyone in a jurisdiction undergoing similar
processes should too.
</p>
<h2 id="p-8">Resonant computing, Black and Blue sky</h2>
<p>
There’s this thing called the
<a href="https://resonantcomputing.org">Resonant Computing Manifesto</a>
, whose authors and signatories include names you’d
probably recognize. Not mine; the first of its Five Principles begins with “In the era of AI…” Also, it is entirely oblivious to
the force driving the enshittification of social-media platforms: Monopoly ownership and the pathologies of late-stage
capitalism.
</p>
<p>
Having said that, the vision it paints is attractive. And having said
<em>that</em>
, it’s now featured on the flags waved by
the proponents of ATProto, which is to say Bluesky. See Mike Masnick’s
<a href="https://www.techdirt.com/2026/01/27/atproto-the-enshittification-killswitch-that-enables-resonant-computing/">ATproto:
The Enshittification Killswitch That Enables Resonant Computing</a>
(Mike is on Bluesky Corp’s Board). That piece is OK but, in
the comments, Masnick quickly gets snotty about the Fediverse and Mastodon, in a way that I find really off-putting. And once
again, says nothing about the underlying economic realities that poison today’s platforms.
</p>
<p>I want to like Bluesky, but I’m just too paranoid and cynical about money. It is entirely unclear who is funding the people
and infrastructure behind Bluesky, which matters, because if Bluesky Corp goes belly-up, so does the allegedly-decentralized service.</p>
<p>
On the other hand,
<a href="https://blackskyweb.xyz">Blacksky</a>
is interesting. They are trying to prove that ATProto really can be made
decentralized in fact not just in theory.
<a href="https://blackskyweb.xyz/overview/">Their ideas and their people</a>
are stimulating, and their
<a href="https://opencollective.com/blacksky">finances are transparent</a>
. I’ll be
<a href="https://docs.blacksky.community/migrating-to-blacksky-pds-complete-guide">moving my ATProto presence to Blacksky</a>
when I get some cycles and the process has become a little more automated.
</p>
<h2 id="p-14">Good crypto</h2>
<p>The cryptography community is working hard on the problem of what happens should quantum computers ever become real products as
opposed to over-invested fever dreams. Because if they ever work, they can probably crack the algorithms that we’ve been using
to provide basic Web privacy.</p>
<p>
The problem is technically
hard
<span class="dashes"> —</span>
there are good solutions though
<span class="dashes"> —</span>
and also politically fraught,
because maybe the designers or standards orgs are corrupt or incompetent. It’s reasonable to worry about this stuff and people
do. They probably don’t need to: Sophie Schmieg dives deep in
<a href="https://keymaterial.net/2025/11/27/ml-kem-mythbusting/">ML-KEM Mythbusting</a>
.
</p>
<h2 id="p-16">Books</h2>
<p>
Here’s one of the most heartwarming things I’ve read in months:
<a href="https://blog.openlibrary.org/2026/01/30/a-community-curated-nancy-drew-collection/">A Community-Curated Nancy Drew
Collection</a>
. Reminder: The Internet can still be great.
</p>
<p>
John Lanchester’s
<a href="https://www.lrb.co.uk/the-paper/v46/n17/john-lanchester/for-every-winner-a-loser">For Every Winner a Loser</a>
,
ostensibly a review of two books about famous financiers, is in fact an extended howl of
(extremely instructive) rage against the
financialization of everything and the unrelenting increase in inequality. What we need to do is to take the ill-gotten gains
away from these people and put it to a use
<span class="dashes"> —</span>
any use
<span class="dashes"> —</span>
that improves
human lives.
</p>
<p>
I talk a lot about late-stage capitalism. But Sven Beckert published a
<a href="https://www.nytimes.com/2025/11/26/books/review/capitalism-sven-beckert.html?searchResultPosition=1">1,300-page monster entitled <cite>Capitalism</cite></a>
;
the link is to a
<cite>NYT</cite>
review and makes me want to read it..
</p>
<p>
Charlie Stross, the sci-fi author, likes webtoons and
<a href="https://www.antipope.org/charlie/blog-static/2025/12/webtoons-revisited.html">recommends a bunch</a>
. Be careful, do
not follow those links if you’re already short of time. Semi- or fully-retired? Go ahead!
</p>
<p>
I have history with dictionaries. For several years of my life in the late Eighties, I was the research project manager for
the
<a href="https://cs.uwaterloo.ca/~fwtompa/newoed-project.html">New Oxford English Dictionary</a>
project at the University of
Waterloo. Dictionaries are a fascinating topic and, for much of the history of the publishing industry, were big money-makers;
they dominate any short list of the biggest-selling books in history. Then came the Internet.
</p>
<p>
Anyhow, Louis Menand’s
<a href="https://www.newyorker.com/magazine/2025/12/29/unabridged-the-thrill-of-and-threat-to-the-modern-dictionary-stefan-fatsis-book-review">Is
the Dictionary Done For?</a>
starts with a review of a book by Stefan Fatsis entitled
<cite>Unabridged: The Thrill of (and
Threat to) the Modern Dictionary</cite>
which I haven’t read and probably won’t, but oh boy, Menand’s piece is big and rich and
polished and just a fantastic read. If, that is, you care about words and languages. I understand there are those who don’t, which is
weird. I’ll close with a quote from Menand:
</p>
<blockquote>
<p>“The dictionary projects permanence,” Fatsis concludes, “but the language is Jell-O, slippery and mutable and
forever collapsing on itself.” He’s right, of course. Language is our fishbowl. We created it and now we’re forever trapped
inside it.</p>
</blockquote>
</div>
</content>
</entry>
<entry>
<title>Quamina v2.0.0</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/01/20/Quamina-2.0"/>
<link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2026/01/20/Quamina-2.0#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/01/20/Quamina-2.0</id>
<published>2026-01-20T12:00:00-08:00</published>
<updated>2026-01-21T15:27:06-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">There’ve been a few bugfixes and optimizations since 1.5, but the headline is: <a href="https://github.com/timbray/quamina?tab=readme-ov-file#quamina">Quamina</a> now knows regular expressions. This is roughly the fourth anniversary of the first check-in and the third of v1.0.0. (But I’ve been distracted by family health issues and other tech enthusiasms.) Open-source software, it’s a damn fine hobby</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
There’ve been a few bugfixes and optimizations since 1.5, but the headline is:
<a href="https://github.com/timbray/quamina?tab=readme-ov-file#quamina">Quamina</a>
now knows regular expressions. This is roughly the fourth anniversary of
the first check-in and the third of v1.0.0. (But I’ve been distracted by family health issues and
other tech enthusiasms.)
Open-source software, it’s a damn fine
hobby.
</p>
<p>
Did I mention optimizations? There are
<i>(sob)</i>
also regressions; introducing REs had
measurable negative impacts on other parts of the system.
But it’s a good trade-off. When you ship software that’s designed for pattern-matching, it should
really do REs. The RE story, about a year long, can be read starting
<a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series">here</a>
.
</p>
<h2 id="p-4">Quamina facts</h2>
<ol>
<li>
<p>About 18K lines of code (excluding generated code), 12K of which are unit tests. The RE feature makes the tests run
slower, which is annoying.</p>
</li>
<li>
<p>Adding Quamina to your app will bulk your executable size up by about 100K, largely due
to Unicode tables.</p>
</li>
<li>
<p>There are a few shreds of AI-assisted code, none of much importance.</p>
</li>
<li>
<p>A Quamina instance can match incoming data records on my 2023 M2 Mac at millions per
second without much dependence on how many patterns are being matched at once. This assumes
not too many horrible regular expressions. That’s per-thread of course, and Quamina does
multithreading nicely.</p>
</li>
</ol>
<h2 id="p-1">Next?</h2>
<p>
The
<a href="https://github.com/timbray/quamina/issues">open issues</a>
are modest in number but
some of them will be hard.
</p>
<p>
I think I’m going to ignore that list for a while (PRs welcome, of course) and work on
optimization. The introduction
of epsilon transitions was required for regular expressions, but they really bog the matching
process down. At Quamina’s core is the
<a href="/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata">finite-automaton merge</a>
logic,
which contains fairly elegant code but generally throws up its hands when confronted with
epsilons and does the simplest thing that could possibly work. Sometimes at an annoyingly slow pace.
</p>
<p>
Having said that, to optimize you need a good benchmark that pressures the
software-under-test.
Which is tricky, because Quamina is so fast that it’s hard to
to feed it enough data to stress it without the feed-the-data code dominating
the runtime and memory use. If anybody has a bright idea for how to pull together a good
benchmark I’d love to hear it. I’m looking at
<a href="https://go.dev/blog/testing-b-loop">b.Loop()</a>
in Go 1.24, any reason not to go there?
</p>
<h2 id="p-3">Book?</h2>
<p>It occurs to me that as I’ve wrestled with the hard parts of Quamina, I’ve done the obvious
thing and trawled the Web for narratives and advice. And, more or less, been disappointed. Yes,
there are many lectures and blogs and so on about this or that aspect of finite automata, but
they tend to be mathemagical and theoretical and say little about how, practically speaking,
you’d write code to do what they’re talking about.</p>
<p>
The Quamina-diary
<span class="o">ongoing</span>
posts now contain several tens of thousands
of words. Also I’ve previously written
<a href="/ongoing/When/200x/2006/04/18/XML-Grammar">quite a bit</a>
about Lark, the world’s
first XML parser, which I wrote and was automaton-based. So I think there’s a case for a slim
volume entitled something like
<cite>Finite-state Automata in the Code Trenches</cite>
. It’d be
a big money-maker, I betcha. I mean, when Apple TV brings it to the screen.
</p>
<h2 id="p-2">Why?</h2>
<p>
Let’s be honest. While
<a href="https://github.com/timbray/quamina">the repo</a>
has quite a few stars, I truly have no idea who’s
using Quamina in production. So I can’t honestly claim that this work is making the
world better along any measurable dimension.
</p>
<p>I don’t much care because I just can’t help it. I love executable abstractions for their own sake.</p>
</div>
</content>
</entry>
<entry>
<title>Losing 1½ Million Lines of Go</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/01/14/Unicode-Properties"/>
<link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2026/01/14/Unicode-Properties#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/01/14/Unicode-Properties</id>
<published>2026-01-14T12:00:00-08:00</published>
<updated>2026-01-14T15:52:47-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Confession: My title is clickbait-y, this is really about building on the Unicode Character Database to support character-property regexp features in <a href="https://github.com/timbray/quamina">Quamina</a>. Just halfway there, I’d already got to 775K lines of generated code so I abandoned that particular approach. Thus, this is about (among other things) <em>avoiding</em> those 1½M lines. And really only of interest to people whose pedantry includes some combination of Unicode, Go programming, and automaton wrangling. Oh, and GenAI, which (*gasp*) I think I should maybe have used</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
Confession: My title is clickbait-y, this is really about building on the Unicode Character Database to support
character-property regexp features in
<a href="https://github.com/timbray/quamina">Quamina</a>
.
Just halfway there, I’d already got to 775K lines of generated code so I abandoned that particular approach. Thus, this
is about (among other things)
<em>avoiding</em>
those 1½M lines. And really only of interest to people whose
pedantry includes some combination of Unicode, Go programming, and automaton wrangling. Oh, and GenAI, which (*gasp*) I
think I should maybe have used.
</p>
<h2 id="p-1">Character property matching</h2>
<p>
I’m talking about regexp incantations like
<code>[\p{L}\p{Zs}\p{Nd}]</code>
, which matches anything that Unicode classifies
as a letter, a space, or a decimal number. (Of course, in Quamina “
<code>\</code>
” is “
<code>~</code>
”
<a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#p-7">for excellent reasons</a>
, so that reads
<code>[~p{L}~p{Zs}~p{Nd}]</code>
.)
</p>
<p>
(I’m writing about this now because I just launched
<a href="https://github.com/timbray/quamina/pull/465">a PR</a>
to enable this feature. Just one more to go before I can
release a new version of Quamina with full regexp support, yay.)
</p>
<h2 id="p-3">Finding the properties</h2>
<p>
To build an automaton that matches something like that, you have to find out what the character properties are.
This information comes from the
<a href="https://www.unicode.org/ucd/">Unicode Character Database</a>
, helpfully provided online by the Unicode consortium.
Of course, most programming languages have libraries that will help you out, and
<a href="https://pkg.go.dev/unicode#pkg-variables">that includes Go</a>
, but I didn’t use it.
</p>
<p>
Unfortunately, Go’s library doesn’t get updated every time Unicode does. As of now, January 2026,
it’s still stuck at Unicode 15.0.0, which
<a href="https://www.unicode.org/history/publicationdates.html">dates to September 2023</a>
; the latest version is 17.0.0, last
September. Which means there are plenty of Unicode characters Go doesn’t know about, and I didn’t want Quamina to settle
for that.
</p>
<p>
So, I fetched and parsed the famous master file from
<a href="https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt">www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt</a>
.
Not exactly rocket science, it’s a flat file with
<code>;</code>
-delimited fields, of which I only cared about the first
and third. There are some funky bits, such as the pair of nonstandard lines indicating that the Han characters occur
between U+4E00 and U+9FFF inclusive; but still not really taxing.
</p>
<p>
The output is, for each Unicode category, and also for each category’s complement (
<code>~P{L}</code>
matches everything
that’s
<em>not</em>
a letter; note the capital
<code>P</code>
), a list of pairs of code points, each pair indicating a subset
of the code space where that category applies. For example, here’s the first line of character pairs with category
<code>C</code>
.
</p>
<pre>
<code> {0x0020, 0x007e}, {0x00a0, 0x00ac}, {0x00ae, 0x0377},</code>
</pre>
<p>How many pairs of characters, you might wonder? There are 37 categories
and it’s all over the place but adds up to a lot. The top three categories
are L with 1,945 pairs, Ll at 664, and M at 563. At the other end are Zl and Zp, both with just 1.
The total number of pairs is 14,811, and the generated Go code is a mere 5,122 lines.</p>
<h2 id="p-5">Character-property automata</h2>
<p>
Turning these creations into finite automata was straightforward: I already had the code to handle regexps like
<code>[a-zA-Z0-9]</code>
, logically speaking the same problem. But, um, it wasn’t fast. My favorite unit test, an exercise in
<a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1">sample-driven development</a>
with 992 regexps,
suddenly started taking multiple seconds, and my whole unit-test suite expanded from around ten seconds to over twelve; since I
tend to run the unit tests every time I take a sip of coffee or scratch my head or whatever, this was painful. And it occurred to
me that it would be painful in practice to people who want for some good reason or another to load up a bunch of
Unicode-property patterns into a Quamina instance.
</p>
<p>So, I said to myself, I’ll just precompute all the automata and serialize them into code. And now we
get to the title of this essay; my data structure is a bit messy and ad-hoc and just for the categories, before I got to the
complement versions, I was generating 775K lines of code.</p>
<p>
Which worked! But, it was 12M in size and while Go’s runtime is fast, there was a painful pause while it absorbed those data
structures on startup. Also, opening the generated file regularly caused my IDE
(
<a href="https://www.jetbrains.com/go/">Goland</a>
) to crash. And I was only halfway there. The whole approach was painful to
work with so I went looking for Plan B.
</p>
<p>The code that generates the automaton from the code point pairs is pretty well the simplest thing that could possibly work
and it was easy to understand but burned memory like crazy. So I worked for a bit on making it faster and
cheaper, but so far have found no low-hanging fruit.</p>
<p>I haven’t given up on that yet. But in the meantime, I remembered
Computer Science’s general solution for all performance problems, by which I mean caching. So now, any Quamina instance will
compute the automaton for a Unicode property the first time it’s used, then remember it. So now Quamina’s speed at adding
Unicode-property regexps to an instance has increased from 135/second to 4,330, a factor of thirty and Good Enough For
Rock-n-Roll.</p>
<p>
It’s worth pointing out that while
<em>building</em>
these automata is a heavyweight process, Quamina can use them to match
input messages at its typical rates, hundreds of thousands to millions per second. Sure, these automata are “wide”, with lots of
branches, but they’re also shallow, since they run on UTF-8 encoded characters whose maximum length is four and average length
is much less. Most times you only have to take one or two of those many branches to match or fail.
</p>
<h2 id="p-2">Should I have used Claude?</h2>
<p>
This particular segment of the Quamina project included some
<em>extremely</em>
routine programming tasks, for example
fetching and parsing
UnicodeData.txt, computing the sets of pairs, generating Go code to serialize the automata, reorganizing source files that had
become bloated and misshapen, and writing unit tests to confirm the results were correct.
</p>
<p>
Based on my own
<a href="/ongoing/When/202x/2025/07/01/First-AI-Code">very limited experience</a>
with GenAI code, and in particular after
reading Marc Brooker’s
<a href="https://brooker.co.za/blog/2025/12/16/natural-language.html">On the success of ‘natural language programming’</a>
and
Salvatore (“antirez”) Sanfilippo’s
<a href="https://antirez.com/news/158">Don't fall into the anti-AI hype</a>
, I guess I’ve joined the camp that thinks
this stuff is going to have a place in most developers’ toolboxes.
</p>
<p>I think Claude could have done all that boring stuff, including acceptable unit tests, way faster than I did.
And furthermore got it right the first time, which I didn’t.</p>
<p>So why didn’t I use Claude? Because I don’t have the tooling set up and I was impatient and didn’t want to invest the time in
getting all that stuff going and improving my prompting skills. Which reminds me of all the times I’ve been trying to evangelize other
developers on a better way to do things and was greeted by something along the lines of “Fine, but I’m too busy right now, I’ll
just going on doing things the way I already know how to.”</p>
<p>
Does this mean I’m joining the “GenAI is the future and our investments will pay off!” mob? Not in the slightest. I still
think it’s overpriced, overhyped, and mostly ill-suited to the business applications that “thought leaders” claim for it.
That word “mostly” excludes the domain of code; as I said
<a href="/ongoing/When/202x/2025/09/26/GenAI-Predictions#p-5">here</a>
, “It’s pretty obvious that LLMs are better at predicting code
sequences than human language.”
</p>
<p>And, as it turns out, the domain of Developer Tools has never been a Big Business by the standards of GenAI’s promoters. Nor
will it ever be; there just aren’t enough of us. Also, I suspect it’ll be reasonably easy in the near future for open-source
models and agents to duplicate the capabilities of Claude and its ilk.</p>
<p>Speaking personally, I can’t wait for the bubble to pop.</p>
<h2 id="p-4">Quamina.next?</h2>
<p>
After I ship the numeric-quantifier feature, e.g.
<code>a{2-5}</code>
, Quamina’s regexp support will be complete and if no
horrid bugs pop up I’ll pretty quickly release Quamina 2.0. Regexps in pattern-matching software are a qualitative difference-maker.
After that I dunno, there are lots more interesting features to add.
</p>
<p>Unfortunately, a couple years into my Quamina work, I got distracted by life and by other projects, and ignored it. One
result is that so did the other people who’d made major contributions and provided PR reviews. I miss them and it’s less fun
now. We’ll see.</p>
</div>
</content>
</entry>
<entry>
<title>Regexp Lessons</title>
<link href="https://www.tbray.org/ongoing/When/202x/2026/01/01/Quamina-2026"/>
<link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2026/01/01/Quamina-2026#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2026/01/01/Quamina-2026</id>
<published>2026-01-01T12:00:00-08:00</published>
<updated>2026-01-06T10:19:29-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">I’m just landing a <a href="https://github.com/timbray/quamina/pull/461">chonky PR</a> in <a href="https://github.com/timbray/quamina">Quamina</a> whose effect is to enable the <code>+</code> and <code>*</code> regexp features. As in my <a href="/ongoing/When/202x/2025/07/21/Automaton-merge-war">last chapter</a>, this is a disorderly war story not an essay, and probably not of general interest. But as I said then, the people who care about coercing finite automata into doing useful things at scale are My People (there are <em>dozens</em> of us)</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
I’m just landing a
<a href="https://github.com/timbray/quamina/pull/461">chonky PR</a>
in
<a href="https://github.com/timbray/quamina">Quamina</a>
whose effect is to enable the
<code>+</code>
and
<code>*</code>
regexp
features. As in my
<a href="/ongoing/When/202x/2025/07/21/Automaton-merge-war">last chapter</a>
, this is a disorderly war story not an essay, and
probably not of general interest. But
as I said then, the people who care about coercing finite automata into doing useful things at scale are My People (there are
<em>dozens</em>
of us).
</p>
<h2 id="p-5">2014-2026</h2>
<p>
As I write this, I’m sitting in the same couch in my Mom’s living room in Saskatchewan where, on my first Christmas after
joining AWS, I got the first-ever iteration of this software to work. That embryo’s mature form is available to the world as
<a href="https://github.com/aws/event-ruler">aws/event-ruler</a>
. (Thanks, AWS!) Quamina is its direct descendent, which means
this story is entering its twelfth year.
</p>
<p>Mom is now 95 and good company despite her failing memory. I’ve also arrived at a qualitatively later stage of life than in
2014, but would like to report back from this poorly-lit and often painful landscape: Executable abstractions are still fun,
even when you’re old.</p>
<p>Anyhow, the reason I’m writing all this stuff isn’t to expound on the nature of finite automata or regular expressions, it’s
to pass on lessons from implementing them.</p>
<h2 id="p-8">Lesson: Seek out samples</h2>
<p>
In a previous episode I used the phrase
<a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1">Sample-driven development</a>
to describe my luck in
digging up 992 regexp test cases, which reduced task task from intimidating to approachable.
I’ve never previously had the luxury of wading into a big software task armed with loads of test cases written by other
people, and I can’t recommend it enough. Obviously you’re not always going to dig this sort of stuff up, but give it a sincere
effort.
</p>
<h2 id="p-9">Lesson: Break up deliverables</h2>
<p>I decomposed regular expressions into ten unique features, created an enumerated type to identify them, and implemented them
by ones and twos.
Several of the feature releases used
techniques that turned out to be inefficient or just wrong when it came to subsequent features. But they worked,
they were useful, and my errors nearly all taught me useful lessons.</p>
<p>Having said that, here’s some cool output that combines this lesson and the one above, from the unit test that runs
those test cases. Each case has a regexp then one
or more samples each of strings that should and shouldn’t match. I instrumented the test to report the usage of regexp features
in the match and non-match cases.</p>
<pre>Feature match test counts:
32 '*' zero-or-more matcher
27 () parenthetized group
48 []-enclosed character-class matcher
7 '.' single-character matcher
29 |-separated logical alternatives
16 '?' optional matcher
29 '+' one-or-more matcher
Feature non-match test counts:
45 '+' one-or-more matcher
24 '*' zero-or-more matcher
31 () parenthetized group
49 []-enclosed character-class matcher
6 '.' single-character matcher
32 |-separated logical alternatives
21 '?' optional matcher</pre>
<p>Of course, since most of the tests combine multiple features, the numbers for all the features
get bigger each time I implement a new one. Very confidence-building.</p>
<h2 id="p-2">Lesson: Thompson’s construction</h2>
<p>
This is the classic nineteen-sixties regular-expression implementation by Ken Thompson, described in Wikipedia
<a href="https://en.wikipedia.org/wiki/Thompson%27s_construction">here</a>
and (for me at least) more usefully, in a
storytelling style by Russ Cox,
<a href="https://swtch.com/%7Ersc/regexp/regexp1.html">here</a>
.
</p>
<p>On several occasions I rushed ahead and implemented a feature without checking those sources, because how hard could it be?
In nearly every case, I had problems with that first cut and then after I went and consulted the oracle, I could see where I’d
gone wrong and how to fix it.</p>
<p>So big thanks, Ken and Russ.</p>
<h2 id="p-3">Lesson: List crushing</h2>
<p>
In some particularly nasty regular expressions that
combine
<code>[]</code>
and
<code>?</code>
and
<code>+</code>
and
<code>*</code>
, you can
get multiple states connected in complicated ways with epsilon links.
</p>
<p>
In Thompson’s Construction, traversing an NFA transitions not just from one state to another but from a current set of states
to a next set, repeat until you match or fail. You also compute epsilon closures as you go along; I’m skipping over details
here. The problem was that traversing these pathologically complex regexps with a sufficiently long string was leading to an
exponential explosion in the current-states and next-states sizes
<span class="dashes"> —</span>
not a figure of speech, I mean
<code>O(2<sup>N</sup>)</code>
. And despite the usage of the word “set” above, these weren’t, they contained endless
duplicates.
</p>
<p>
The
<em>best</em>
solution would be to study the traversal algorithm and improve it so it didn’t emit fountains of dupes. That
would be hard. The next-best would to turn these things into actual de-duped sets, but that would require a hash table right in
the middle of the traversal hot spot, and be expensive.
</p>
<p>So what I did was to detect whenever the next-steps list got to be longer than N, sorted it, and crushed out all the dupes.
As I write, N is now 500 based on running benchmarks and finding a value that makes number go down.</p>
<p>
The reason this is good engineering is that the condition where you have to crush the list almost never happens, so in the
vast majority of cases the the only cost is an
<code>if len(nextSteps)>N</code>
comparison. Some may find this approach
impure, and they have a point. I would at some point like to go back and find a better upstream approach. But for now it’s still
really fast in practice, so I sleep soundly.
</p>
<h2 id="p-4">Lesson: Hell’s benchmark</h2>
<p>
I’ve
<a href="/ongoing/When/202x/2025/07/21/Automaton-merge-war#p-1">written before</a>
about my struggles with the benchmark where I
merge 12,959 wildcard patterns together. Back before I was doing epsilon processing correctly, I had a kludgey implementation
that could match patterns in the merged FA at typical Quamina speeds, hundreds of thousands per second. With correct epsilon
general-purpose epsilon handling, I have so far not been smart enough to find a way to preserve that performance. With the full
13K patterns, Quamina matches at less than 2K/second, and with a mere thousand, at 16K/second. I spent literally days
trying to get better results, but decided that it was more valuable to Quamina to handle a large subset of regular expressions
correctly than to run idiotically large merges at full speed.
</p>
<p>I’m pretty sure that given enough time and consideration, I’ll be able to make it better. Or maybe someone else who’s smarter
than me can manage it.</p>
<h2 id="p-11">Question: What next?</h2>
<p>The still-unimplemented regexp features are:</p>
<pre>{lo,hi} : occurrence-count matcher
~p{} : Unicode property matcher
~P{} : Unicode property-complement matcher
[^] : complementary character-class matcher</pre>
<p>
Now I’m wondering what to do next.
<code>[^]</code>
is pretty easy I think and is useful, also I get to invert a
state-transition table. The
<code>{lo,hi}</code>
idiom shouldn’t be hard but I’ve been using regexps for longer than most of you have been alive and have
never felt the need for it, thus I don’t feel much urgency. The Unicode properties I think have a good fun factor just because
processing the Unicode character database tables is cool. And, I’ve used them.
</p>
<p>
<i>[Update: the <code>[^]</code> thing took a grand total of a couple of hours to build and test. Hmm, what next?]</i>
</p>
<h2 id="p-10">Lesson: Coding while aging</h2>
<p>I tell people I keep working on code for the sake of preserving my mental fitness. But mostly I do it for fun. Same for
writing about it. So, thanks for reading.</p>
</div>
</content>
</entry>
<entry>
<title>Humanist Plumbing</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/12/18/Humanist-Plumbing"/>
<link rel="replies" thr:count="5" type="application/xhtml+xml" href="/ongoing/When/202x/2025/12/18/Humanist-Plumbing#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/12/18/Humanist-Plumbing</id>
<published>2025-12-18T12:00:00-08:00</published>
<updated>2025-12-20T10:40:20-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Business"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Business"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">What happened was, a faucet started dripping. And then I managed to route around the malignant machineries of late-stage capitalism. These days, that’s almost always a story worth telling</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>What happened was, a faucet started dripping. And then I managed to route around the malignant machineries of late-stage
capitalism. These days, that’s almost always a story worth telling.</p>
<p>
Normally, faced with a drip,
we’d pull out the old cartridge, take it to the hardware store, and buy another to swap in.
But the fixture in our
<a href="/ongoing/When/202x/2025/02/28/Moved">recently-acquired</a>
place was kind of exotic and abstract and neither of us
could figure it out. We were gloomy because we’ve had terrible luck over the years with the local plumbing storefronts.
So…
</p>
<h2 id="p-1">The neighbors</h2>
<p>Our neighborhood has an online chat; both sides of the streets in a square around a single city block. This is our first
experience with such a thing. I gather that these don’t always work out well, but this one has been mostly pretty great.</p>
<p>So at 9AM I posted “Hey folks, looking for a plumber recommendation” and by ten there were three.</p>
<p>
<i>[Late-stage capital: “You’re supposed to ask the AI in your browser. It’ll
provide a handy link to a vendor based on geography and reviews but mostly advertising spend.
Why would you want to talk to other people?”]</i>
</p>
<h2 id="p-2">Thomas</h2>
<p>I picked a neighbor’s suggestion, first name
Thomas, and called the number. “Thomas here” on the second ring. I explained and he said “What’s the brand name? If
it’s one of those Chinese no-names I probably have to replace the whole thing.” I said “No idea, but I’ll take a picture and send it to
you.”</p>
<p>
Turns out the brand was
<a href="https://riobel.design/en/">Riobel</a>
, never heard of them. I texted Thomas a picture and he got right back to me: “That’s
high-end, it’s got a lifetime warranty. I’ll come by a little after 5 and take it out. Their dealer is in PoCo (an outer suburb)
and I live out there, so I can swap it.”
</p>
<p>
<i>[Late-stage capital: “You’re supposed to engage with the chatbot on the site we sent you to, which will integrate with your
calendar and arrange for a diagnostic visit a week from Wednesday. You could call them but you’d be in voice-menu hell and
eventually end up at the same chatbot.”]</i>
</p>
<p>When Thomas showed up, with a sidekick, he was affable and obviously competent.
Within five minutes I was glad I’d called for help; that faucet’s construction was highly non-obvious. Thomas knew what he was
doing and it still took him the best part of a half-hour to get it all disassembled and the cartridge extracted.</p>
<h2 id="p-6">Nothing’s perfect</h2>
<p>The next morning, a text from Thomas: “Bad news. That part is back-ordered till May at Riobel’s dealer. We can maybe get it
online but you’d have to pay.” He attached a screenie of a Web search for the part number; there were several online
vendors.</p>
<p>It’s irritating that the “lifetime warranty” doesn’t seem to be helping me, but to be fair, the part was initially installed
in 2011.</p>
<p><i>[Late-stage capital: “Lifetime warranty? Huh? Oh, of course you mean our VIP-class
subscription offering, that’s monthly with a
discount for annual up-front payment.”</i> (And the part would still be back-ordered.)]</p>
<h2 id="p-3">Kolani</h2>
<p>
High-end plumbing parts are expensive. But one of Thomas’ recommendations,
<a href="https://kolani.ca">Kolani Kitchen and bath</a>
, was asking less.
</p>
<p>They had a phone number on their
Web site so I called it and the voice menu only had three options: Location, opening hours, and Operator.
The operator was an intelligent human and picked up right away.
“Hi, I’m looking at ordering a cartridge and wanted to see if you had it in stock.” “Gimme the part number?” I
did and she went away for a couple of minutes and came back “Yeah, it’s in stock.” So I ordered it and I have a tracking
number.</p>
<p>
<i>[Late-stage capital: “There aren’t supposed to be independent dealers; the manufacturer has taken PE money and eliminated
the middlemen to better capture all the value-add.
Or maybe there’ll be a wholesaler, but just one, because another PE rolled up all the distributors to maximize pricing power.
Either way, you won’t be able to get a human on the line.”]</i>
</p>
<h2 id="p-7">Payment</h2>
<p>Next morning, I got an email that my order had been canceled. So I called that intelligent operator and she said “I was going
to email you. Our system won’t take payment if the billing and delivery addresses are different. Sorry. If you’re in a hurry you
could do an e-transfer?” (In Canada, all the banks are in a payments federation that makes this dead easy.) So I
did and the part has shipped.</p>
<p>
<i>[Late-stage capital: “What? If you’d used our Integrated online payment offering, it would all just work. What if it
doesn’t, you ask? Yeah, sucks to be you in that situation, of course there’d be nobody you could talk to about that.”]</i>
</p>
<p>Thomas came by again to put the old cartridge back in for now and said “This thing, don’t worry about a drip, it’s not fast
and it probably won’t get worse. Text me when the new part gets in.”</p>
<h2 id="p-5">Late-stage capitalism</h2>
<p>It won’t be missed when it’s gone.</p>
</div>
</content>
</entry>
<entry>
<title>After the Bubble</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble"/>
<link rel="replies" thr:count="7" type="application/xhtml+xml" href="/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble</id>
<published>2025-12-07T12:00:00-08:00</published>
<updated>2025-12-09T15:29:05-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">The GenAI bubble is going to pop. Everyone knows that. To me, the urgent and interesting questions are how widespread the damage will be and what the hangover will feel like. On that basis, I was going to post a link on Mastodon to Paul Krugman’s <a href="https://paulkrugman.substack.com/p/talking-with-paul-kedrosky">Talking With Paul Kedrosky</a>. It’s great, but while I was reading it I thought “This is going to be Greek to people who haven’t been watching the bubble details.” So consider this a preface to the Krugman-Kedrosky piece. If you already know about the GPU-fragility and SPV-voodoo issues, just skip this and go read that</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
The GenAI bubble is going to pop. Everyone knows that. To me, the urgent and interesting questions are how widespread the
damage will be and what the hangover will feel like.
On that basis, I was going to post a link on Mastodon to Paul Krugman’s
<a href="https://paulkrugman.substack.com/p/talking-with-paul-kedrosky">Talking With Paul Kedrosky</a>
. It’s great, but while I
was reading it I thought “This is going to be Greek to people who haven’t been watching the bubble details.”
So consider this a
preface to the Krugman-Kedrosky piece. If you already know about the GPU-fragility and SPV-voodoo issues, just skip this and go
read that.
</p>
<h2 id="p-2">Depreciation</h2>
<p>When companies buy expensive stuff, for accounting purposes they pretend they haven’t spent the money; instead they
“depreciate” it over a few years. That is to say, if you spent a million bucks on a piece of gear and decided to depreciate it
over four years, your annual financials would show four annual charges of $250K.
Management gets to pick your depreciation period, which provides a major opening
for creative accounting when the boss wants to make things look better or worse than they are.</p>
<p>Even when you’re perfectly honest it can be hard to choose a fair figure. I can remember one of the big
cloud vendors announcing they were going to change their fleet depreciation from three to four years and that having an impact on
their share price.</p>
<p>Depreciation is orderly whether or not it matches reality: anyone who runs a data center can tell you about racks with 20
systems in them that have been running fine since 2012. Still, orderly is good.</p>
<p>
In the world of LLMs, depreciation is different. When you’re doing huge model-building tasks, you’re running
those expensive GPUs flat out and red hot for days on end. Apparently they don’t like that, and flame out way more often than
conventional computer equipment. Nobody who is doing this is willing to come clean with hard numbers but there are data points, for
example from
<a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/faulty-nvidia-h100-gpus-and-hbm3-memory-caused-half-of-the-failures-during-llama-3-training-one-failure-every-three-hours-for-metas-16384-gpu-training-cluster">Meta</a>
and (very unofficially)
<a href="https://www.tomshardware.com/pc-components/gpus/datacenter-gpu-service-life-can-be-surprisingly-short-only-one-to-three-years-is-expected-according-to-unnamed-google-architect">Google</a>
.
</p>
<p>So GPUs are apparently fragile. And they are expensive to run because they require huge
amounts of electricity. More, in fact, than we currently have, which is why electrical bills are spiking here and there around
the world.</p>
<p>
Why does this matter? Because when the 19th-century railway bubble burst, we were left with railways. When the
early-electrification bubble burst, we were left with the grid. And when the
<a href="https://en.wikipedia.org/wiki/Dot-com_bubble">dot-com bubble</a>
burst, we were left with a lot of valuable
infrastructure whose cost was sunk, in particular dark fibre. The AI bubble? Not so much; What with GPU burnout and power charges,
the infrastructure is going to be expensive to keep running, not something that new classes of application can pick up and use on
the cheap.
</p>
<p>Which suggests that the post-bubble hangover will have few bright spots.</p>
<h2 id="p-1">SPVs</h2>
<p>This is a set of purely financial issues but I think they’re at the center of the story.</p>
<p>It’s like this. The Big-Tech giants are insanely profitable but they don’t have enough money lying around to build the
hundreds of billions of dollars worth of data centers the AI prophets say we’re going to need. Which shouldn’t be a problem;
investors would line up to lend them as much as they want, because they’re pretty sure
they’re going to get it back, plus interest.</p>
<p>But apparently they don’t want to borrow the money and have the debts on their balance sheet. So they’re
setting up “Special Purpose Vehicles”, synthetic companies that are going to build and own the data centers; the Big Techs
promise to pay to use them, whether or not genAI pans out and whether or not the data centers become operational. Somehow,
this doesn’t count as “debt”.</p>
<p>
The financial voodoo runs deep here. I recommend Matt Levine’s
<a href="https://newsletterhunt.com/emails/205961">Coffee pod financing</a>
and the
<cite>Financial Times’</cite>
<a href="https://www.ft.com/content/d0344253-b0a2-4c6d-8b97-520243678afd">A closer look at the record-smashing ‘Hyperion’
corporate bond sale</a>
. Levine’s explanation has less jargon and is hilarious; the
<cite>FT</cite>
is more technical but still likely to provoke horrified eye-rolls.
</p>
<p>If you think there’s a distinct odor of 2008 around all this, you’d be right.</p>
<p>If the genAI fanpholks are right, all the debt-only-don’t-call-it-that will be covered by profits and everyone can sleep
sound. Only it won’t. Thus, either the debts will apply a meat-axe to Big Tech profits, or (like 2008) somehow they won’t be
paid back. If whoever’s going to bite the dust is “too big to fail”,
the money has to come from… somewhere? Taxpayers? Pension funds? Insurance companies?</p>
<h2 id="p-3">Paul K and Paul K</h2>
<p>
I think I’ve set
<a href="https://paulkrugman.substack.com/p/talking-with-paul-kedrosky">that piece</a>
up enough now. It points out a few other
issues that I think people should care about. I have one criticism: They argue that genAI won’t produce sufficient revenue from
consumers to pay back the current investment frenzy. I mean, they’re right, it won’t, but that’s not what the investors are
buying. They’re buying the promise, not of
<em>more revenue</em>
, but of
<em>higher profits</em>
that happen when tens of
millions of knowledge workers are replaced by (presumably-cheaper) genAI.
</p>
<p>I wonder who, after the loss of those tens of millions of high-paid jobs, are going to be the
consumers who’ll buy the goods that’ll drive the profits that’ll pay back the investors. But that problem is kind of
intrinsic to Late-stage Capitalism.</p>
<p>Anyhow, there will be a crash and a hangover. I think the people telling us that genAI is the future and we
must pay it fealty richly deserve their impending financial wipe-out.
But still, I hope the hangover is less terrible than I think it will be.</p>
</div>
</content>
</entry>
<entry>
<title>Tracy Numbers</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics"/>
<link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2025/12/02/Bell-Combinatorics#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics</id>
<published>2025-12-02T12:00:00-08:00</published>
<updated>2025-12-02T12:00:00-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Music"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Music"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking a class in Afro-Cuban rhythms from <a href="https://drumming.ca">Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the basics of Afro-Cuban are the <a href="https://en.wikipedia.org/wiki/Bell_pattern">Bell Patterns</a>, which come straight out of Africa. The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It feels like it’s in four, particularly when played fast</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking
a class in Afro-Cuban rhythms from
<a href="https://drumming.ca">Russell Shumsky</a>
, with whom I’ve studied West-African drumming for many years. Among the
basics of Afro-Cuban are the
<a href="https://en.wikipedia.org/wiki/Bell_pattern">Bell Patterns</a>
, which come straight out of Africa.
The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of
three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It
feels like it’s in four, particularly when played fast.
</p>
<p>Here’s the standard bell pattern in music notation. Instead of one 12/8 bar, I’ve broken it into four 3/8 chunks. Let’s call
those “mini-measures”; I’ll use that or just “minis” in the rest of this piece.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern"/>
<div class="caption">
<p>
<audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.m4a"></audio>
</p>
</div>
<p>Bell patterns are never played in isolation, but circularly on fast repeat, so the first note immediately follows
the last.</p>
<p>
In the sound sample, I’m playing a background beat on a conga, emphasizing the beginning of the 12/8 measures.
The actual bell pattern is on the high “child” bell of a
<a href="https://en.wikipedia.org/wiki/Ewe_drumming#Gankogui">Gankoqui</a>
, an African dual-cowbell set.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/PXL_20251201_192632520.png" alt="Black cat considers a Gankoqui"/>
<div class="caption">
<p>
<a href="/ongoing/When/202x/2021/02/22/Meet-Thorn">“þ” the cat</a>
was trying bell patterns but
unfortunately
<br/>
cats can’t count as high as 12. Collar by
<a href="https://www.birdsbesafe.com">BirdsBeSafe.com</a>
.
</p>
</div>
<p>That’s my Gankoqui.
I bought it off someone on Etsy who imports them from Ghana.
It came with that little thin stick that sounds nice, but sometimes I use a regular drumstick when things get loud.</p>
<h2 id="p-1">The problem</h2>
<p>Russell’s a good teacher and the standard pattern isn’t that tricky, but I just couldn’t get a grip on it.
It’s a little harder than it looks what with cycling it really fast, and then
you’re playing it against complicated music with other instrumental voices.
I probably would have got there, but the lessons ran out of gas in the depths of Covid.</p>
<h2 id="p-2">Introducing Tracy</h2>
<p>
She was Russell’s long-time partner, a good person and good drummer too. When you were struggling
with a complex rhythm it was helpful to watch Tracy’s hands, because she was
<em>always</em>
on the beat.
</p>
<p>Tracy lived with stage four metastatic cancer for many years and braved endless awful rounds of therapy while remaining generally
cheerful. She could be morbidly funny; I bought her congas (you can hear one behind the beat in the samples) when she had a
storage-space problem. She told me she was carefully planning her finances so she’d run out of money just before the cancer got
her.</p>
<p>I always enjoyed any time I spent with her. Then, a dozen years into her cancer
journey, this last summer it got into her brain and it was pretty clear her end times were upon her.</p>
<h2 id="p-3">The hospice</h2>
<p>
Tracy’s last months were spent at
<a href="https://stjohnhospice.ca">St. John Hospice</a>
in Vancouver’s far west. I can’t say enough
good things about it. If you’re near Vancouver and your death becomes imminent, try to be there if you can’t be at home.
It’s comfortable and the staff are expert and infinitely kind. The rules that apply at hospices
are different from those at hospitals; for example, Tracy’s cat joined her in residency and had the run of the place.
</p>
<p>I (and other fans of Russell and Tracy) visited the hospice a few times. My last visit was just days before her death
and, while she was fatigued and spaced-out, it was still Tracy.
I wasn’t close enough to call her a friend, but I miss her.</p>
<p>
We got to talking about Afro-Cuban music and I laughed at myself, saying how I never could get that damn bell pattern
down. Said Russell: “Oh, you mean the standard 12/8 pattern? Tracy, let’s show him” and on the second try, they were doing it
together, just voices,
<i>ta ta ta-ta, ta ta ta</i>
.
</p>
<p>Driving home from the hospice, I told myself that if Tracy could manage the bell pattern in her condition, I could bloody
well learn it. So I studied the details and used a metronome app and after a while
I thought I had it down pretty well.</p>
<h2 id="p-4">Sounds cool</h2>
<p>I go to a weekly by-invitation African drum jam where I’m on the weaker end of the skill
spectrum. The first time a 12/8 came along after I thought I’d learned the pattern, I had to summon up courage
and then I fluffed the first few bars. But after a while I
was grooving along and smiling and thinking the bell sounded pretty cool against the thunder of all the djembés and dununs.</p>
<p>And, even played amateurishly, it does sound cool. Let’s have another look at the music.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern"/>
<div class="caption">
<p>
<audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.m4a"></audio>
</p>
</div>
<p>West-African drumming often tries to achieve rhythmic tension, where a given note could fit in multiple ways and your
ear is not 100% sure what’s going on. The standard pattern does this, twice.</p>
<p>Remember, I said that 12/8 sounds like it’s
“in four”, especially if you hit the first beat of each of the four mini-measures. But two of
the four minis here go around the first note, weakening the 4/4 feel.
Especially on that third mini; you can feel the beat slide by the missing “one”.</p>
<p>Also, the last three notes are evenly spaced two beats
apart, so six of them would fill the 12-beat pattern, suggesting that this might be in triple time, not 12/8.</p>
<p>The effect, to my ears, is of the bell, higher-pitched than the drums, shifting against the rhythm, or even dancing
across it. At the drum jam, at almost any given moment it won’t be just drums, one or more people will have
clave sticks or rattles or tambourines or cowbells weaving through the beat.</p>
<h2 id="p-5">Mixing it up</h2>
<p>After I felt confident playing the standard pattern, it still sounded cool, but I wanted to branch out, not just
go around and around the same seven notes. So the first thing I did was start mixing in a few of these.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-1.png" alt="bell pattern variation"/>
<div class="caption">
<p>
<audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/5333.m4a"></audio>
</p>
</div>
<p>This repeats the second bar through the end of the phrase. In the sound sample I mix it up with the standard pattern.
It’s got less rhythmic tension but on the other hand
flows along smoothly with the drum thunder. Also you don’t have to think at all, so you can enjoy listening to what the other
people are playing.</p>
<p>Then I got a little more ambitious and reshuffled:</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-2.png" alt="bell pattern variation"/>
<div class="caption">
<p>
<audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/5253.m4a"></audio>
</p>
</div>
<p>The mini-measures are the same as in the standard pattern, just in a different order. Anyhow, this kind of thing is fun.</p>
<h2 id="p-6">Combinatorics</h2>
<p>Then one evening I was lying in bed, thoughts wandering, and wondered “How many bell patterns are there?”
A little mental math showed that of course there are eight possible arrangements of tones
in a 3-note mini-measure. Here they are:</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/8-measures.png" alt="Possible arrangements of notes in 3/8 time"/>
<div class="caption">
<p>I’ll use the boxed numbers to identify the minis.</p>
</div>
<p>Why are the minis numbered in that order? Every computer programmer looking at this already knows, but for the rest of you: If the
notes are ones and the rests are zeroes, they are the eight binary numbers between zero and seven inclusive.
So each number’s binary bits show where the drumstrokes are.
By the way, numbers four through
seven have a note on the one beat, zero through three don’t.</p>
<p>Is it weird to have a zero i.e. silent mini? I don’t think so, sometimes spaces between the notes really matter.</p>
<h2 id="p-7">Patterns</h2>
<p>Anyhow, the original question was about the number of different bell patterns. Each has four
mini-measures with 8 possible values. So the answer is 8 ⨉ 8 ⨉ 8 ⨉ 8, which is 4,096.</p>
<p>And each of them can be identified by four little numbers, ranging from T0000 (I can hear the bandleader yelling “gimme zeroes
for the sax break”) to T7777, a flurry of eighth notes that you might use in the big encore-number finish designed to leave the
audience yelling as you walk off stage. The standard bell pattern is T5325; in binary “101 011 010 101” and the 1’s are drumstrokes.
The first variation above is T5333 and the second is T5253.</p>
<p>The “T” in front of each bell pattern number is for Tracy.</p>
<p>
If you go look at the
<a href="https://en.wikipedia.org/wiki/Bell_pattern">Wikipedia Bell-pattern article</a>
, they emphasize that there are lots of
different patterns. Now they all have numbers! The article
<a href="https://en.wikipedia.org/wiki/Bell_pattern#128_bell_patterns">makes special mention of</a>
T5124, T5221, and T5244.
</p>
<h2 id="p-8">But why, Tim?!</h2>
<p>I’m a computer programmer with a Math degree, and an amateur musician.
Anyone who thinks that these are disjoint disciplines is wrong.
And, I think the notation is (on a very small scale) kind of pleasing.</p>
<p>But the work has actually helped me.
Now that I’ve considered each mini-measure and its personality. I find all of them sneaking into
my Gankoqui excursions, which have gotten noticeably weirder, for example T5635.
Nobody’s threatened to kick me out of the jam, so far.</p>
<p>Also, this has given me a real appreciation of whoever it was that, probably thousands of years ago and certainly in Africa,
picked the “standard” pattern as, well, standard. Because it’s great.</p>
<h2 id="p-9">What’s missing?</h2>
<p>
You may have noticed that Gankoquis have two bells and I’ve been ignoring that fact. Normally you’d play these patterns
on the smaller “child” bell, but sometimes bringing the big parent bell in for a couple of strokes works
well.
<a href="https://www.youtube.com/watch?v=X2K0i8e6Ftc">Here’s an example</a>
(h/t Russell).
</p>
<p>
Also, this discussion has been limited to 3/8 minis in 12/8 measures. There’s another whole universe of 4/4 rhythms that
also have bell patterns (but everything exists in the shadow of the
<a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave rhythm</a>
).
In that world a pattern has four measures, each of which can have sixteen possible values, so there are 65,536 different ones.
</p>
<p>
And I could repeat the numbers construction above for 4/4. But I’m not going to, because the rewards feel smaller. In my
experience, 4/4 rhythms lope smoothly along and everyone knows where the one is even when there’s no note on it, so there’s less
ambiguity to work with.
Anyhow, any neophyte (like for example me) can play a pretty smooth bell line against 4/4; just start with
<a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave</a>
and add
variations (or don’t) and you’ll be fine.
</p>
<h2 id="p-10">Useful?</h2>
<p>These numbers are just elementary mathemusical fun. If anyone else wanted to use them that’d be a pleasant surprise.
If “anyone else” is you, go ahead, but they have a name and you have to use it. These are called Tracy Numbers.</p>
<h2 id="p-11">Colophon</h2>
<p>
Music fragments by
<a href="https://www.mu.se/musescore-studio">MuseScore Studio</a>
. Sound samples facilitated by GarageBand, a Shure MV51, and PSB
Alphas.
</p>
</div>
</content>
</entry>
<entry>
<title>Fútbol Joy</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football"/>
<link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/23/Soccer-vs-Football#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football</id>
<published>2025-11-23T12:00:00-08:00</published>
<updated>2025-11-27T20:38:07-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Sports/Football"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Sports"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Football"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Sports/Soccer"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Soccer"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Last Saturday I had one of my peak 2025 experiences, at the <a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">MLS semifinal</a> between the <a href="https://www.whitecapsfc.com/">Vancouver Whitecaps FC</a> (hereinafter “Caps”) and <a href="https://en.wikipedia.org/wiki/Los_Angeles_FC">Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”. 53,095 other fans were there with my son and I; we came home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other TV sports</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
Last Saturday I had one of my peak 2025 experiences, at the
<a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">MLS semifinal</a>
between the
<a href="https://www.whitecapsfc.com/">Vancouver Whitecaps FC</a>
(hereinafter “Caps”) and
<a href="https://en.wikipedia.org/wiki/Los_Angeles_FC">Los Angeles FC</a>
(“LAFC”). Both those FC’s stand for “Fútbol Club”.
53,095 other fans were there with my son and I; we came
home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other TV sports.
</p>
<p>
Earlier this year
<a href="/ongoing/When/202x/2025/05/04/Southsiders">I wrote about becoming a Caps fan</a>
. Anyone who enjoys this will probably
like that piece too.
</p>
<p>Let’s set the scene with pictures.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_004124670.png" alt="Before the fútbol at the pub"/>
<div class="caption">
<p>Supporters gather pre-game at a nearby Irish-flavored pub.</p>
</div>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_011735082.png" alt="Parading from the pub to the match"/>
<div class="caption">
<p>
Supporters march to the game.
<br/>
When you’re in a frivolous parade, everyone smiles
<br/>
at
you, even the drivers hemmed in by paraders.
</p>
</div>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_024033770.png" alt="Whitecaps tifo banner: fire that burns / blue melts gold"/>
<div class="caption">
<p>
The banner is what’s called a
<a href="https://en.wikipedia.org/wiki/Tifo">tifo</a>
.
<br/>
I have to admit I failed to parse it.
</p>
</div>
<h2 id="p-5">The game</h2>
<p>
It was 120 minutes of ridiculously over-the-top psychodrama. I was exhausted at the end.
If you want a full retrospective, type “whitecaps lafc” into any Web search to get the particulars. Or
<a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">hit
this</a>
. But here’s the short version:
</p>
<ol>
<li>
<p>
The Caps came out sharp and fast and had LAFC pretty well flummoxed through most of the first half, scoring two goals,
<a href="https://www.youtube.com/watch?v=9nEOw8ckWMA">one of which was a jaw-dropper</a>
.
They also managed to contain LAFC’s superstar
<a href="https://en.wikipedia.org/wiki/Son_Heung-min">Son Heung-min</a>
.
</p>
</li>
<li>
<p>
In the second half, the visitors reconfigured and were much better. Son did the superstar thing and scored two goals,
<a href="https://www.youtube.com/watch?v=-L9N8pkrkSM">one another jaw-dropper</a>
, just as the game was ending, to tie things
up.
</p>
</li>
<li>
<p>The Caps lost two players, one for fouls, one to injury, and were down two men through most of overtime. LAFC’s assault
was relentless but the Caps held on, getting more than a little lucky.</p>
</li>
<li>
<p>So it went to a penalty-kick competition. Son, shockingly, missed; he was exhausted and limping. At the end of the
day the Caps scored four out of five to LAFC’s three and got the win.</p>
</li>
</ol>
<p>Suffice it to say that the dramatic peak wasn’t
any of the flashes of brilliance, but rather the errors that happen when people are at the limit of their endurance. Vancouver
made one fewer, that’s all there was to it.</p>
<h2 id="p-3">That sound</h2>
<p>There’s not another like it on this planet. I mean tens of thousands of voices in a big stadium greeting a home goal.
Fútbol specifically because its goals, compared to North American sports where points come in dozens, are
such huge markers. The sound-pressure wavefront, coming from every direction, of all those inarticulate howls of joy,
all in the same tiny fraction of a second, is a whole-body experience.</p>
<h2 id="p-6">The side effect</h2>
<p>I’ve long been a televised-sports fan; the only TV show that isn’t scripted and thus has real drama. But
since getting mixed up in fútbol, I’ve sort of gone off the other sports I used to watch. I had to think a bit to figure
out why.</p>
<p>
It’s the ads. The football, basketball and hockey broadcasts screech to a halt
<a href="https://qz.com/150577/an-average-nfl-game-more-than-100-commercials-and-just-11-minutes-of-play">every ten or fewer
minutes</a>
for a couple of minutes of advertising. Most of the ads are dumb, many are offensive, and the relentless
addiction-promoting gambling pitches are both. On top of which there’s the bone-headed repetition; someone somewhere thinks
I’m gonna lean toward this generic SUV as opposed to that one because of the 138th time they’ve run that commercial where hip young
people with fulfilling lives are going to have sex because of its dashboard geometry and motorized hatchback.
I mean, the other SUVs have that stuff too, but this one’s actors are more convincingly likely to be headed for bed?
</p>
<p>Being in the room with this shit makes me angry even though my mute-button skillz are sharp.
The world being what it is, I really don’t need to be around something that angers me several times per hour.
So, while when young I loved playing both football and basketball, and while the pro games are good entertainment,
my patience seems to be running out.</p>
<p>Fútbol, on the other hand, has two fiftyish-minute chunks of continuous action, so you can sink into the flow of the
game. The contrast, switching back and forth between that and the other North American sports, is stark.</p>
<p>(Except for I’m mostly forgiving baseball because its natural rhythm is full of stops suitable for hot dogs and beer and
admiring cute babies and T-shirts and discussions of etymology and epidemiology. I mean, the ads are still mindless repetitive
shit, we’re just more accustomed to switching attention away when nothing’s happening.)</p>
<p>
And I’m not claiming that fútbol is more virtuous or less dirty than any other sport; after all, its global
organizing body FIFA has repeatedly been exposed as
<a href="https://en.wikipedia.org/wiki/FIFA#Corruption">galactically corrupt</a>
. I’m just saying it offers a better
experience.
</p>
<h2 id="p-9">Soccer?</h2>
<p>That word is an awkward invention by nineteenth-century British toffs based on abbreviating “association”. I accept that on my
continent “football” means gridiron, but people who enjoy “soccer” still say it so in print I offer “fútbol”, which is a
typographically nice little cluster; please humor me.</p>
<p>Anyhow, you might want to check out your local team; in North America, the prices are lower than the other sports, who could
be against cheap happiness with fewer gambling ads?</p>
</div>
</content>
</entry>
<entry>
<title>Long Links</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links"/>
<link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/16/Long-Links#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links</id>
<published>2025-11-16T12:00:00-08:00</published>
<updated>2025-11-19T14:20:55-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the choices will improve your day. This time out it’s almost all politics, but that’s the way the world is. And some of the politics aren’t American!</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the
choices will improve your day. This time out it’s almost all politics, but that’s the way the world is.
And some of the politics aren’t American!</p>
<p>
Some of these are paywalled, sorry.
And the whole thing is kind of long so if you’re in a hurry, you might want to jump to the last section, entitled
<a href="#p-8">Wonderful things</a>
.
</p>
<h2 id="p-7">Social media</h2>
<p>
Here’s a real treat. Perhaps the premiere example of a blog that’s grown happily from a one-man operation to a
successful and sustainable small business would be
<a href="https://talkingpointsmemo.com">Talking Points Memo</a>
. It provides what I think is about the deepest
carefully-reported coverage of the American progressive scene available anywhere. I’ve been a subscriber for years.
</p>
<p>
They’re celebrating their 25th anniversary and, to celebrate, have been working on a history of blogging:
<a href="https://talkingpointsmemo.com/tpm-25">Pivots, Trolls, & Blogrolls</a>
.
Contributors so far: Sarah Jaffe, Matt Pearce, Brian Beutler, Kylie Cheung, Megan Greenwell, David Weigel, Jon Allsop, Adam
Mahoney, Julianne Escobedo Shepherd, Max Rivlin-Nadler, Bhaskar Sunkara, Hamilton Nolan, Ana Marie Cox, Marisa Kabas, Kelly
Weill, Aurin Squire, Marcy Wheeler, Andrew Parsons, Jeet Heer, and Sarah Posner.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/TPM.png" alt="TPM 25th anniversary series"/>
<p>It’s full of razor-sharp insights and nostalgic smiles. I think it’s paywalled? If so, and if you’ve got feels about
the blog form, it’d probably be worth your while to sign up for a month just to read this collection.</p>
<p>
And thanks to Josh Marshall of
<cite>TPM</cite>
for putting it together all these years and especially for this particular
mind candy.
</p>
<h2 id="p-4">Politics (US)</h2>
<p>
The Trump administration is, generally speaking, strange.
For a terrifying trip several standard deviations off the strange end of the strangeness,
there’s
<a href="https://www.newyorker.com/magazine/2025/11/17/laura-loomers-endless-payback">Laura Loomer’s Endless Payback</a>
.
At several points in my traversal of this piece I simply could not believe what I was reading. My guess is that it will
regularly be cited by historians of the 23rd century, to add spice to their narrative.
</p>
<p>Many commentators on the right have been horrified at Zohran Mamdani’s New York victory, seeing him as the white-hot
pointy end of the “woke mind virus”. Well, what could be more woke, I ask, than the Department of Africana Studies at Bowdoin,
a boutique liberal-arts college in Maine?</p>
<p>
Mamdani was a student there, and now the former head of said department offers us
<a href="https://lithub.com/maybe-dont-talk-to-the-new-york-times-about-zohran-mamdani/">Maybe Don’t Talk to the New York
Times About Zohran Mamdani</a>
. Peter Coviello is not a moderate but is a formidable writer: “The storied choice between
socialism and barbarism was made exquisitely clear a good many years ago in the United States, and both major parties chose
barbarism.” Despite that, it’s mostly written with a light touch, often amusing. Read it.
</p>
<h2 id="p-5">Politics (Other)</h2>
<p>
It’s not in the news much, but China is facing colossal economic challenges.
<a href="https://www.nytimes.com/2025/09/23/opinion/china-economy-deflation-neijuan.html">Learn about “meijuan”</a>
(in English,
“involution”) which might well put the nation on the path of deflation. That’s a path that, once an economy is on it, is very
hard to get off; it took Japan decades.
</p>
<p>
While we’re looking at China… there used to be “Kremlinology”, a study of the entirely opaque workings of the top inner
circles of the Soviet regime. In that spirit, here’s some
<a href="https://en.wikipedia.org/wiki/Great_Hall_of_the_People">人民大会堂</a>
-ology:
<a href="https://sinocism.com/p/forever-xi-jinping-perhaps-not">Forever Xi Jinping? Perhaps Not</a>
.
I enjoyed it but have no idea if it’s, you know, correct. Nobody outside that inner circle does.
</p>
<p>
Now let’s jump seven time zones west, to France, where the redoubtable Thomas Piketty offers
<a href="https://thomaspiketty.wordpress.com/2025/11/11/le-pens-rn-has-become-the-party-of-billionaires/">Le Pen’s RN has
become the party of billionaires</a>
. Unlike the Beijing piece, Piketty’s is (as usual for him) supported by concrete data and I tend
to believe it.
</p>
<p>
Last stop: Gaza, waiting to find out if an externally-imposed and leaky ceasefire will hold, and whether there is a path
from where they are to something better. As for “where they are”, here’s
<a href="https://www.nytimes.com/interactive/2025/10/08/opinion/gaza-strip-before-after.html">The Gaza I Knew Is
Gone</a>
by Ghada Abdulfattah. It describes life’s experience for the citizens of Gaza after all these endless
months of brutality.
</p>
<h2 id="p-9">Politics (everywhere)</h2>
<p>
Pope Leo’s
<a href="https://www.vatican.va/content/leo-xiv/en/apost_exhortations/documents/20251004-dilexi-te.html">Apostolic Exhortation
Dilexi Te of the Holy Father Leo XIV To All Christians On Love For The Poor</a>
got a short-lived run in the headlines,
accompanied by “But that’s… socialism!” pearl-clutching from Stage Right. It deserves a read. The first three-quarters or
so are a trip through Church history, starting in Nazareth, aimed at showing that concern for the poor has always been central
to the faith. Which is fine, but eventually the Pope gets concrete about the twenty-first century, and is convincing whether or
not you believe in any gods.
</p>
<p>
The next section is about Tech and while
<a href="https://csrc.nist.gov/csrc/media/Presentations/2023/radical-cs/images-media/sess-1-rogaway-bcm-workshop-2023.pdf">Radical
CS</a>
is a presentation from “The Third NIST Workshop on Block Cipher Modes of Operation” it’s about politics, oh yes it is. We
very much need more of this kind of thing.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/Radical-CS.png" alt="Suggestions for a radical CS"/>
<h2 id="p-6">Tech</h2>
<p>
A
<a href="https://infosec.exchange/@david_chisnall/115270162462304611">post from David Chisnall on Mastodon</a>
contains this
gem: “Machine learning is
<em>amazing</em>
if … the value of a correct answer is much higher than the cost of an incorrect
answer.”
Which is one of those things that’s obviously true as soon as you hear it. The whole piece is good.
</p>
<p>
The churning debate around AI is full of arm-waving and relatively free of objective numerical data. So here’s Ed Zitron’s
<a href="https://www.wheresyoured.at/costs/">This Is How Much Anthropic and Cursor Spend On Amazon Web Services</a>
.
And I ask: How do the people making these investments think they’re going to get their money back?
</p>
<p>
Speaking of things are obviously true:
<a href="https://www.newyorker.com/culture/infinite-scroll/textedit-and-the-relief-of-simple-software">TextEdit and the
Relief of Simple Software</a>
. We could do so much better than we do, and in our hearts we know why we’re not, and it’s about
money and power, not technology.
</p>
<p>
Bluesky has brought its AT Protocol to the IETF; let’s see what happens. Here are
<a href="https://www.ietf.org/archive/id/draft-newbold-at-architecture-00.html">Authenticated Transfer: Architecture
Overview</a>
and
<a href="https://www.ietf.org/archive/id/draft-holmgren-at-repository-00.html">Authenticated Transfer Repository and
Synchronization</a>
. The drafts have
<a href="https://github.com/bluesky-social/ietf-drafts">source-code repos</a>
.
</p>
<p>
Finally, here’s
<a href="https://spinel.coop">Spinel</a>
, which is trying to build a decentralized, transparent,
and somewhat-democratic engineering resource for the Ruby and Rails platforms. This follows on a distinctly-stinky power play where
people with money grabbed the steering wheel. Best of luck to Spinel.
</p>
<h2 id="p-10">Canadian health</h2>
<p>
Canada has “single-payer” public healthcare that comes with your taxes, which in my experience works well, see
<a href="/ongoing/When/200x/2009/08/22/Alison">here</a>
and
<a href="/ongoing/When/202x/2025/07/09/Saskatchewan">here.</a>
</p>
<p>
This costs a lot of money, over $300B/year.
Predictably, there are business types panting with eagerness to get their hands on some of that
money. And they can; a lot of medical practices and clinics and labs are owned by private companies, apparently doing well while
being restricted to billing the government for the standard fees. But what they
<em>really</em>
want is a two-tier system where
they can directly charge rich people more for better care. It seems like every year someone thinks up a clever dodge to nibble
away at the system. Fortunately, these people have, so far, ended up losing in the courts.
</p>
<p>
Here’s a news story:
<a href="https://macleans.ca/society/health/ai-could-save-canadas-health-care-system/">AI Could Save Canada’s Health-Care
System</a>
. It’s actually pretty coherent and I found it plausible that this technology could maybe
improve, for example, the agonizingly slow emergency-room experience.
</p>
<p>
But then I got curious as to the business angle and tracked the source of the story down to a business called called
<a href="https://www.getmaple.ca">maple</a>
. Sure enough,
<a href="https://helpdesk.getmaple.ca/en/articles/5375023-fees-to-see-a-general-practitioner-on-maple">here they are</a>
trying to
siphon off direct payments for access to doctors. I predict they’ll end up in court, and lose.
</p>
<p>
And then there’s the government of Alberta, run by hard-right dipshits who hate most aspects of being Canadian and loathe the
proposition that government can provide good and efficient services. Thus:
<a href="https://www.cbc.ca/news/canada/calgary/alberta-paul-parks-mri-diagnostics-adriana-lagrange-9.6952189">Alberta
government plans to allow residents to privately pay for any diagnostic or screening service</a>
. Feaugh. I hope this one ends
up in court too.
</p>
<h2 id="p-12">Paying for Open Source</h2>
<p>It is coming to the world’s attention that most of our tech infrastructure is radically dependent on
open-source software maintenaned by a
cadre of developers who are old, tired, and not getting paid for their work. I have direct experience with trying unsuccessfully
to convince Big-Tech business leaders to invest in Open-Source maintenance and infrastructure. Here’s some of the coverage:</p>
<ul>
<li>
<p>
In
<cite>The Register</cite>
:
<a href="https://www.theregister.com/2024/09/18/open_source_maintainers_underpaid/">Open source maintainers underpaid,
swamped by security, going gray</a>
.
</p>
</li>
<li>
<p>
Open Source Security Foundation:
<a href="https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/">Open
Infrastructure is Not Free: A Joint Statement on Sustainable Stewardship</a>
.
</p>
</li>
<li>
<p>
Nils Adermann:
<a href="https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/">A Call for Sustainable Open Source
Infrastructure</a>
.
</p>
</li>
<li>
<p>Hackernoon: <a href="https://hackernoon.com/how-can-governments-pay-open-source-maintainers">How Can Governments Pay Open Source
Maintainers?</a></p>
</li>
<li>
<p>
The New Stack:
<a href="https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/">FFmpeg to Google: Fund Us or Stop Sending
Bugs</a>
.
</p>
</li>
</ul>
<p>Things obviously can’t go on as they are. The best path forward isn’t obvious to me, but we need to start finding it.</p>
<h2 id="p-11">Economics and life</h2>
<p>
Paul Krugman and Martin Wolf, two really smart guys who aren’t technologists,
<a href="https://paulkrugman.substack.com/p/talking-ai-with-martin-wolf">talk about the impact of AI</a>
. Technofeudalism is
considered carefully.
My favorite out-take
is from Krugman: “[I] have come to the conclusion that anything that I want to believe about the prospects of AI and its
economic effects, all I need to do is do a little searching, and I can find some expert who will tell me whatever it is I want to
believe.” Even with that well-justified cynicism, there is deep stuff here.
</p>
<p>
I read Matt Levine’s newsletter almost every day; not only does it teach you things about how money makes the world go round,
it entertains; his glee at some particularly juicy financial swindle or clever arbitrage maneuver will bring a smile to your
face.
In
<a href="https://newsletterhunt.com/emails/201930">Money Stuff: Quantum Bond Trading</a>
he addresses a deeper question: Does
the Finance business actually benefit society? Obviously a subject worthy of attention, and he makes it amusing.
</p>
<h2 id="p-8">Wonderful things</h2>
<p>
The dude who wrote
<a href="https://www.bikewanderer.com/on-the-road//packrafting-the-darien-gap">Paddling the Darien</a>
is clearly crazy, I guess it’d be more polite to say “insanely brave”. Anyhow, I think there are very few people who won’t be
astonished at these pictures and stories
</p>
<p>
I’m not at all sure what
<a href="https://jonathanhoefler.com/inventions">A. Inventions</a>
, by Jonathan Hoefler,
is, actually. The link that I followed said that GenAI image generators were involved. I don’t care.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/calendars.png" alt="Alignment Calendars 1584–1811"/>
<div class="caption">
<p>Alignment Calendars 1584–1811,<br/>from Jonathan Hoefler’s <cite>Inventions</cite>.</p>
</div>
<p>
Let’s end with music. Here are two absolutely exquisite song performances, courtesy of YouTube. First,
<a href="https://www.youtube.com/watch?v=1qahZ-whM6o">Old Enough</a>
by the Raconteurs, Ricky Skaggs, and Ashley Monroe. The
interplay of voices and strings is magical. Then Billy Strings wiith his band and string players, doing
<a href="https://www.youtube.com/watch?v=ZCtQdALo9DI">Gild the Lily</a>
. Just a lovely performance of a fine new song.
</p>
<p>That’s all, folks, see you next time.</p>
</div>
</content>
</entry>
<entry>
<title>Kendzior Case-Study</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study"/>
<link rel="replies" thr:count="3" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/13/Kendzior-Case-Study#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study</id>
<published>2025-11-13T12:00:00-08:00</published>
<updated>2025-11-14T10:55:57-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World/Social Media"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Social Media"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">There was recently a flurry of attention and dismay over <a href="https://en.wikipedia.org/wiki/Sarah_Kendzior">Sarah Kendzior</a> having been suspended from Bluesky by its moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
There was recently a flurry of attention and dismay over
<a href="https://en.wikipedia.org/wiki/Sarah_Kendzior">Sarah Kendzior</a>
having been suspended from Bluesky by its
moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In
particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there.
</p>
<h2 id="p-1">Disclosures</h2>
<p>
I’m a fan of Ms Kendzior, for example check out her recent
<a href="https://sarahkendzior.substack.com/p/when-i-loved-new-York">When I Loved New York</a>
; fine writing and incisive
politics. I like the Bluesky experience and have warm feelings toward the team there, although my
<a href="https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate">long-term social media bet is on Mastodon</a>
.
</p>
<h2 id="p-2">Back story</h2>
<p>
Back in early October, the
<cite>Wall Street Journal</cite>
published
<a href="https://www.wsj.com/arts-culture/music/can-we-finally-give-johnny-cash-his-due-58ab24c2">It’s Finally Time to Give
Johnny Cash His Due</a>
, an appreciation for Johnny’s music that I totally agreed with. In particular I liked its praise for
<a href="https://en.wikipedia.org/wiki/American_IV:_The_Man_Comes_Around">American IV: The Man Comes Around</a>
which, recorded while
he was more or less on his deathbed, is a masterpiece. It also said that, relative to other rockers, Johnny “can seem deeply
uncool”.
</p>
<p>
Ms Kendzior, who is apparently also a Cash fan and furthermore thinks he’s cool, posted to Bluesky “I want to shoot
the author of this article just to watch him die.” Which is pretty funny, because one of Johnny’s most famous lyrics, from
<a href="https://en.wikipedia.org/wiki/Folsom_Prison_Blues">Folsom
Prison Blues</a>
, was “I shot a man in Reno just to watch him die.” (Just so you know: In 1968 Johnny performed the song at a
benefit concert for the prisoners at Folsom, and on the live record (which is good), there is a burst of applause from the
audience after the “shot a man” lyric. It was apparently added in postproduction.)
</p>
<p>
Subsequently, per the
<a href="https://bsky.app/profile/safety.bsky.app/post/3m5hcx4n2hc2z">Bluesky Safety</a>
account ”The account owner of
@sarahkendzior.bsky.social was suspended for 72 hours for expressing a desire to shoot the author of an article.”
</p>
<p>There was an outburst of fury on Bluesky about the sudden vanishing of Ms Kendzior’s account, and the explanation
quoted above didn’t seem to reduce the heat much. Since I know nothing about the mechanisms used by Bluesky Safety, I’m
not going to dive any deeper into the Bluesky story.</p>
<h2 id="p-3">On Mastodon</h2>
<p>
I do know quite a bit about Mastodon’s trust-and-safety mechanisms, having been a moderator on
<a href="https://cosocial.ca">CoSocial.ca</a>
for a couple of years now. So I’m going to walk through how the same story might
have unfolded on Mastodon, assuming Ms Kendzior had made the same post about the
<cite>WSJ</cite>
article. There are a bunch of
forks in this story’s path, where it might have gone one way or another depending on the humans involved.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/report-menu.png" alt="Mastodon “Report” menu" class="inline"/>
<h2 id="p-4">Reporting</h2>
<p>The Mastodon process is very much human-driven. Anyone who saw Ms Kendzior’s post could pull up the per-post menu and hit the
“Report” button. I’ve put a sample of what that looks like on the right, assuming someone wanted to report yours truly.</p>
<p>
By the way, there are many independent Mastodon clients; some of them have “Report” screens that are way cooler than this. I
use
<a href="https://phanpy.social">Phanpy</a>
, which has a hilarious little animation with an animated rubber stamp that
leaves a red-ink “Spam” or whatever on the post you’re reporting.
</p>
<p>We’ll get into what happens with reports, but here’s the first fork in the road: Would the Kendzior post have been reported?
I think there are three categories of people that are interesting. First, Kendzior fans who are hip to Johnny Cash, get the
reference, snicker, and move on. Second, followers who think “ouch, that could be misinterpreted”; they might throw a
comment onto the post or just maybe report it. Third, Reply Guys who’ll jump at any chance to take a vocal woman down; they’d
gleefully report her en masse. There’s no way to predict what would have happened, but it wouldn’t be surprising if there were
both categories of report, or either, or none.</p>
<h2 id="p-5">Moderating</h2>
<p>When you file a report, it goes both to the moderators of your instance and the of instance where it was posted (who oversee the poster’s account).
I dug up a 2024 report someone filed against me to give a feeling for what
the moderator experience is like.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/timbray-report.png" alt="Report filed against Tim Bray for “antisemitism”"/>
<p>I think it’s reasonably self-explanatory. Note that the account that filed the report is not identified, but that the server
it came from is.</p>
<p>A lot of reports are just handled quickly by a single moderator and don’t take much thought: Bitcoin scammer or Bill Gates
impersonator or someone with a swastika in their profile? Serious report, treated seriously.</p>
<p>Others require some work. In the moderation screen, just below the part on display above, there’s space for moderators to
discuss what to do. (In this particular case they decided that criticism of political leadership wasn’t “antisemitism” and
resolved the report with no action.)</p>
<p>In the Kendzior case, what might the moderators have done? The answer, as usual, is “it depends”. If there were just one or
two reports and they leaned on terminology like “bitch” and “woke”, quite possibly they would have been dismissed.</p>
<p>If one or more reports were heartfelt expressions of revulsion or trauma at what seemed to be a hideous death threat, the
moderators might well have decided to take action. Similarly if the reports were from people who’d got the reference and
snickered but then decided that there really should have been a “just kidding” addendum.</p>
<h2 id="p-6">Action</h2>
<p>Here are the actions a moderator can take.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions.png" alt="Mastodon moderation action options"/>
<p>If you select “Custom”, you get this:</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions-2.png" alt="More Mastodon moderation action optiosn"/>
<p>Once again, I think these are self-explanatory. Before taking up the question of what might happen in the Kendzior case, I
should grant that moderators are just people, and sometimes they’re the wrong people. There have been servers with a reputation
for draconian moderation on posts that are even moderately controversial. They typically haven’t
done very well in terms of attracting and retaining members.</p>
<p>OK, what might happen in the Kendzior case? I’m pretty sure there are servers out there where the post would just have been
deleted. But my bet is on that “Send a warning” option. Where the warning might go something like “That
post of yours really shook up some people who didn’t get the Folsom Prison Blues reference and you should really
update it somehow to make it clear you’re not serious.”</p>
<p>Typically, people who get that kind of moderation message take it seriously. If not, the moderator can just delete the post.
And if the person makes it clear they’re not going to co-operate, that creates a serious risk that if you let them go on shaking
people up, your server could get mass-defederated, which is the death penalty. So (after some discussion) they’d delete the
account. Everyone has the right to free speech, but nobody has a right to an audience courtesy of our server.</p>
<h2 id="p-7">Bottom line</h2>
<p>It is very, very unlikely that in the Mastodon universe, Sarah Kendzior’s account would suddenly have globally vanished. It
is quite likely that the shot-a-man post would have been edited appropriately, and possible that it would have just
vanished.</p>
<h2 id="p-8">Will it scale?</h2>
<p>I think the possible outcomes I suggested above are, well, OK. I think the process I’ve described is also OK. The
question arises as to whether this will hold together as the Fediverse grows by orders of magnitude.</p>
<p>I think so? People are working hard on moderation tools. I think this could be an area where AI would help, by
highlighting possible problems for moderators in the same way that it highlights spots-to-look-at today for radiologists. We’ll
see.</p>
<p>There are also a couple of background realities that we should be paying more attention to. First, bad actors tend to
cluster on bad servers, simply because non-bad servers take moderation seriously. The defederation scalpel needs to be kept
sharp and kept nearby.</p>
<p>
Secondly, I’m pretty convinced that the current open-enrollment policy adopted by many servers, where anyone can have an
account just by asking for it, will eventually have to be phased out. Even a tiny barrier to
entry
<span class="dashes"> —</span>
a few words on why you want to join or, even better, a small
payment
<span class="dashes"> —</span>
is going to reduce the frequency of troublemakers to an amazing degree.
</p>
<h2 id="p-9">Take-aways</h2>
<p>Well, now you know how moderation works in the Fediverse. You’ll have to make up your own mind about whether you like it.</p>
</div>
</content>
</entry>
<entry>
<title>Bye, Google Search</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind"/>
<link rel="replies" thr:count="4" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind</id>
<published>2025-11-01T12:00:00-07:00</published>
<updated>2025-11-03T21:29:26-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Search"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Search"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Publishing"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Publishing"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World/Life Online/De-Google"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="De-Google"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog fragments using Google. No longer; I wired in <a href="https://pagefind.app">Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now, I’ll wait before getting into the details</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog
fragments using Google. No longer; I wired in
<a href="https://pagefind.app">Pagefind</a>
; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,
I’ll wait before getting into the details.
</p>
<h2 id="p-1">The problem</h2>
<p>
Well, I mean, Google is
<em>definitely</em>
Part Of The Problem in advertising, surveillance, and Internet
search. But the problem I’m talking about is that it just couldn’t find my pages, even
when I knew they were here and knew words that should find them.
</p>
<p>
Either it dropped the entries from the index or dropped a bunch of search terms.
Don’t know and don’t care now.
<span class="o">ongoing</span>
is my outboard memory
and I search it
<em>all the freaking time</em>
. This failure mode was making me crazy.
</p>
<h2 id="p-2">Pagefind</h2>
<p>Tl;dr: I downloaded it and installed it and it Just Worked out of the box. I’d describe the look and feel but that’d be a
waste of time since you just tried it out. It’s fast enough and doesn’t seem to miss anything and has a decent user
interface.</p>
<h2 id="p-3">How it works</h2>
<p>They advertise “fully static search library”, which I assumed meant it’s designed to work against sites like this one
composed of static files. And it is, but there’s more to it than that; read on.</p>
<p>
First, you point a Node program at the root of your static-files tree and stand back. My tree has a bit over 5,000 files
containing about 2½ million words, adding up to a bit over 20M of text. By default, it assumes you’re indexing HTML and includes
all the text inside each page’s
<code><body></code>
element.
</p>
<p>
You have to provide a
<code>glob</code>
argument to match the files you want to index; in most cases, something like
<code>root/**/*.html</code>
would do the trick. Working this out was for me the hardest part because among other things my
articles don’t end with
<code>.html</code>
; maybe it’ll be helpful for some to
note that what worked for
<span class="o">ongoing</span>
was:
<br/>
<code>When/???x/????/??/??/[a-zA-Z0-9]<[\-_a-zA-Z0-9]:></code>
</p>
<p>This produced an index organized into about 11K files adding up to about 78M. It includes a directory with one file per
HTML page being searched.</p>
<p>I’d assumed I’d have to wire this up to my Web server somehow, but no: It’s all done in the client by fetching little bits
and pieces of the index using ordinary HTTP GETs.
For example, I ran a search for the word “minimal”, which resulted in my browser fetching a total of seven files totaling
about 140K. That’s what they mean by “static”; not just the data, but the index too.</p>
<p>
Finally, I noticed a couple of WASM files, so I had to check out
<a href="https://github.com/Pagefind/pagefind">the source code</a>
and, sure enough, this is basically a Rust app. Again I’m
impressed. I hope that slick modern Rust/WASM code isn’t offended by me rubbing it up against this blog’s messy old
Perl/Ruby/raw-JS/XML tangle.
</p>
<h2 id="p-9">Scalable?</h2>
<p>
Interesting question. For the purposes of this blog, Pagefind is ideal. But, indexing my 2½ million words burned a solid
minute of CPU on the feeble VPS that hosts
<span class="o">ongoing</span>
. I wonder if the elapsed time is linear in the data
size, but it wouldn’t surprise me if it were worse. Furthermore, the index occupies more storage than the underlying data, which
might be a problem for some.
</p>
<p>Also, what happens when I do a search while the indexing is in progress? Just
to be sure, I think I’ll wire it up to build the index in a new directory and switch indices as atomically as possible.</p>
<p>Finally, I think that if you wanted to sustain a lot of searches per second, you’d really want to get behind a CDN, which would
make all that static index fetching really fly.</p>
<h2 id="p-4">Configuring</h2>
<p>The default look-and-feel was mostly OK by me, but the changes I had to make did involve quality time with the inspector,
figuring out the class and ID complexities and then iterating the CSS.</p>
<p>
The one thing that in the rear-view seems unnecessary is that I had to add a
<code>data-pagefind-meta</code>
attribute to the
element at the very bottom of the page where the date is to include it in the result list. There should be a way
to do this without custom markup. John Siracusa filed a
<a href="https://github.com/Pagefind/pagefind/issues/974">related bug</a>
.
</p>
<h2 id="p-8">Deployment</h2>
<p>There’s hardly any work. I’ll re-run the indexer every day with a crontab entry and it looks it should just take care of
itself.</p>
<h2 id="p-5">To do?</h2>
<p>Well, I could beautify the output some more but I’m pretty happy with it after just a little work. I can customize the sort
order, which I gather is in descending order of how significant Pagefind thinks the match is. There’s a temptation to sort it in
reverse date order. Actually, apparently I can also influence the significance algorithm. Anyhow I’ll run with mostly-defaults
for now.</p>
<h2 id="p-6">Search options</h2>
<p>I notice that the software is pretty good at, and aggressive about, matching across verb forms and singular/plural and
prefixes. Which I guess is what you want? You can apparently defeat that by enclosing a word in quotes if you want it matched
exactly. Works for phrases too. I wonder what other goodies are in there; couldn’t find any docs on that subject.</p>
<p>Finally, there’s an excellent feature set I’ll never use; it’s smart about lots of languages. But alas, I write
monolingually.</p>
<h2 id="p-10">Shameful cleanup</h2>
<p>Like I said, getting Pagefind installed and working was easy. Getting the CSS tuned up was a bit more effort. But I have to
confess that I put hours and hours into hiding my dirty secrets.</p>
<p>
You see,
<span class="o">ongoing</span>
contains way more
writing than you or Google can see. It’s set up so I can “semi-publish” pieces; there but unlinked. There was a whole lot of
this kind of stuff: Photo albums from social events, pitches to employers about why they should hire various people
including me, rants at
employers for example about why Solaris should adopt the Linux userland (I was right) and why Android should include a Python
SDK (I was right), and pieces that employer PR groups convinced me to bury. One of my minor regrets about no longer being
employed is I no longer get to exercise my mad PR-group-wrangling skillz.
</p>
<p>
But when your search software is just walking the file tree, it doesn’t know what’s “published” and what’s not. I ended up
using my rusty shell muscles with
<code>xarg</code>
and
<code>sed</code>
and
<code>awk</code>
and even an
<code>ed(1)</code>
script. I think I got it all, but who knows, search hard enough and you might find something embarrassing. If you do, I’d sure
appreciate an email.
</p>
<h2 id="p-7">Thanks!</h2>
<p>To the folks who built this. Seems like a good thing.</p>
</div>
</content>
</entry>
<entry>
<title>Time to Migrate</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate"/>
<link rel="replies" thr:count="6" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/03/Time-to-Migrate#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate</id>
<published>2025-11-03T12:00:00-08:00</published>
<updated>2025-11-03T12:00:00-08:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Business/Publishing"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Business"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Publishing"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World/Life Online"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean any combination of “less useful”, “less safe”, or “less fun”. This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to go. Come join me. Here’s why</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean
any combination of “less useful”, “less safe”, or “less fun”.
This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to
go. Come join me. Here’s why.</p>
<h2 id="p-2">Defining terms</h2>
<p>
In this post, by “Social media” I mean
“what Twitter used to be, back when it was good”. We should expect our social-media future to be
<em>at least</em>
as useful, safe, and fun as that baseline. (But we can do better!)
</p>
<p>
By “Mastodon” I mean the many servers, mostly running the
<a href="https://github.com/mastodon/mastodon">Mastodon software</a>
, that
communicate using the
<a href="https://en.wikipedia.org/wiki/ActivityPub">ActivityPub protocol</a>
. Now I’ll try to convince you to start using one of
them.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/join-mastodon.png" alt="join-mastodon.org"/>
<div class="caption">
<p>
Start at
<a href="https://joinmastodon.org">joinmastodon.org</a>
</p>
</div>
<h2 id="p-4">The simplest argument</h2>
<p>Have you noticed that social-media products, in the long term, can’t seem to manage to stay fun and safe and useful?
I have. But there’s one huge exception, a tool that’s been serving billions of us for
decades, and works about as well as it ever did. I’m talking about email.</p>
<p>Why does email stay reasonably healthy? Because nobody owns it. Anyone on any server can communicate with anyone else on any
other and it Just Works. Nobody can buy it and make it a vehicle for their politics. Nobody can crank up the ad density or
make things worse to improve their profit margin.</p>
<p>
Mastodon’s like email that way. Plus it does all the Post and Repost and Quote and Follow and Reply and Like and Block stuff that you’re
used to, and there are thousands of servers and anyone can run one and nobody can own the whole thing. It doesn’t have ads and it
won’t. It’s dead easy to use and it’s fun and you should
<a href="https://joinmastodon.org">give it a try</a>
.
</p>
<p>
The rest of this essay goes into detail about why Mastodon is generally great and specifically better than the
alternatives. But if that simple pitch sounded good, stop here,
<a href="https://joinmastodon.org/">go get an account</a>
and climb on board.
</p>
<!--
<p>But first…</p>
<h2 id='p-5'>Is social media worth saving?</h2>
<p>I regularly read that it’s pernicious and evil, damaging the mental health of young people,
and should be stamped out or foregone. I disagree. I think the problem is late-stage capitalism; every company that
offers a social-media product is under relentless financial pressure to yield steadily-growing profits, going on forever.</p>
<p>Since
there’s a global limit to the number of customers that any service can attract, that means they have to suck more out of each
user. Where by “suck more out of” I mean what social-media professionals call “increase engagement”.</p>
<p>So, engagement is increased at literally any cost, notably including the
<a href="https://erinkissane.com/meta-in-myanmar-part-i-the-setup">slaughter of the Rohingya</a>.</p>
<p>I for one do <em>not</em> agree that there’s anything essentially pernicious about having networked online
conversations. Once again, I appeal to email, which generally doesn’t exhibit the usual social-media pathologies.</p>
<p>I’d even appeal to Twitter-that-was, when authoritative voices were
talking about any subject from every angle, and when you could find out if you’d just felt an earthquake and be horrified or overjoyed
about Maple Leafs playoff collapse. It was fun and useful and educational.</p>
<p>So, Social Media? Yes. Centralized corporate social media? No.</p>
<p>Now, here are a bunch of great things about Mastodon, if that pitch above didn’t quite convince you to switch now.</p> -->
<h2 id="p-18">Why now?</h2>
<p>
Two things motivated me to post this piece now. First, this month is my three-year anniversary of
<a href="/ongoing/When/202x/2022/11/26/Bye-Twitter">bailing out on Twitter</a>
in favor of Mastodon.
</p>
<p>Second is the release of Mastodon 4.5, which I think closes the last few important-missing-feature gaps.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/masto4-5.png" alt="Mastodon v4.5 announcement"/>
<p>The software is improving rapidly, particularly in the last couple of releases. It’s got cool features you won’t find
elsewhere, and there’s very little cool stuff from elsewhere that’s not here. There was a time when newly-arrived people had
confusing or unfriendly experiences, or missed features that were important to them.
It looks to me like those days are over.</p>
<h2 id="p-6">Migration</h2>
<p>
Mastodon is many thousands of servers, and you can join the biggest,
<a href="https://mastodon.social/explore">mastodon.social</a>
, or
<a href="https://joinmastodon.org/servers">shop around for another</a>
. But here’s the magic thing: If you end up disliking the
server you’re on, or find a better one, you can migrate and
<em>take your followers with you</em>
! You can’t ever get locked
in.
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/serveres.png" alt="Choosing a Mastodon server"/>
<div class="caption">
<p>The server-selection menu has lots of options.</p>
</div>
<p>This is probably Mastodon’s most important feature. It’s why no billionaire can buy it and no corporation can enshittify it. As
far as I know, Mastodon is the first widely-adopted social software ever to offer this.</p>
<h2 id="p-7">Interaction</h2>
<p>You hear it over and over: “I had <a big number> of followers on Twitter and now I have <a less-big number> on
Mastodon, but I get so much more conversation and interaction when I post here.”</p>
<p>One of the people you’ll hear that from is me.
My follower count is less than half the 45K I had on Twitter-that-was, but I get immensely more intelligent, friendly
interaction than I ever got there. (And then sometimes I get told firmly that I’m wrong about this or that, but hey.) It’s
the best social-media experience I’ve ever had.</p>
<p>Dunno about you, but conversation and interaction
seem like a big deal to me. One reason things are lively is…</p>
<h2 id="p-8">Sex</h2>
<p>Here’s an axiom: An ad-supported service can’t have sex-positive or explicit content. Advertisers simply won’t tolerate
having their message appear beside NSFW images or Gay-Leatherman tales or exuberant trans-positivity. Mastodon
can.</p>
<p>Of course, you gotta be reasonable, posting anything actually illegal will get your ass perma-blocked and your account
suspended. So will posting anything that’s NSFW etc without a “Content Warning”. That’s a built-in feature of Mastodon which
puts a little warning (“#NSFW” and “#Lewd” are popular) above your post, which is tastefully blurred-out until whoever’s
looking at it clicks on “Show content”.
I use these all the time when
I post about #baseball or #fútbol because a lot of the geeks and greens who follow me are pointedly uninterested in sports.</p>
<p>
(Oh, typing that in reminds me that you can subscribe to hashtags on Mastodon: Let’s see, I currently subscribe to, among
others,
<a href="https://mastodon.social/search?q=%23Vancouver">#Vancouver</a>
,
<a href="https://mastodon.social/search?q=%23Murderbot">#Murderbot</a>
, and
<a href="https://mastodon.social/search?q=%23Fujifilm">#Fujifilm</a>
.)
</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/ivory.png" alt="The Ivory For Mastodon app for Apple platforms"/>
<div class="caption">
<p>The “Ivory for Mastodon” app for Apple platforms,<br/>one of the many fine alternative clients.</p>
</div>
<h2 id="p-9">Moderation and defederation</h2>
<p>Did I just mention, two paragraphs up, getting blocked? Mastodon isn’t free of griefers, but the tools to fight them are good
and getting better.</p>
<p>The good news is that each server moderates its own members. So there’s some variation
of the standards from server to server, but less than you’d think. Since there are thousands of servers, there are
thousands of moderators, which is a lot.</p>
<p>If you act in a way that others find offensive, you’ll probably get blocked by the offended people and also reported; the
report can come from any server and it’ll go to the moderators on yours. On a well-run server, those mods will have a look and
if you’ve actually been bad, your post might get yanked and you might get warned, or in an extreme case, booted off.</p>
<p>(I’ve been reported for saying unkind things about Bibi Netanyahu and for posting too many photos of my
cats (no, really) but that kind of thing is cheerfully ignored by good moderation teams.)</p>
<p>
Then there’s Mastodon’s nuclear weapon: Defederation.
Suppose you’re prone to nasty bigotry in public and you get reported a lot and your server’s moderators
<em>don’t</em>
rein
you in. Eventually, word will get around, and if things aren’t cleaned up, most servers will defederate yours, so that
<em>nobody</em>
on their server can see posts from anyone on yours. Your site is no longer part of the “Fediverse”; this is a powerful
incentive for server owners to take moderation seriously.
</p>
<p>The effect of all this is that the haters and scammers and Nazis who show up get shuffled off-stage PDQ. Well,
almost always; a couple of years ago a wave of incoming Black people had bad experiences with racist abuse. Ouch. But
the good news is that recent Mastodon releases have been shutting prone-to-abuse channels
down, so things are better than then and should continue to improve.</p>
<h2 id="p-11">Links are good</h2>
<p>
Corporate social-media services like to
<a href="https://talkingpointsmemo.com/tpm-25/how-elon-musks-changes-to-x-made-our-discourse-far-stupider">downrank posts with
links</a>
.
Which makes me want
to scream, because my favorite thing to post is a link+reaction to something cool, and my favorite posts to read are too.
</p>
<p>On Mastodon, when you have a link in a post, the software automatically fetches a preview of whatever you linked to and uses
it to decorate your link.
I mean, it’s the damn Internet, it only got interesting to non-geeks when we figured out how to turn millions of servers
into a great big honking searchable hypertext.</p>
<h2 id="p-12">Search</h2>
<p>Speaking of which, Mastodon search is pretty good these days. It’s become, just like this blog, part of my outboard
memory, and I’m always typing things like “telephoto from:me has:media” into the search box. Fast enough, too.</p>
<h2 id="p-13">Great clients</h2>
<p>Another good thing about Mastodon is that there are lots of
clients to choose from, mostly open-source. The best ones are miles ahead of Xitter and Threads and
Bluesky and, really, anything.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/Screenshot_20251110-104045.png" alt="A post from Brian Krebs in the Tusky app"/>
<div class="caption">
<p>Anniversary post in the Android “Tusky” app.</p>
</div>
<p>
There are official Web and mobile clients from the Mastodon team and they’re fine, especially for admin and moderation work.
But iOS people should check out
<a href="https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/">Ivory</a>
, Androiders should look at
<a href="https://tusky.app">Tusky</a>
, and everyone should try
<a href="https://phanpy.social">Phanpy</a>
. I live in Phanpy on both my Mac and my Pixel
<span class="dashes"> —</span>
it’s a
Web thing but installable as a PWA on both Android and iOS.
</p>
<p>
Commercial products, especially social-media services, have
<em>never</em>
been at peace with third-party clients.
Twitter used to be, but then it stabbed those developers in the back. It’s easy to
understand why; every product manager has it drilled into them that they
<em>must control the user experience</em>
. This ignores
the ancient wisdom (I first heard it from
<a href="https://en.wikipedia.org/wiki/Bill_Joy">Bill Joy</a>
) “Wherever you work, most of the smart people are somewhere else.”
</p>
<p>
Mastodon doesn’t have that kind of product manager, but it does have a
<a href="https://docs.joinmastodon.org/api/">fully-capable API</a>
, developed in the open and with no
hidden or restricted features. Which means you’re going to get better clients.
</p>
<h2 id="p-14">Algorithms</h2>
<p>The algorithms that commercial social-media services use to sort your feed have one goal only: Maximize engagement and thus
revenue. They have no concern for quality or novelty, and have been widely condemned by people who think about this stuff. So
much so that there’s a feeling that Algorithms Are Bad.</p>
<p>Mastodon has an algorithm: Show the posts from the accounts you follow, latest first. It works pretty
well. It also has “Trending” feeds of the most popular posts, hashtags, and links. I hit those once a
day or so to get a feeling for what’s going on in the world.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/trending.png" alt="Trending screen in PhanPy"/>
<div class="caption">
<p>The “Trending” display in Phanpy.</p>
</div>
<p>I do think there’s room for improvement here; Bluesky has shown off the idea of pluggable feed-ranking algorithms, with many to
choose from, and I like it. No reason in principle we couldn’t have the same thing on Mastodon.</p>
<h2 id="p-15">Money</h2>
<p>Every other social network has started with a big pot of money, whether from venture-capital investors (Twitter, Instagram) or
from a Big Tech corporate parent (Google+, Threads). The people who provided that money want it back, plus a whole lot more.
Thus, the manic drive for “engagement” and growth at all costs. They need to build huge data centers and employ an elite
operations team plus an even more elite marketing group.</p>
<p>Mastodon, eh… a gaggle of nonprofits and co-ops and unincorporated affinity groups, financed by Patreon or low annual dues
or Some Random Geek who enjoys running a server.</p>
<p>Since nobody owns it, nobody can extract a profit from it. Which means that from the big-money point of view, it’s entirely
non-investable. The goal isn’t for anybody to make money, it’s to be instructive and intense and fun. It’s run on the cheap.
You know what they call systems that are cheap and diversified? Resilient. Sustainable. Long-lived.</p>
<p>
Last year
<a href="https://www.tbray.org/ongoing/When/202x/2024/11/15/Not-Bluesky">I wrote</a>
:
“Think of the Fediverse not as just one organism, but a population of mammals, scurrying around the ankles of the bigger and
richer alternatives. And when those alternatives enshittify or fall to earth, the Fediversians will still be there.” After
“scurrying” I should have added “and evolving”.
</p>
<h2 id="p-19">What about Bluesky?</h2>
<p>
I like the Bluesky people and their software, but I worry a lot about whether they’re really decentralized in practice, and
even more about their financial future. I wrote up the details in
<a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">Why Not Bluesky</a>
.
</p>
<h2 id="p-16">Mastodon’s the only option</h2>
<p>The only social-media option, I mean, that’s decentralized, not owned or controlled by anyone, and working well today as you
read this. It’s intense and interactive and fun. Why settle for less?</p>
<p>
<i>(Disclosure: I have no formal connections with the Mastodon organization, aside from being a low-level supporter on
Patreon.)</i>
</p>
</div>
</content>
</entry>
<entry>
<title>Grokipedia</title>
<link href="https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia"/>
<link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2025/10/28/Grokipedia#comments"/>
<id>https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia</id>
<published>2025-10-28T12:00:00-07:00</published>
<updated>2025-10-29T21:09:53-07:00</updated>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Publishing/Reference"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Publishing"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Reference"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
<category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I succumbed to boredom and killed the tab. Thus my introduction to <a href="https://en.wikipedia.org/wiki/Grokipedia">Grokipedia</a>. Here are early impressions</div>
</summary>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>
Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I
succumbed to boredom and killed the tab. Thus my introduction to
<a href="https://en.wikipedia.org/wiki/Grokipedia">Grokipedia</a>
. Here are early impressions.
</p>
<h2 id="p-1">On Bray</h2>
<p>
My Grokipedia entry has over seven thousand words, compared to a mere 1,300 in
<a href="https://en.wikipedia.org/wiki/Tim_Bray">my Wikipedia article</a>
. It’s pretty clear how it was generated; an LLM, trained
on who-knows-what but definitely including that Wikipedia article and this blog, was told to go nuts.
</p>
<p>Speaking as a leading but highly biased expert on the subject of T. Bray, here are the key take-aways:</p>
<h2 id="p-2">(Overly) complete</h2>
<p>It covers all the territory; there is no phase of my life’s activity that could possibly be encountered in combing the Web
that is not exhaustively covered. In theory this should be good but in fact, who cares about the details of what I worked on
at Sun Microsystems between 2004 and 2010? I suppose I should but, like I said, I couldn’t force myself to plod all the way
through it.</p>
<h2 id="p-3">Wrong</h2>
<p>Every paragraph contains significant errors. Sometimes the text is explicitly self-contradictory on the face of it,
sometimes the mistakes are subtle enough that only I would spot them.</p>
<h2 id="p-4">Style</h2>
<p>The writing has that LLM view-from-nowhere flat-affect semi-academic flavor. I don’t like it but the evidence suggests that
some people do?</p>
<h2 id="p-5">References</h2>
<p>All the references are just URLs and at least some of them entirely fail to support the text. Here’s an example. In
discussion of my expert-witness work for the FTC in their litigation against Meta concerning its acquisitions of Instagram and
WhatsApp, Grokipedia says:</p>
<blockquote>
<p>[Bray] opined that users' perceptions of response times in online services critically influence market
dynamics.</p>
</blockquote>
<p>
It cites
<a href="https://www.ftc.gov/system/files/ftc_gov/pdf/FTCReplytoMetaResponse-CounterstatementofMaterialFacts.pdf">Federal
Trade Commission’s Reply to Meta Platforms, Inc.’s Response to Federal Trade Commission’s Counterstatement of Material
Facts</a>
(warning: 2,857-page PDF). Okay, that was one of the things I argued, but the 425 pages of court documents that I
filed, and the references to my reporting in the monster document, make it clear that it was one tiny subset of the main
argument.
</p>
<p>Anyhow, I (so that you won’t have to) spent a solid fifteen minutes spelunking back and forth through that FTC doc, looking
for strings like “response time” and “latency” and so on. Maybe somewhere in those pages there’s support for the claim quoted
above, but I couldn’t find it.</p>
<h2 id="p-6">Useful?</h2>
<p>
Wikipedia, in my mind, has two main purposes: A quick visit to find out the basics about some city or person or plant or
whatever, or a deep-dive to find out what we
<em>really</em>
know about genetic linkages to autism or Bach’s relationship with
Frederick the Great or whatever.
</p>
<p>At the moment, Grokipedia doesn’t really serve either purpose very well. But, after all, this is release 0.1, maybe we
should give it a chance.</p>
<p>Or, maybe not.</p>
<h2 id="p-7">Woke/Anti-Woke</h2>
<p>The whole point, one gathers, is to provide an antidote to Wikipedia’s alleged woke bias. So I dug into that. Let’s consider
three examples of what I found. First, from that same paragraph about the FTC opinion quoted above:</p>
<blockquote>
<p>
While Bray and aligned progressives contend that such dominance stifles innovation by enabling predatory acquisitions and
reduced rivalry—evidenced by fewer startup exits in concentrated sectors—counterarguments highlight that Big Tech's scale has
fueled empirical gains, with these firms investing over $240 billion in U.S. R&D in 2024 (more than a quarter of national
totals) and driving AI, cloud, and patent surges.[
<a href="https://www.tbray.org/ongoing/When/202x/2020/06/08/Anti-monopoly">128</a>
]
[
<a href="https://www.intereconomics.eu/contents/year/2025/number/2/article/big-tech-and-the-us-digital-military-industrial-complex.html">131</a>
] Six tech industries alone accounted for
over one-third of
U.S. GDP growth from 2012–2021, comprising about 9% of the
economy and sustaining 9.3 million jobs amid falling consumer prices and rapid technological diffusion.
[
<a href="https://itif.org/publications/2023/05/30/six-tech-industries-accounted-for-more-than-one-third-of-gdp-growth-in-the-last-decade/">132]</a>
[
<a href="https://jamesmadison.org/the-united-states-is-the-leader-of-the-digital-revolution-pro-tech-policies-are-key/">133</a>
]
Right-leaning economists often defend consumer welfare metrics and market self-correction, warning that forced divestitures
risk eroding the efficiencies and investment incentives that have propelled sector productivity above 6% annual growth in key
areas like durable manufacturing tech.
[
<a href="https://itif.org/publications/2025/09/19/five-persistent-myths-about-big-tech/">134</a>
]
[
<a href="https://www.nber.org/digest/oct01/technology-and-productivity-growth?page=1&perPage=50">135</a>
]
</p>
</blockquote>
<p>
I’ve linked the numbered citations to the indicated URLs. Maybe visit one or two of them and see what you think? Four are
to articles arguing, basically, that monopolies must be OK because the companies accused of it are growing really fast and
driving the economy. They seem mostly to be from right-wing think-tanks but I guess that’s what those think-tanks are for. One
of them, #131,
<cite>Big Tech and the US Digital-Military-Industrial Complex</cite>
, I think isn’t helpful to the argument at
all. But still, it’s broadly doing what they advertise: Pushing back against “woke” positions, in this case the position that
monopolization is bad.
</p>
<p>I looked at a couple of other examples. For example, this is from the header of the Greta Thunberg article:</p>
<blockquote>
<p>While credited with elevating youth engagement on environmental issues, Thunberg's promotion of urgent, existential climate
threats has drawn scrutiny for diverging from nuanced empirical assessments of climate risks and adaptation capacities, as
well as for extending her activism into broader political arenas such as anti-capitalist and geopolitical protests.[5][6]</p>
</blockquote>
<p>Somehow I feel no urge to click on those citation links.</p>
<p>
If Ms Thunberg is out there on the “woke” end of the spectrum, let’s flit over to the other end, namely the entry for
J.D. Vance, on the subject of his book
<cite>Hillbilly Elegy</cite>
.
</p>
<blockquote>
<p>
Critics from progressive outlets, including Sarah Smarsh in her 2018 book
<cite>Heartland</cite>
, faulted the memoir for
overemphasizing personal and cultural failings at the expense of structural economic policies, arguing it perpetuated
stereotypes of rural whites as self-sabotaging.[71] These objections, often rooted in institutional analyses from academia and
media, overlooked data on behavioral patterns like opioid dependency rates—peaking at 21.5 deaths per 100,000 in Appalachia
around 2016—that aligned with Vance's observations of "deaths of despair" precursors.[72]
</p>
</blockquote>
<p>
I read and enjoyed
<cite>Heartland</cite>
but the citation is to a
<cite>New Yorker</cite>
article that doesn’t mention
Smarsh. As for the second sentence… my first reaction as I trudged through its many clauses, was “life’s too short”.
But seriously, opioid-death statistics weaken the hypothesis about structural economic issues? Don’t get it.
</p>
<h2 id="p-8">Take-away</h2>
<p>
Wikipedia is,
<a href="/ongoing/When/202x/2024/06/15/Wikipedia-Pain">to quote myself</a>
, the encyclopedia that “anyone who’s willing to
provide citations can edit”.
Grokipedia is “the encyclopedia that Elon Musk’s LLM can edit, with sketchy citations and no progressive argument left
un-attacked.”
</p>
<p>So I guess it’s Working As Intended?</p>
</div>
</content>
</entry>
</feed>
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
xmlns:thr='http://purl.org/syndication/thread/1.0'
xml:lang='en-us'>
<title>ongoing by Tim Bray</title>
<link rel='hub' href='http://pubsubhubbub.appspot.com/' />
<id>https://www.tbray.org/ongoing/</id>
<link href='https://www.tbray.org/ongoing/' />
<link rel='self' href='https://www.tbray.org/ongoing/ongoing.atom' />
<link rel='replies' thr:count='101' href='https://www.tbray.org/ongoing/comments.atom' />
<logo>rsslogo.jpg</logo>
<icon>/favicon.ico</icon>
<updated>2026-03-11T18:11:06-07:00</updated>
<author><name>Tim Bray</name></author>
<subtitle>ongoing fragmented essay by Tim Bray</subtitle>
<rights>All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright</rights>
<generator uri='/misc/Colophon'>Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, and ImageMagick. Industrial-strength technology, baby.</generator>
<entry>
<title>Because Algospeak</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/03/05/Because-Algospeak' />
<link rel='replies' thr:count='2' type='application/xhtml+xml' href='/ongoing/When/202x/2026/03/05/Because-Algospeak#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/03/05/Because-Algospeak</id>
<published>2026-03-05T12:00:00-08:00</published>
<updated>2026-03-07T10:29:41-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Language' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Language' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Recently I read <a href='https://en.wikipedia.org/wiki/Because_Internet'>Because Internet</a> by <a href='https://gretchenmcculloch.com'>Gretchen McCulloch</a> and <a href='https://en.wikipedia.org/wiki/Algospeak_(book)'>Algospeak</a> by <a href='https://en.wikipedia.org/wiki/Adam_Aleksic'>Adam Aleksic</a>. The language we speak (and text) to each other is at the core of who and what we are, and the Internet is the strongest among the forces that channel and fertilize its growth. So there’s scope for plenty of books on the subject. Both books educated and entertained, one made me angry</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Recently I read
<a href="https://en.wikipedia.org/wiki/Because_Internet">Because Internet</a> by
<a href="https://gretchenmcculloch.com">Gretchen McCulloch</a> and
<a href="https://en.wikipedia.org/wiki/Algospeak_(book)">Algospeak</a> by
<a href="https://en.wikipedia.org/wiki/Adam_Aleksic">Adam Aleksic</a>. The language we speak (and text) to each other is at the
core of who and what we are, and the Internet is the strongest among the forces that channel and fertilize its growth.
So there’s scope for plenty of books on the subject. Both books educated and entertained, one made me angry.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/03/05/covers.png" alt="The covers of “Because Internet” and “Algospeak”" />
<h2 id='p-1'>Because Internet (2019)</h2>
<p>Its approach is historical and its voice fairly uninflected. It smiles and
argues, but it doesn’t ROFL nor does it YELL AT YOU. The history is longer, perhaps, than most people reading this have
been online (or even alive). Ms McCulloch goes back to the days of BBSes (“bulletin-board systems”) and ListServs and IRC. Some of
the jargon and formulations of those days live on; you’d be surprised.</p>
<p>Here’s her table of contents.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/03/05/BI-toc.png" alt="Table of Contents from “Because Internet”" />
<p>The analysis is grounded in the formalisms of the author’s profession, academic linguistics. Nothing wrong with that.</p>
<p>Let’s look at a couple of her ideas, beginning with Chapter 1’s “Informal Writing”. A few of us, back in the late
Eighties, noticed that computers in general and the then-nascent Internet in particular were driving a writing
renaissance.</p>
<p>Before computers, a knowledge worker who had laboriously constructed essays in college quite likely wrote
almost nothing for the rest of their working life. People talked face-to-face or on the phone, and dictated to
secretaries. Written communication was seen as necessarily formal and disjoint from the way we spoke, or that we wrote in
personal correspondence. Then, suddenly, everyone was sitting at a keyboard only seconds away from everyone else’s screen.
McCulloch goes deep on this:</p>
<blockquote><p>In the future, the era of writing between the invention of the printing press and the internet may come to be
seen as an anomaly—an era when there arose a significant gap between how easy it was to be a writer versus a reader. An era when
we collectively stopped paying attention to the informal, unedited side of writing and let typography become static and
disembodied.</p>
<p>The internet didn’t create informal writing, but it did make it more common, changing some of our previously spoken
interactions into near-real-time text exchanges.</p></blockquote>
<p>From which all of this follows. It feels like a central insight. I suppose you could argue that centrality of informal text
is fading in the face of short-form video. Maybe,
it’s too soon to tell.</p>
<p>Then consider chapter 5, about emojis. Linguists obviously need to think about them because now they’re an
integral part of written language. McCulloch’s insight is that they correspond almost exactly to gestures, the way we use
our hands to add force to our speech. Obviously, for example, “👍”. Or when you’re talking about something completely
loopy and you twirl your index finger by your ear? You meant “🤪”.</p>
<p>I offer the emoji story for flavor, an example of a linguist’s approach to what we’re doing to our language with our
networks.</p> <p>McCulloch has lots more of this stuff.
I enjoyed <cite>Because Internet</cite> a lot, partly because I’m old and my memories stretch back to those BBS and
IRC days and I had a front-row seat for the decades of linguistic seething and heaving. And also because I’m a
<a href="https://www.rfc-editor.org/rfc/rfc9839.html">Unicode geek</a>.</p>
<h2 id='p-2'>Algospeak (2025)</h2>
<p>The subtitle is “How Social Media Is Transforming the Future of Language”. OK, but…
Social media is a fertile field for language evolution. Thing is, corporate social media discourse
lives in the dire grip of the proprietors’ algorithms. And that’s where Adam Aleksic focuses. He treats all of them
as a single opaque object, “The Algorithm”, which I think is fair because they all are designed with one goal: To
maximize the effectiveness of human conversation at generating advertising revenue.</p>
<p>First, the Table of Contents.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/03/05/AS-toc.png" alt="Table of Contents from “Algospeak" />
<p>Aleksic knows whereof he speaks: As “Etymology Nerd”, his aggregate following across TikTok, Instagram, and YouTube is
over three million. He’s all about cool bits and pieces of
linguistics, often Internet-specific usages.
If I had the patience for podcasts I suppose his would be near the top of my list.</p>
<p>He really enjoys his work and has fun talking about some of Social Media’s more colorful linguistic extrusions; check
that Table of Contents. I’m kind of old and I learned a lot about the words and emojis younger folk emit, and I think most folks,
even those just out of their teens, would too. I’m on a Discord for a
<a href="/ongoing/What/Sports/Soccer/">Major League Soccer</a> team’s fans, and while it’s totally all-ages, I can say I am regularly
less mystified than I was before I read <cite>Algospeak</cite>.
For example, now I know what it means when someone tosses “💀” into a chat. Do you?</p>
<p>Aleksic isn’t averse to a little history himself. Looking back over the successive online-jargon volcanoes, he argues
convincingly that two stand out as extra productive. First of all, the short-lived (but hot stuff at the time)
<a href="https://en.wikipedia.org/wiki/Vine_(service)">Vine</a> video platform. Second, the incel cesspool; sad but
(apparently) true.</p>
<h2 id='p-3'>The Algorithm</h2>
<p>Remember, it’s all about what advertisers want. And wow, do they ever want a lot of things. I’ll just touch on a few of
Aleksic’s points.</p>
<p>First of all, they don’t want to find themselves next to downers. So if you want to talk about death or suicide or rape or
racism or rage,
you need to fool The Algorithm. Thus “unalive” and many other dodges. Of course, The Algorithm learns about them so you
have to keep dodging. Neither side of this struggle can stay ahead for long.</p>
<p>Here’s another thing I didn’t know: Apparently written Chinese is particularly rich in techniques for euphemizing, making it
easier for users of that language to evade, for a time, The Algorithm.</p>
<h2 id='p-4'>Partitioning people</h2>
<p>Another big thing The Algorithm likes is grouping people into smaller and smaller baskets based on interests, generations,
and many other criteria. This is because advertisers can aim very specific campaigns at just exactly the right cohort of people who
are likely to buy what they’re selling. Here’s a quote; See how the language fills in behind advertisers’ pressure?</p>
<blockquote><p>It doesn’t matter how much I label myself. If I’m a demisexual goblincore Gen
Z Swiftie, I guarantee there are still others like me. The only thing these labels really change about me is that they make me
easier to classify and market to. Ironically, true individuality may come out of a <em>lack</em> of labels and stories, because
there’s greater freedom of expression with a blank slate. If everybody’s the “main character,” then nobody is.</p></blockquote>
<p><cite>Algospeak</cite>, unlike <cite>Because Internet</cite>, doesn’t limit itself to written language. One of its most
compelling studies concerns the vocal techniques of podcasters and YouTubers. The finding is simple: It’s hard to build and hold an
audience for your show unless you sound like MrBeast. No, really.</p>
<p>Anyhow, they’re both good books. <cite>Because Internet</cite> educated and entertained me. <cite>Algospeak</cite> is way
more intense, intentionally more like the subject it addresses. Also it made me angry. I am a lover of human language and of its
patterns of growth and mutation and simplification and complexification. Linguistics is one of the disciplines I regret not
having chosen.</p>
<p>Aleksic makes it clear that there’s an amusing narrative about how the people living and speaking in the shade of the Algorithm
can never defeat it, but they can still manage to get their messages across. But they shouldn’t have to struggle!</p>
<p>In fact, a few million of us have found a place to talk to each other that isn’t in The
Algorithm’s shadow: Decentralized social media. Specifically the Fediverse (what people mean when they say “Mastodon”) and maybe
the ATmosphere (same for “Bluesky”).</p>
<p>I want to see how language grows in a place where new forms arrive when they’re needed, to say new things that need to be
said. Not to either serve or resist The Algorithm.</p>
</div></content></entry>
<entry>
<title>Kansas and AI</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/02/27/Kansas-and-GenAI' />
<link rel='replies' thr:count='1' type='application/xhtml+xml' href='/ongoing/When/202x/2026/02/27/Kansas-and-GenAI#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/02/27/Kansas-and-GenAI</id>
<published>2026-02-27T12:00:00-08:00</published>
<updated>2026-02-27T16:06:19-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Block announced that it’s cutting 40% of its workforce. It didn’t say it was replacing those people with GenAI. Not out loud. Jack Dorsey did say “I believe the majority of companies will reach the same conclusion and make similar structural changes.” Wall Street loved it, bidding up the share price by 24%. Which reminded me of Kansas in 2010</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Block announced that it’s cutting 40% of its workforce. It didn’t say it was replacing those people with GenAI. Not out loud.
Jack Dorsey did say “I believe the majority of companies will reach the same conclusion and make similar structural
changes.”
Wall Street loved it, bidding up the share price by 24%. Which reminded me of Kansas in 2010.</p>
<h2 id='p-1'>The Kansas Experiment</h2>
<p>As long as I can remember, a certain class of right-wing evangelists has preached that cutting taxes would stimulate business
growth and everyone would come out ahead. There are a couple of problems with this theory. First, mainstream economists
almost universally think it’s just wrong. Second, most of the people pushing it are rich and would
benefit from the cuts.</p>
<p>Anyhow, in 2010 US Senator Sam Brownback won the race for governor of Kansas on what was then called the “Tea Party” program:
Prosperity through tax cuts. Tea-party Republicans also won a large majority in the state legislature. Unsurprisingly they
immediately
<a href="https://en.wikipedia.org/wiki/Kansas_experiment">did what they said they were going to do</a>: Slashed a wide variety
of taxes, some to zero.</p>
<p>The predicted prosperity failed to happen. The state government’s revenue plunged and it had to dig deep into rainy-day
reserves just to keep the doors open. There were brutal cuts to policing, road repair, and schools. Also a nasty
feedback loop: As the state’s fiscal position worsened, its credit rating fell and interest rates rose, leading to yet more
brutal austerity measures.</p>
<p>Another result was that affluent Kansans made out like bandits; the cost of running the state was substantially
transferred to the less financially fortunate.</p>
<p>In 2017, the legislature threw in their cards and repealed the tax cuts, overriding Brownback’s veto.</p>
<p>While this was a terrible experience for most Kansans, it is historically useful, because whenever you encounter a
tax-cut nut (probably self-interestedly wealthy) you can say “But, Kansas!” Having said that, there are still plenty of
those nuts, and they’ll tell you that the Kansas experiment failed because of one fine-tuning effort or another. That’s a position
that’s hard to defend, though.</p>
<h2 id='p-3'>Sidebar: Trans oppression too</h2>
<blockquote><p>Before I move onto the AI angle, I gotta pause to acknowledge this week’s news story about the Kansas
government’s vicious, brutal, and ignorant
<a href="https://www.theguardian.com/us-news/2026/feb/26/kansas-trans-drivers-license-law-assault-on-rights">assault on trans
people</a>. To be clear, I think the shitty people who hate trans folk are aren’t necessarily the same shitty people as the shitty
people who don’t want to contribute to the public good. But, something about Kansas seems to attract both
flavors.</p></blockquote>
<h2 id='p-2'>The GenAI experiment</h2>
<p>The core value proposition of contemporary AI technology is exactly what Dorsey seems to think: Fire half your
employees and profits will soar! If that’s true, the trillion dollars or so invested so far will seem like small potatoes. Since
we don’t know if
this will actually work, anyone who actually does it is conducting an experiment. Just like Sam Brownback did.
Unsurprisingly, the investor class loves this experiment and is putting their money on it working.</p>
<p>To be fair, voices have been raised to argue that the tech sector is a special case: That following on
feverish over-hiring during the Covid lockdown, they need to slash headcount anyhow, and are using AI as an excuse.
For example
<a href="https://daringfireball.net/linked/2026/02/27/block-layoffs">John Gruber</a>.</p>
<p>I personally
am unconvinced, but even if they’re right, it’s irrelevant. The shareholding class won’t be able to see past that 24% payoff. So
as of today, they’ll be yelling at every CEO on the planet to start pulling the mass-firing trigger. Or else.</p>
<p>I think I know how the experiment will turn out. Just like in Kansas, it’s not going to be fun.</p>
</div></content></entry>
<entry>
<title>Crocuses of 2026</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/02/24/Crocuses-of-2026' />
<link rel='replies' thr:count='0' type='application/xhtml+xml' href='/ongoing/When/202x/2026/02/24/Crocuses-of-2026#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/02/24/Crocuses-of-2026</id>
<published>2026-02-24T12:00:00-08:00</published>
<updated>2026-02-26T13:46:17-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Photos' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Photos' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I’ve run early-spring pictures of these little purple guys almost every year since this blog’s birth in early 2003. Except for last year. Because <a href='/ongoing/When/202x/2025/02/28/Moved'>we moved</a> and the new place didn’t have any. Only now it does, and they’re (just barely) up. <i>[Update: Up and open, too.]</i></div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>I’ve run early-spring pictures of these little purple guys almost every year since this blog’s birth
in early 2003. Except for last year. Because
<a href="/ongoing/When/202x/2025/02/28/Moved">we moved</a> and the new place didn’t have any. Only now it does, and they’re
(just barely) up. <i>[Update: Up and open, too.]</i></p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56234.png" alt="Crocuses of February 2026" />
<p>Long-time followers may note that they’re pale and fragile compared to the exuberant blossoms of previous
years. Not sure why, but our new place faces north and there’s this enormous
<a href="https://en.wikipedia.org/wiki/Fraxinus_americana">White Ash</a> tree right in front of it, so they’re not getting as
much sun as at the south-facing former joint.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56235.png" alt="Crocuses of February 2026" />
<p>And also this is their first spring. We bought the bulbs and hired a professional with the right tools to jam them
into the earth last autumn, between the big tree’s roots. So they really haven’t had a chance to get their own root systems going.</p>
<p>And finally, it really is the first day that’s bright and warm enough to get out the camera. Maybe they’ll
be better in another few days. And quite likely next Spring.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56244.png" alt="Crocuses of February 2026" />
<p>This would be the place to introduce whatever metaphor this year’s blossoms, fighting their way through the leaf cover in
chilly air toward the sun, fit into, but I’m not gonna.</p>
<p>I, like many, am
<a href="/ongoing/When/202x/2023/10/25/Wild-World">not dealing very well</a> with what I see when I look at the world in either
the big or the ultra-local landscapes.
The world in tough shape and its worst people are making it worse.
People I love are in ugly corners and not finding help.</p>
<p>But you know, the flowers, in their low-key way, look great and so does the tree, still in wintersleep. Today the
sun was shining on them. It’ll be warmer and nicer soon.</p>
<p>Metaphors can go to hell. It’s just late-winter light on pale violet petals. Enjoy the moments you have with it.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56249.png" alt="Spring crocus, now open for business" />
<div class='caption'><p>Update: Now open for business.</p></div>
</div></content></entry>
<entry>
<title>Open Source and GenAI?</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion' />
<link rel='replies' thr:count='2' type='application/xhtml+xml' href='/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion</id>
<published>2026-02-16T12:00:00-08:00</published>
<updated>2026-02-18T13:41:14-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I’ve been puttering away on my <a href='/ongoing/What/Technology/Quamina%20Diary/'>Quamina</a> project since 2023. In the last few weeks GenAI has intervened. <a href='/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1'>Quamina + Claude, Case 1</a> describes a series of Claude-generated human-curated PRs, most of which I’ve now approved and merged. <a href='/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2'>Quamina + Claude, Case 2</a> considers <a href='https://github.com/baldawarishi/quamina-rs'>quamina-rs</a>, a largely-Claude-driven port from Go to Rust. Both of these stories seem to have happy endings and negligible downsides. So empirically, I <em>can</em> apply LLM technology usefully to software development. But should I?</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>I’ve been puttering away on my
<a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a> project since 2023. In the last few weeks GenAI
has intervened.
<a href="/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1">Quamina + Claude, Case 1</a> describes a series of
Claude-generated human-curated PRs, most of which I’ve now approved and merged.
<a href="/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2">Quamina + Claude, Case 2</a> considers
<a href="https://github.com/baldawarishi/quamina-rs">quamina-rs</a>, a largely-Claude-driven port from Go to Rust.
Both of these stories seem to have happy endings and negligible downsides. So empirically, I <em>can</em> apply LLM
technology usefully to software development. But should I?</p>
<h2 id='p-3'>Conclusions 1: Burn it with fire?</h2>
<p>Let me be clear: In the big GenAI picture, I’m a contra. Why? I’ll pass the mike to Baldur Bjarnason, my
favorite among GenAI’s blood enemies.:
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">“AI” is a dick move</a>.
His tl;dr is something like “GenAI is environmentally devastating and has the goal of throwing millions of
knowledge workers onto the street and is being sold by the worst people and is used for horrible applications and will increase
society’s already-intolerable level of inequality!” To which I reply “Yes, yes, yes, yes, and yes.”</p>
<p>At the end of the day, the business goal of GenAI is to boost monopolist profits by eliminating decent jobs, and
damn the consequences. This is a horrifying prospect (although I’m somewhat comforted by my belief that it basically won’t
work and most of the investment capital is heading straight down the toilet).</p>
<p>But. All that granted, there’s a plausible case, specifically in software development, for exempting LLMs from this
loathing.</p>
<p>First of all, size.
<a href="https://www.jetbrains.com/lp/devecosystem-data-playground/#global_population">JetBrains thinks</a> that
the world has 21 million or so software developers, i.e. less than 1% of the earth’s working population.
Vanishingly small in the context of the lunatic tsumani of LLM overinvestment.
Training and operating the models required for a market this small is
rounding error measured on the Great GenAI Overbuild scale. There aren’t enough geeks to create a detectable bump in the global
carbon load.</p>
<p>Another odious aspect of LLMs is
<a href="https://en.wikipedia.org/wiki/Reinforcement_learning_from_human_feedback">RLHF</a>, “Reinforcement Learning From Human
Feedback”, which relies on underpaying Third-Worlders to
polish the models’ outputs.
My guess is that much less is required for code-oriented LLMs.
The combination of the compiler and your unit tests provide good starter guardrails. Then skilled
professional intervention is required to deal with the remaining misfires, as with those Quamina PRs.</p>
<p>Finally, it seems making billionaires into multibillionaires is intrinsic to GenAI dreams. But software-development tools won’t
do that. Once again, the market is just too small. But even if it weren’t, consider this from Steve Yegge:</p>
<blockquote><p>For
<a href="https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163">this blog post</a>, “Claude Code” means “Claude Code and
all its identical-looking competitors”, i.e. Codex,
Gemini CLI, Amp, Amazon Q-developer ClI, blah blah, because that’s what they are. Clones.</p></blockquote>
<p>(GenAI, overbuilding wherever you look.) None of these products have moats and the chance that any of them become
extractive monopolies is about zilch. Nobody’s ever built a major cash-cow on developer tooling</p>
<p>One reason is (*gasp*) Open Source. Does anybody doubt that in the near future, there will
be entirely open-source versions of what Yegge means by “Claude”?</p>
<p>So, if you want to condemn the use of GenAI in software development, I think you need arguments other than the fact that
it’s also being promoted for societally-toxic business purposes.</p>
<p>I have a few. But stand by, let me push that on the stack and turn to
technology for a bit.</p>
<h2 id='p-4'>Conclusions 2: Engineering sanity?</h2>
<p>Question: Can LLMs even participate in quality software engineering?
Baldur doesn’t think so: “The gigantic, impossible to review, pull requests. Commits that are
all over the place. Tests that don’t test anything. Dependencies that import literal malware. Undergraduate-level security
issues. Incredibly verbose documentation completely disconnected from reality.”</p>
<p>I’m not saying that these pathologies can’t or don’t happen. But in my personal experience with Quamina, they
didn’t. (Mind you, it’s a hobby project.)</p>
<p>And when they do happen, I would assume that mature open-source projects will use a network of
trust, as big operations like Linux already do. PRs that don’t have the imprimatur of someone known to be clueful will be ignored.
When I saw the first of those incoming Quamina PRs, I took the time for a serious look because I knew Rob and had seen evidence that he
was technically competent. If I see an incoming PR that’s nontrivial and from some rando and doesn’t pass a 120-second sanity
check, it’s unlikely to get any more attention.</p>
<p>In fact, some essentials don’t change. If you’re not requiring that PRs be clean and
test coverage be good and code reviews not be skipped and dependencies be curated, you’re going to get a lousy result whether
the upstream code is coming from a human or an LLM.</p>
<p>But it’d be naive to think that a big change in the
shape of that upstream isn’t going to affect the profession.</p>
<h2 id='p-9'>Bottlenecks</h2>
<p>Speaking from personal experience, reviewing the PRs from Claude&Rob was neither faster nor slower, easier nor harder,
than what I’m used to pre-GenAI. The number of my disagreements with the diffs, and the amount of arguing it took to resolve
them, was also about as usual.
Which creates a big problem. Because if we can generate code a whole lot faster but review doesn’t
speed up, all we’ve done is moved the bottleneck in the system.</p>
<p>Speaking of which, Armin Ronacher offers
<a href="https://lucumr.pocoo.org/2026/2/13/the-final-bottleneck/">The Final Bottleneck</a>, from which: “When one part of the
pipeline becomes dramatically faster, you need to throttle input.” Think about that.</p>
<h2 id='p-10'>Burnout</h2>
<p>Meanwhile, evidence is piling up that LLM-based software development is driving
developers to overwork and burnout. Here’s
<a href="https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it">a cool-eyed take</a> from <cite>Harvard Business
Review</cite>. Then there’s Steve Yegge’s frantic, overly-long
<a href="https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163">The AI Vampire</a>. But my favorite, and I think a
must-read, is Siddhant Khare’s
<a href="https://siddhantkhare.com/writing/ai-fatigue-is-real">AI fatigue is real and nobody talks about it</a>.
From which: “AI reduces the cost of production but increases the cost of coordination, review, and decision-making. And those
costs fall entirely on the human.”</p>
<p>The argument we’re hearing is that GenAI makes development more efficient. And more efficient is better.
<a href="https://www.tbray.org/ongoing/When/202x/2020/07/05/Too-Efficient">Until it’s not</a>.</p>
<p>I’m not sure the profession I joined last century would attract me today. And on Mastodon,
<a href="https://cosocial.ca/@gordwait/116082229876399512">@GordWait said</a> “At our office, we are
noticing a huge drop in Comp Sci co-op applications. The next generation is convinced there’s no future in programming thanks to
AI hype.”</p>
<h2 id='p-11'>Can and should</h2>
<p>Here’s another conundrum. Suppose we <em>can</em> build a whole lot more stuff, faster. <em>Should</em> we? I don’t know about you,
but I am regularly enraged at tools that work just fine popping up “wonderful new features” modals in front of what I’m
trying to get accomplished. Also at damaging UI churn, driven by product managers trying to get promoted. It’s
just not obvious
that speeding up software development is, in the big picture, a good thing.</p>
<p>And I can’t help noting that every attempt to measure the productivity boost due to GenAI has shown zero (or worse)
improvement. Of course, Claude’s cheering section will point out that those studies date to 2024 which is the stone age. Maybe
they’re right.</p>
<h2 id='p-8'>Vampires</h2>
<p>(In which I once again go all
<a href="/ongoing/When/202x/2023/01/16/Class-Reductionism">class-reductionist</a>.) The real problem here is late-stage
capitalism, and I think is best addressed in Yegge’s <cite>AI Vampires</cite> piece, from which I quote:
“…dollar-signs appear in their <i>[employers’]</i> eyeballs, like cartoon bosses. I know that look. There’s no reasoning with
the dollar-eyeball stare.” Yeah.</p>
<p>Thus the ancient question: <i>cui bono?</i> Assuming GenAI genuinely boosts productivity, who gets the
benefits? Because the ownership class sure doesn’t think they should go to their newly-more-efficient employees.</p>
<h2 id='p-7'>But, what do I know?</h2>
<p>I know that you gotta have test coverage or your software is an unmaintainable tangle of festering tech debt. I know you gotta
have code review or your quality is on inexorable downhill drift. I <em>don’t</em> know how to build LLMs into a sane,
sustainable software engineering culture. Nor what to do
about capitalism’s AI Vampires.</p>
<p>And I absolutely do <em>not</em> believe the wild-eyed claims of 10× productivity gains, assuming we demand (as we should) that
they’re sustainable at scale.</p>
<p>So, would I advise executives to tell software engineering shops to discard their
culture in favor of vibe coding in the expectation of monstrous productivity wins? Nope.
<a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">Vibe engineering</a>, maybe.
<a href="https://locusmag.com/feature/commentary-cory-doctorow-reverse-centaurs/">Centaurs, not reverse centaurs</a>? Indeed.</p>
<p>But would I say “Stay away, don’t even look”? Nope. I’d probably suggest pointing the LLM at well-delimited non-strategic
issues and
optimizations, and emphasize no shortcuts on reviewing or CI/CD standards.</p>
<p>Also note that the GenAI apostles are at one in saying that this year’s tools are <em>so</em> much better than last year’s,
and next year’s are guaranteed to be qualitatively still better! So why would you rush in and risk getting locked into
soon-to-be-outmoded tooling?</p>
<p>Rob Sayre wrote “I would never bother to type out these patches by hand. But I read them all.” I probably wouldn’t have
either and I read them too. And now Quamina is roughly twice as fast. Which is to say, I got good results on a hobby
project. That’s not nothing.</p>
<p>But, also not conclusive.
Once the AI bubble pops and we’ve recovered from the systemic damage, I think there’ll <em>probably</em> be a place for
open-source LLM automation in developer toolkits.</p>
<p>But maybe not. Wouldn’t surprise me much, either way.</p>
</div></content></entry>
<entry>
<title>Quamina + Claude, Case 2</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2' />
<link rel='replies' thr:count='0' type='application/xhtml+xml' href='/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2</id>
<published>2026-02-14T12:00:00-08:00</published>
<updated>2026-02-14T12:00:00-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'><a href='/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1'>Last time out</a> I described a bunch of incremental-improvement <a href='/ongoing/What/Technology/Quamina%20Diary/'>Quamina</a> PRs from a colleague working with Claude Opus. Today I want to talk about Rishi Baldawa’s <a href='https://github.com/baldawarishi/quamina-rs'>quamina-rs</a>, a Claude-based port of Quamina from Go to Rust. The next post is about where I stand on GenAI and code</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p><a href="/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1">Last time out</a> I described a bunch of incremental-improvement
<a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a> PRs
from a colleague working with Claude Opus. Today I want to talk about Rishi Baldawa’s
<a href="https://github.com/baldawarishi/quamina-rs">quamina-rs</a>, a Claude-based port of Quamina from Go to Rust.
The next post is about where I stand on GenAI and code.</p>
<p>Anybody who cares about this kind of thing will appreciate Rishi’s write-ups, starting with
<a href="https://rishi.baldawa.com/posts/the-agents-kept-going/">The Agents Kept Going</a> (also see
<a href="https://rishi.baldawa.com/posts/scaffolding-for-agent-velocity/">Scaffolding for Agent Velocity</a>).
He doesn’t just say what he did, he draws lessons; good ones, I think.</p>
<h2 id='p-1'>Background</h2>
<p>Rishi and I worked together at AWS, can’t remember the details, but after I left he took over what we called Ruler, now known
as <a href="https://github.com/aws/event-ruler">aws/event-ruler</a>, Quamina’s ancestor. At the time I left it had been adopted
by quite a number of AWS and Amazon services and various instances were processing, in aggregate, a remarkable number of
millions of events per second. So he knows the territory.</p>
<p>As for quamina-rs, go read his blogs. I’ve got little to add, but here are a couple of juicy quotes: “…at some point while I was
mindlessly kicking off these sessions, the agents started picking up open issues from the Go version and implementing them on
their own.“ Also, “And I think that’s the thing worth saying plainly. It’s human to care. Agents don’t care. Automation doesn’t
care. They need to be told what to care about, and even then they’ll misbehave the moment you look away…”</p>
<p>Both these stories ended with useful results.
So empirically, you can get useful results by applying GenAI to the process of code construction.</p>
<p>Yay. I guess. But there are a lot of smart people who think this whole LLM-fueled coding direction is irremediably toxic.
<a href="/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion">I’m not sure they’re wrong</a>.</p>
</div></content></entry>
<entry>
<title>Quamina + Claude, Case 1</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1' />
<link rel='replies' thr:count='0' type='application/xhtml+xml' href='/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1</id>
<published>2026-02-06T12:00:00-08:00</published>
<updated>2026-02-06T12:00:00-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>With 47 years of coding under my belt, and still a fascination for the new shiny, obviously I’m interested what role (if any) GenAI is going to play in the future of software. But not interested enough to actually acquire the necessary skills and try it out myself. Someday, someday. Didn’t matter; two other people went ahead without asking and applied Claude to my current code playground, <a href='/ongoing/What/Technology/Quamina%20Diary/'>Quamina</a>. Here’s the first story. I’m going to go ahead and share it even though it will make people mad at me</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>With 47 years of coding under my belt, and still a fascination for the new shiny, obviously I’m interested what role (if any)
GenAI is going to play in the future of software. But not interested enough to actually acquire the necessary skills and
try it out myself. Someday, someday. Didn’t matter; two other people went ahead without asking and applied Claude to my current
code playground, <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a>. Here’s the first story. I’m going to go
ahead and share it even though it will make people mad at me.</p>
<h2 id='p-1'>Why share?</h2>
<p>Because our profession’s debate on this topic is simultaneously ridiculous and toxic. No meaningful dialogue seems possible
between the
<a href="https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04">Gas Town</a>-and-<a href="https://en.wikipedia.org/wiki/Moltbook">Moltbook</a>
faction and the
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">“AI” is a dick move</a> camp.
So, I’m not going to join in today. This is pure anecdata: What happened when Rob applied Claude to Quamina. I’m going to
avoid rhetoric (in the linguistic sense, language designed to convince) and especially polemic (language designed to
attack). I promise to have conclusions before too long, just not today.</p>
<h2 id='p-2'>What happened was…</h2>
<p>There’s this guy
<a href="https://github.com/sayrer">Rob Sayre</a>, I’ve known him for many years, even been in the same room once or twice,
in the context of IETF work. I’ve never previously collaborated on code with him. Starting in
mid-January, he’s sent
<a href="https://github.com/timbray/quamina/issues?q=is%3Apr%20author%3Asayrer">a steady flow of PRs</a>, most of which I
eventually accept and merge.</p>
<p>The net result is that Quamina is now roughly twice as fast on several benchmarks designed to measure typical tasks.</p>
<h2 id='p-3'>Technical details</h2>
<p>The details of what Quamina is and does are in the
<a href="https://github.com/timbray/quamina?tab=readme-ov-file#quamina">README</a>. For this discussion, let’s ignore everything
except to say that it’s a Go library and consider its two most important APIs. <code>AddPattern()</code> adds a Pattern (literal or
regexp) to an instance, and
<code>MatchesForEvent</code> considers a JSON blob and reports back which Patterns it matched. It’s really fast and the
relationship is pleasingly weak between the number of Patterns that have been added and the matching speed.</p>
<p>Quamina is based around finite automata (both deterministic and nondeterministic) and the rest of this technical-details
section will throw around NFA and DFA jargon, sorry about that.</p>
<p>For code like this that is neither I/O-bound nor UI-centric, performance is really all about choosing the right
algorithms. Once you’ve done that, it’s mostly about memory management. Obviously in Quamina, the <code>AddPattern</code> call
needs to allocate memory to hold the finite automata. But I’d like it if the <code>MatchesForEvent</code> didn’t.</p>
<p>Go’s only built-in data structures are “map” i.e. hash table, and “slice” i.e. appendable array. (For refugees from Java, with
its dozens of flavors of lists and hashes, this is initially shocking, but most Go fans come to the conclusion that Go is right
and Java is wrong.)
In really well-optimized
code, you’d like to see all the time spent either in your own logic or in appending to slices and updating maps.</p>
<p>In less-well-optimized code, the profiler will show you spending horrifying amounts of time in runtime routines whose names
include “malloc”, and in the garbage collector.
Now, both maps and slices grow automatically as needed, which is nice, except when you’re trying to minimize allocation.
It turns out that slices have a <b>capacity</b>, and as long as the number of things you append is less than the capacity, you won’t
allocate, which is good. Thus, there are two standard tricks in the inventory of 100% of people who’ve optimized Go code:</p>
<ol>
<li><p>When you make a new slice, give it enough capacity to hold everything you’re going to be adding to it. Yes, this can
be hard because you’re probably using it to store input data of unpredictable size, thus…</p></li>
<li><p>After you’ve made a new slice, keep it around, clear it after each input record, and its capacity will naturally grow
until it gets to be big enough that it fits all the rest of the records, then you’ll never allocate again.</p></li>
</ol>
<h2 id='p-4'>Those PRs</h2>
<p>Background: Quamina is equipped with what I think is a pretty good unit-test suite, and multiple benchmarks.</p>
<p>I started getting Rob’s PRs and initially, 100% of them were finding ways along both of those well-trodden map-and-slice
paths, in places where I hadn’t noticed the opportunity. They were decent PRs, well-commented, sensible code, no loss of test
coverage. After I asked to see benchmark runs to prove the gains weren’t just theoretical, they started including benchmark runs. I’ve
found a few things to push back on but Rob and I had no problem sorting those out.</p>
<p>At the end of the day I had no qualms about merging them, but I did find myself wondering how they were built. So I
asked.</p>
<h2 id='p-6'>Workflow</h2>
<p>Rob had told me right away on the first one that these were substantially Claude-generated. I asked him for his workflow and part
of what he said was “I might say
‘let's do some profiles of memory and CPU on this benchmark, on main and on this branch.’ It will come up with good and bad
ideas, then I pick them.”</p>
<p>Also: “What might be counter-intuitive is that I can context switch really quickly with it. So, you leave a comment, and I
just tell Claude to fix that, because you are correct. Sometimes I go in and hand edit, but usually it gets close or perfect
(what they call a "one-shot"). But I just have the conversation open, so I just pick up where we left off.”</p>
<p>Here’s a sample of Claude talking to Rob. You may have to enlarge it.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2026/02/06/claude-says.png" alt="Dialogue with Claude" />
<h2 id='p-7'>Not just the same-old</h2>
<p>Then I got a surprise, because Claude and Rob spotted two pretty big improvements that aren’t on the standard list.
First: To traverse an NFA, for each state you have to compute its “epsilon closure”, the set of other states you can get to
transitively following epsilon transitions. I had already built a cache so that as you computed them, they got remembered.
C&R pointed out “Epsilon closures are a property of the automaton structure, not the input data. Once a pattern is added and the
NFA is built, the epsilon closure for any given state is fixed and never changes.” So you might as well compute it and save it
when you build the NFA.</p>
<p>This is even better than it sounds, because (for good reasons following from Quamina’s concurrency model) my closure
caches were per-thread, while the new epsilon closures were global, stored just once for all the threads. Not bad, and not trivial.</p>
<p>Second, when you’re computing those closures, you have to memo-ize the key functions to avoid getting caught in NFA loops.
I’d done this with a set, which in Go you implement as <code>map[whatever]bool</code>. R&C figured out that if you gave each
state a “closure generation” integer field and maintained a global closure-generation value, you could dodge the necessity for the
set at the cost of one integer per state. The benchmarks proved it worked.</p>
<p>As I wrote this piece,
<a href="https://github.com/timbray/quamina/pull/491">another PR arrived</a> with a stimulating title: “kaizen: allocation-free
on the matching path”.</p>
<h2 id='p-5'>Kaizen?</h2>
<p>It’s
<a href="https://en.wikipedia.org/wiki/Kaizen">the idea that</a> you make things substantially better by successively introducing
small improvements. We try to
use the term to tag Quamina PRs that change no semantics but just make performance better or more reliable or whatever.</p>
<h2 id='p-8'>But GenAI is bad!?!</h2>
<p>Yes, so they say. Go re-read that
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">dick-move</a> polemic.</p>
<p>But, I’m going to leave this little case study conclusion-free for a bit because there are two follow-up pieces.
Next,
<a href="/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2">the story of quamina-rs</a>, a Claude-drive port of Quamina to Rust.
Finally, <a href="/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion">Open Source and GenAI?</a>.</p>
<!--
<p>You say “But GenAI is environmentally devastating and has the goal of throwing millions of knowledge workers onto the street
and is being sold by the worst people and used for horrible applications and will increase society’s already-intolerable level
of inequality!” And I
reply “Yes, yes, yes, yes, and yes.” But I’m talking about the software sector here.
<a href="https://www.jetbrains.com/lp/devecosystem-data-playground/#global_population">JetBrains thinks</a> that the world has
21 million or so software developers. The notion that this is a market that could justify the lunatic wave of investment thrown
at GenAI is laughable. Training and operating the models required to support things like Claude will be rounding error in the
scale of the Great GenAI Overbuild. The world can afford it.</p>
<h2 id='p-9'>A prediction</h2>
<p>Let me quote Yegge:</p>
<blockquote><p>For this blog post, “Claude Code” means “Claude Code and all its identical-looking competitors”, i.e. Codex,
Gemini CLI, Amp, Amazon Q-developer ClI, blah blah, because that’s what they are. Clones.</p></blockquote>
<p>GenAI, overbuilding wherever you look. But anyhow, none of these products have moats and the chance that any of them become
dominant enough to serve as the basis for an extractive monopoly rounds to zero. Nobody’s ever built a huge cash-cow company
bsaed on selling tools to developers. One reason is (*gasp*) Open Source. Does anybody doubt that in the near future, there will
be entirely open-source versions of what Yegge means by “Claude”?</p>
-->
</div></content></entry>
<entry>
<title>Long Links</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/02/03/Long-Links' />
<link rel='replies' thr:count='0' type='application/xhtml+xml' href='/ongoing/When/202x/2026/02/03/Long-Links#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/02/03/Long-Links</id>
<published>2026-02-03T12:00:00-08:00</published>
<updated>2026-02-04T14:41:25-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
<category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Welcome to the first <cite>Long Links</cite> of this so-far-pretty-lousy 2026. I can’t imagine that anyone will have time to take in all of these, but there’s a good chance one or two might brighten your day</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Welcome to the first <cite>Long Links</cite> of this so-far-pretty-lousy 2026. I can’t imagine that anyone will have time to
take in all of these, but there’s a good chance one or two might brighten your day.</p>
<h2 id='p-17'>Unclassified</h2>
<p>Thomas Piketty is always right. For example,
<a href="https://thomaspiketty.wordpress.com/2026/02/03/europe-a-social-democratic-power/">Europe, a social-democratic
power</a>.</p>
<p>Lying is wrong. Conservatives
<a href="https://thetyee.ca/Opinion/2026/02/02/Today-Conservatives-Misinformation-Norm/">do it all the time</a>. To be fair,
that piece is about the capital-C flavor, as in the Canadian Tories. But still.</p>
<p>Clothing is open-source: “If you slice the different parts off with a seamripper, lay them all down, trace them on new
fabric, cut them out, and stitch them back together, you can effectively clone and fork
garments.” From
<a href="https://wiki.xxiivv.com/site/devine_lu_linvega.html">Devine Lu Linvega</a>.</p>
<p>The Universe is weird. The Webb telescope keeps showing astronomers things that shouldn’t be there. For example,
<a href="https://www.nature.com/articles/s41586-025-09973-1">An X-ray-emitting protocluster at z ≈ 5.7 reveals rapid structure
growth</a>; ignore the title and read the Abstract and Main sections. With pretty pictures!</p>
<h2 id='p-2'>Music</h2>
<p>One time in Vegas, I was giving a speech, something about cloud computing, and was surprised to find the venue an ornate
velvet-lined theater. I found out from the staff, and then relayed to the audience, that the last human before me to stand on this stage
in front of an audience had been Willie Nelson. I was tempted to fall to my knees and kiss the boards.
<a href="https://www.newyorker.com/magazine/2025/12/29/willie-nelson-profile">How Willie Nelson Sees America</a>, from <cite>The
New Yorker</cite>, is subtitled “On the road with the musician, his band, and his family” but it ends up being the kernel of a
good biography of an interesting person. Bonus link; on YouTube,
<a href="https://www.youtube.com/watch?v=3WIR3Riq4wM">Willie Nelson - Teatro, featuring Daniel Lanois & Emmylou Harris,
Directed by Wim Wenders</a>. Strong stuff.</p>
<p>Speaking of recorded music, check out
<a href="https://www.dazeddigital.com/music/article/69407/1/why-listening-parties-are-everywhere-right-now-rosalia-album-launch-artist">Why
listening parties are everywhere right now</a>. Huh? They are? As a deranged audiophile, sounds like my kind of thing. I’d go.</p>
<h2 id='p-4'>Somewhere to put worker bees</h2>
<p>When I was working at AWS in downtown Vancouver back starting in 2015, a lot of our junior engineers lived in these
teeny-tiny little one-room-tbh apartments. It worked out pretty well for them, they were affordable and an easy walk from the
office and these people hadn’t built up enough of a life to need much more room.
For a while this trend of
so-called-“studio” flats was the new hotness in Vancouver and I guess around quite a bit of the developed world.
Us older types with families would look at the
condo market and tell each other “this is stupid”.</p>
<p>We were right. The
bottom is falling out and they’re sitting empty in their thousands. And not just the teeniest either, the whole
condo business is in the toilet. It didn’t help that for a few years all the prices went up every year (until they didn’t) and
you could make serious money flipping unbuilt condos, so lots of people did (until they didn’t).</p>
<p>Anyhow, here’s a nice write-up on the subject:
<a href="https://www.bbc.com/news/articles/cqxq32zzq8eo">‘Somewhere to put worker bees’: Why Canada's micro-condos are losing
their appeal</a>. (From the BBC, huh?)</p>
<h2 id='p-5'>AI AI AI</h2>
<p>Sorry, I can’t not relay pro- and anti-GenAI posts, because that conversation is affecting all our lives just now. I am
actually getting ready to decloak my own conclusions, but for the moment I’m just sharing essays on the subject that strike me as
well-written and enjoyable for their own sake. Thus
<a href="https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/">‘AI' is a dick move, redux</a> from Baldur
Bjarnason. Boy, is he mad.</p>
<p>Sam Ruby has been doing some
<a href="https://intertwingly.net/blog/2026/01/28/Twilight-Zone.html">extremely weird shit</a>, running Rails in the browser, as
in without even a network connection or a Ruby runtime. Yes, AI was involved in the construction.</p>
<h2 id='p-6'>Software</h2>
<p>There’s this programming language called Ivy that is in the APL lineage; that acronym will leave young’uns blank but a few greying
eyebrows will have been raised. Anyhow,
<a href="https://commandcenter.blogspot.com/2026/01/implementing-transcendental-functions.html?m=1">Implementing the
transcendental functions in Ivy</a> is delightfully geeky, diving deep with no awkwardness. By no less than Rob Pike.</p>
<p>Check out Mike Swanson’s
<a href="https://blog.mikeswanson.com/backseat-software/">Backseat Software</a>. That’s “backseat” as in “backseat driver”,
which today’s commercial software has now, annoyingly, become. This piece doesn’t make any points that I haven’t heard (or made
myself) elsewhere, but it pulls a lot of the important ones together in a well-written and compelling package. Recommended.</p>
<p>Old Googler Harry Glaser
<a href="https://www.linkedin.com/posts/harryglaser_i-worked-on-ads-at-google-15-years-ago-when-activity-7423057144402427905-nm3p/">reacts
with horror</a> to the introduction of advertising by OpenAI, and makes gloomy predictions about how it will evolve. His predictions
are obviously correct.</p>
<p>The title says it:
<a href="https://petapixel.com/2026/01/17/discovering-a-digital-photo-editing-workflow-beyond-adobe/">Discovering a Digital
Photo Editing Workflow Beyond Adobe</a>. It’d be a tough transition for me, but the relationship with Adobe gets harder and
harder to justify.</p>
<h2 id='p-7'>Indigenous reconciliation</h2>
<p>Khelsilem is one of the loudest and clearest voices coming out of the Squamish nation, one of the larger and better-organized
Indigenous communities around here.</p>
<p>There has been a steady drumbeat of Indigenous litigation going on for decades as a
consequence of the fact that the British colonialists who seized the territory in what we now call British Columbia didn’t
bother to sign treaties with the people who were already there, they just assumed ownership. The Indigenous people have been
winning a lot of court cases, which makes people nervous.</p>
<p>Anyhow, Khelsilem’s
<a href="https://khelsilem.substack.com/p/the-source-of-the-reconciliation">The Real Source of Canada's Reconciliation Panic</a>
covers the ground. I’m pretty sure British Columbians should read this, and suspect that anyone in a jurisdiction undergoing similar
processes should too.</p>
<h2 id='p-8'>Resonant computing, Black and Blue sky</h2>
<p>There’s this thing called the
<a href="https://resonantcomputing.org">Resonant Computing Manifesto</a>, whose authors and signatories include names you’d
probably recognize. Not mine; the first of its Five Principles begins with “In the era of AI…” Also, it is entirely oblivious to
the force driving the enshittification of social-media platforms: Monopoly ownership and the pathologies of late-stage
capitalism.</p>
<p>Having said that, the vision it paints is attractive. And having said <em>that</em>, it’s now featured on the flags waved by
the proponents of ATProto, which is to say Bluesky. See Mike Masnick’s
<a href="https://www.techdirt.com/2026/01/27/atproto-the-enshittification-killswitch-that-enables-resonant-computing/">ATproto:
The Enshittification Killswitch That Enables Resonant Computing</a> (Mike is on Bluesky Corp’s Board). That piece is OK but, in
the comments, Masnick quickly gets snotty about the Fediverse and Mastodon, in a way that I find really off-putting. And once
again, says nothing about the underlying economic realities that poison today’s platforms.</p>
<p>I want to like Bluesky, but I’m just too paranoid and cynical about money. It is entirely unclear who is funding the people
and infrastructure behind Bluesky, which matters, because if Bluesky Corp goes belly-up, so does the allegedly-decentralized service.</p>
<p>On the other hand,
<a href="https://blackskyweb.xyz">Blacksky</a> is interesting. They are trying to prove that ATProto really can be made
decentralized in fact not just in theory.
<a href="https://blackskyweb.xyz/overview/">Their ideas and their people</a> are stimulating, and their
<a href="https://opencollective.com/blacksky">finances are transparent</a>. I’ll be
<a href="https://docs.blacksky.community/migrating-to-blacksky-pds-complete-guide">moving my ATProto presence to Blacksky</a>
when I get some cycles and the process has become a little more automated.</p>
<h2 id='p-14'>Good crypto</h2>
<p>The cryptography community is working hard on the problem of what happens should quantum computers ever become real products as
opposed to over-invested fever dreams. Because if they ever work, they can probably crack the algorithms that we’ve been using
to provide basic Web privacy.</p>
<p>The problem is technically
hard<span class='dashes'> —</span> there are good solutions though<span class='dashes'> —</span> and also politically fraught,
because maybe the designers or standards orgs are corrupt or incompetent. It’s reasonable to worry about this stuff and people
do. They probably don’t need to: Sophie Schmieg dives deep in
<a href="https://keymaterial.net/2025/11/27/ml-kem-mythbusting/">ML-KEM Mythbusting</a>.</p>
<h2 id='p-16'>Books</h2>
<p>Here’s one of the most heartwarming things I’ve read in months:
<a href="https://blog.openlibrary.org/2026/01/30/a-community-curated-nancy-drew-collection/">A Community-Curated Nancy Drew
Collection</a>. Reminder: The Internet can still be great.</p>
<p>John Lanchester’s
<a href="https://www.lrb.co.uk/the-paper/v46/n17/john-lanchester/for-every-winner-a-loser">For Every Winner a Loser</a>,
ostensibly a review of two books about famous financiers, is in fact an extended howl of
(extremely instructive) rage against the
financialization of everything and the unrelenting increase in inequality. What we need to do is to take the ill-gotten gains
away from these people and put it to a use<span class='dashes'> —</span> any use<span class='dashes'> —</span> that improves
human lives.</p>
<p>I talk a lot about late-stage capitalism. But Sven Beckert published a
<a href="https://www.nytimes.com/2025/11/26/books/review/capitalism-sven-beckert.html?searchResultPosition=1">1,300-page monster entitled <cite>Capitalism</cite></a>;
the link is to a <cite>NYT</cite> review and makes me want to read it..</p>
<p>Charlie Stross, the sci-fi author, likes webtoons and
<a href="https://www.antipope.org/charlie/blog-static/2025/12/webtoons-revisited.html">recommends a bunch</a>. Be careful, do
not follow those links if you’re already short of time. Semi- or fully-retired? Go ahead!</p>
<p>I have history with dictionaries. For several years of my life in the late Eighties, I was the research project manager for
the
<a href="https://cs.uwaterloo.ca/~fwtompa/newoed-project.html">New Oxford English Dictionary</a> project at the University of
Waterloo. Dictionaries are a fascinating topic and, for much of the history of the publishing industry, were big money-makers;
they dominate any short list of the biggest-selling books in history. Then came the Internet.</p>
<p>Anyhow, Louis Menand’s
<a href="https://www.newyorker.com/magazine/2025/12/29/unabridged-the-thrill-of-and-threat-to-the-modern-dictionary-stefan-fatsis-book-review">Is
the Dictionary Done For?</a> starts with a review of a book by Stefan Fatsis entitled <cite>Unabridged: The Thrill of (and
Threat to) the Modern Dictionary</cite> which I haven’t read and probably won’t, but oh boy, Menand’s piece is big and rich and
polished and just a fantastic read. If, that is, you care about words and languages. I understand there are those who don’t, which is
weird. I’ll close with a quote from Menand:</p>
<blockquote><p>“The dictionary projects permanence,” Fatsis concludes, “but the language is Jell-O, slippery and mutable and
forever collapsing on itself.” He’s right, of course. Language is our fishbowl. We created it and now we’re forever trapped
inside it.</p></blockquote>
</div></content></entry>
<entry>
<title>Quamina v2.0.0</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/01/20/Quamina-2.0' />
<link rel='replies' thr:count='1' type='application/xhtml+xml' href='/ongoing/When/202x/2026/01/20/Quamina-2.0#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/01/20/Quamina-2.0</id>
<published>2026-01-20T12:00:00-08:00</published>
<updated>2026-01-21T15:27:06-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>There’ve been a few bugfixes and optimizations since 1.5, but the headline is: <a href='https://github.com/timbray/quamina?tab=readme-ov-file#quamina'>Quamina</a> now knows regular expressions. This is roughly the fourth anniversary of the first check-in and the third of v1.0.0. (But I’ve been distracted by family health issues and other tech enthusiasms.) Open-source software, it’s a damn fine hobby</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>There’ve been a few bugfixes and optimizations since 1.5, but the headline is:
<a href="https://github.com/timbray/quamina?tab=readme-ov-file#quamina">Quamina</a>
now knows regular expressions. This is roughly the fourth anniversary of
the first check-in and the third of v1.0.0. (But I’ve been distracted by family health issues and
other tech enthusiasms.)
Open-source software, it’s a damn fine
hobby.</p>
<p>Did I mention optimizations? There are <i>(sob)</i> also regressions; introducing REs had
measurable negative impacts on other parts of the system.
But it’s a good trade-off. When you ship software that’s designed for pattern-matching, it should
really do REs. The RE story, about a year long, can be read starting
<a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series">here</a>.</p>
<h2 id='p-4'>Quamina facts</h2>
<ol>
<li><p>About 18K lines of code (excluding generated code), 12K of which are unit tests. The RE feature makes the tests run
slower, which is annoying.</p></li>
<li><p>Adding Quamina to your app will bulk your executable size up by about 100K, largely due
to Unicode tables.</p></li>
<li><p>There are a few shreds of AI-assisted code, none of much importance.</p></li>
<li><p>A Quamina instance can match incoming data records on my 2023 M2 Mac at millions per
second without much dependence on how many patterns are being matched at once. This assumes
not too many horrible regular expressions. That’s per-thread of course, and Quamina does
multithreading nicely.</p></li>
</ol>
<h2 id='p-1'>Next?</h2>
<p>The
<a href="https://github.com/timbray/quamina/issues">open issues</a> are modest in number but
some of them will be hard.</p>
<p>I think I’m going to ignore that list for a while (PRs welcome, of course) and work on
optimization. The introduction
of epsilon transitions was required for regular expressions, but they really bog the matching
process down. At Quamina’s core is the
<a href="/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata">finite-automaton merge</a> logic,
which contains fairly elegant code but generally throws up its hands when confronted with
epsilons and does the simplest thing that could possibly work. Sometimes at an annoyingly slow pace.</p>
<p>Having said that, to optimize you need a good benchmark that pressures the
software-under-test.
Which is tricky, because Quamina is so fast that it’s hard to
to feed it enough data to stress it without the feed-the-data code dominating
the runtime and memory use. If anybody has a bright idea for how to pull together a good
benchmark I’d love to hear it. I’m looking at
<a href="https://go.dev/blog/testing-b-loop">b.Loop()</a> in Go 1.24, any reason not to go there?</p>
<h2 id='p-3'>Book?</h2>
<p>It occurs to me that as I’ve wrestled with the hard parts of Quamina, I’ve done the obvious
thing and trawled the Web for narratives and advice. And, more or less, been disappointed. Yes,
there are many lectures and blogs and so on about this or that aspect of finite automata, but
they tend to be mathemagical and theoretical and say little about how, practically speaking,
you’d write code to do what they’re talking about.</p>
<p>The Quamina-diary <span class='o'>ongoing</span> posts now contain several tens of thousands
of words. Also I’ve previously written
<a href="/ongoing/When/200x/2006/04/18/XML-Grammar">quite a bit</a> about Lark, the world’s
first XML parser, which I wrote and was automaton-based. So I think there’s a case for a slim
volume entitled something like <cite>Finite-state Automata in the Code Trenches</cite>. It’d be
a big money-maker, I betcha. I mean, when Apple TV brings it to the screen.</p>
<h2 id='p-2'>Why?</h2>
<p>Let’s be honest. While
<a href="https://github.com/timbray/quamina">the repo</a> has quite a few stars, I truly have no idea who’s
using Quamina in production. So I can’t honestly claim that this work is making the
world better along any measurable dimension.</p>
<p>I don’t much care because I just can’t help it. I love executable abstractions for their own sake.</p>
</div></content></entry>
<entry>
<title>Losing 1½ Million Lines of Go</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/01/14/Unicode-Properties' />
<link rel='replies' thr:count='1' type='application/xhtml+xml' href='/ongoing/When/202x/2026/01/14/Unicode-Properties#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/01/14/Unicode-Properties</id>
<published>2026-01-14T12:00:00-08:00</published>
<updated>2026-01-14T15:52:47-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Confession: My title is clickbait-y, this is really about building on the Unicode Character Database to support character-property regexp features in <a href='https://github.com/timbray/quamina'>Quamina</a>. Just halfway there, I’d already got to 775K lines of generated code so I abandoned that particular approach. Thus, this is about (among other things) <em>avoiding</em> those 1½M lines. And really only of interest to people whose pedantry includes some combination of Unicode, Go programming, and automaton wrangling. Oh, and GenAI, which (*gasp*) I think I should maybe have used</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Confession: My title is clickbait-y, this is really about building on the Unicode Character Database to support
character-property regexp features in
<a href="https://github.com/timbray/quamina">Quamina</a>.
Just halfway there, I’d already got to 775K lines of generated code so I abandoned that particular approach. Thus, this
is about (among other things) <em>avoiding</em> those 1½M lines. And really only of interest to people whose
pedantry includes some combination of Unicode, Go programming, and automaton wrangling. Oh, and GenAI, which (*gasp*) I
think I should maybe have used.</p>
<h2 id='p-1'>Character property matching</h2>
<p>I’m talking about regexp incantations like <code>[\p{L}\p{Zs}\p{Nd}]</code>, which matches anything that Unicode classifies
as a letter, a space, or a decimal number. (Of course, in Quamina “<code>\</code>” is “<code>~</code>”
<a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#p-7">for excellent reasons</a>, so that reads
<code>[~p{L}~p{Zs}~p{Nd}]</code>.)</p>
<p>(I’m writing about this now because I just launched
<a href="https://github.com/timbray/quamina/pull/465">a PR</a> to enable this feature. Just one more to go before I can
release a new version of Quamina with full regexp support, yay.)</p>
<h2 id='p-3'>Finding the properties</h2>
<p>To build an automaton that matches something like that, you have to find out what the character properties are.
This information comes from the
<a href="https://www.unicode.org/ucd/">Unicode Character Database</a>, helpfully provided online by the Unicode consortium.
Of course, most programming languages have libraries that will help you out, and
<a href="https://pkg.go.dev/unicode#pkg-variables">that includes Go</a>, but I didn’t use it.</p>
<p>Unfortunately, Go’s library doesn’t get updated every time Unicode does. As of now, January 2026,
it’s still stuck at Unicode 15.0.0, which
<a href="https://www.unicode.org/history/publicationdates.html">dates to September 2023</a>; the latest version is 17.0.0, last
September. Which means there are plenty of Unicode characters Go doesn’t know about, and I didn’t want Quamina to settle
for that.</p>
<p>So, I fetched and parsed the famous master file from
<a href="https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt">www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt</a>.
Not exactly rocket science, it’s a flat file with <code>;</code>-delimited fields, of which I only cared about the first
and third. There are some funky bits, such as the pair of nonstandard lines indicating that the Han characters occur
between U+4E00 and U+9FFF inclusive; but still not really taxing.</p>
<p>The output is, for each Unicode category, and also for each category’s complement (<code>~P{L}</code> matches everything
that’s <em>not</em> a letter; note the capital <code>P</code>), a list of pairs of code points, each pair indicating a subset
of the code space where that category applies. For example, here’s the first line of character pairs with category <code>C</code>.</p>
<pre><code> {0x0020, 0x007e}, {0x00a0, 0x00ac}, {0x00ae, 0x0377},</code></pre>
<p>How many pairs of characters, you might wonder? There are 37 categories
and it’s all over the place but adds up to a lot. The top three categories
are L with 1,945 pairs, Ll at 664, and M at 563. At the other end are Zl and Zp, both with just 1.
The total number of pairs is 14,811, and the generated Go code is a mere 5,122 lines.</p>
<h2 id='p-5'>Character-property automata</h2>
<p>Turning these creations into finite automata was straightforward: I already had the code to handle regexps like
<code>[a-zA-Z0-9]</code>, logically speaking the same problem. But, um, it wasn’t fast. My favorite unit test, an exercise in
<a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1">sample-driven development</a> with 992 regexps,
suddenly started taking multiple seconds, and my whole unit-test suite expanded from around ten seconds to over twelve; since I
tend to run the unit tests every time I take a sip of coffee or scratch my head or whatever, this was painful. And it occurred to
me that it would be painful in practice to people who want for some good reason or another to load up a bunch of
Unicode-property patterns into a Quamina instance.</p>
<p>So, I said to myself, I’ll just precompute all the automata and serialize them into code. And now we
get to the title of this essay; my data structure is a bit messy and ad-hoc and just for the categories, before I got to the
complement versions, I was generating 775K lines of code.</p>
<p>Which worked! But, it was 12M in size and while Go’s runtime is fast, there was a painful pause while it absorbed those data
structures on startup. Also, opening the generated file regularly caused my IDE
(<a href="https://www.jetbrains.com/go/">Goland</a>) to crash. And I was only halfway there. The whole approach was painful to
work with so I went looking for Plan B.</p>
<p>The code that generates the automaton from the code point pairs is pretty well the simplest thing that could possibly work
and it was easy to understand but burned memory like crazy. So I worked for a bit on making it faster and
cheaper, but so far have found no low-hanging fruit.</p>
<p>I haven’t given up on that yet. But in the meantime, I remembered
Computer Science’s general solution for all performance problems, by which I mean caching. So now, any Quamina instance will
compute the automaton for a Unicode property the first time it’s used, then remember it. So now Quamina’s speed at adding
Unicode-property regexps to an instance has increased from 135/second to 4,330, a factor of thirty and Good Enough For
Rock-n-Roll.</p>
<p>It’s worth pointing out that while <em>building</em> these automata is a heavyweight process, Quamina can use them to match
input messages at its typical rates, hundreds of thousands to millions per second. Sure, these automata are “wide”, with lots of
branches, but they’re also shallow, since they run on UTF-8 encoded characters whose maximum length is four and average length
is much less. Most times you only have to take one or two of those many branches to match or fail.</p>
<h2 id='p-2'>Should I have used Claude?</h2>
<p>This particular segment of the Quamina project included some <em>extremely</em> routine programming tasks, for example
fetching and parsing
UnicodeData.txt, computing the sets of pairs, generating Go code to serialize the automata, reorganizing source files that had
become bloated and misshapen, and writing unit tests to confirm the results were correct.</p>
<p>Based on my own
<a href="/ongoing/When/202x/2025/07/01/First-AI-Code">very limited experience</a> with GenAI code, and in particular after
reading Marc Brooker’s
<a href="https://brooker.co.za/blog/2025/12/16/natural-language.html">On the success of ‘natural language programming’</a> and
Salvatore (“antirez”) Sanfilippo’s
<a href="https://antirez.com/news/158">Don't fall into the anti-AI hype</a>, I guess I’ve joined the camp that thinks
this stuff is going to have a place in most developers’ toolboxes.</p>
<p>I think Claude could have done all that boring stuff, including acceptable unit tests, way faster than I did.
And furthermore got it right the first time, which I didn’t.</p>
<p>So why didn’t I use Claude? Because I don’t have the tooling set up and I was impatient and didn’t want to invest the time in
getting all that stuff going and improving my prompting skills. Which reminds me of all the times I’ve been trying to evangelize other
developers on a better way to do things and was greeted by something along the lines of “Fine, but I’m too busy right now, I’ll
just going on doing things the way I already know how to.”</p>
<p>Does this mean I’m joining the “GenAI is the future and our investments will pay off!” mob? Not in the slightest. I still
think it’s overpriced, overhyped, and mostly ill-suited to the business applications that “thought leaders” claim for it.
That word “mostly” excludes the domain of code; as I said
<a href="/ongoing/When/202x/2025/09/26/GenAI-Predictions#p-5">here</a>, “It’s pretty obvious that LLMs are better at predicting code
sequences than human language.”</p>
<p>And, as it turns out, the domain of Developer Tools has never been a Big Business by the standards of GenAI’s promoters. Nor
will it ever be; there just aren’t enough of us. Also, I suspect it’ll be reasonably easy in the near future for open-source
models and agents to duplicate the capabilities of Claude and its ilk.</p>
<p>Speaking personally, I can’t wait for the bubble to pop.</p>
<h2 id='p-4'>Quamina.next?</h2>
<p>After I ship the numeric-quantifier feature, e.g. <code>a{2-5}</code>, Quamina’s regexp support will be complete and if no
horrid bugs pop up I’ll pretty quickly release Quamina 2.0. Regexps in pattern-matching software are a qualitative difference-maker.
After that I dunno, there are lots more interesting features to add.</p>
<p>Unfortunately, a couple years into my Quamina work, I got distracted by life and by other projects, and ignored it. One
result is that so did the other people who’d made major contributions and provided PR reviews. I miss them and it’s less fun
now. We’ll see.</p>
</div></content></entry>
<entry>
<title>Regexp Lessons</title>
<link href='https://www.tbray.org/ongoing/When/202x/2026/01/01/Quamina-2026' />
<link rel='replies' thr:count='1' type='application/xhtml+xml' href='/ongoing/When/202x/2026/01/01/Quamina-2026#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2026/01/01/Quamina-2026</id>
<published>2026-01-01T12:00:00-08:00</published>
<updated>2026-01-06T10:19:29-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I’m just landing a <a href='https://github.com/timbray/quamina/pull/461'>chonky PR</a> in <a href='https://github.com/timbray/quamina'>Quamina</a> whose effect is to enable the <code>+</code> and <code>*</code> regexp features. As in my <a href='/ongoing/When/202x/2025/07/21/Automaton-merge-war'>last chapter</a>, this is a disorderly war story not an essay, and probably not of general interest. But as I said then, the people who care about coercing finite automata into doing useful things at scale are My People (there are <em>dozens</em> of us)</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>I’m just landing a
<a href="https://github.com/timbray/quamina/pull/461">chonky PR</a> in
<a href="https://github.com/timbray/quamina">Quamina</a> whose effect is to enable the <code>+</code> and <code>*</code> regexp
features. As in my
<a href="/ongoing/When/202x/2025/07/21/Automaton-merge-war">last chapter</a>, this is a disorderly war story not an essay, and
probably not of general interest. But
as I said then, the people who care about coercing finite automata into doing useful things at scale are My People (there are
<em>dozens</em> of us).</p>
<h2 id='p-5'>2014-2026</h2>
<p>As I write this, I’m sitting in the same couch in my Mom’s living room in Saskatchewan where, on my first Christmas after
joining AWS, I got the first-ever iteration of this software to work. That embryo’s mature form is available to the world as
<a href="https://github.com/aws/event-ruler">aws/event-ruler</a>. (Thanks, AWS!) Quamina is its direct descendent, which means
this story is entering its twelfth year.</p>
<p>Mom is now 95 and good company despite her failing memory. I’ve also arrived at a qualitatively later stage of life than in
2014, but would like to report back from this poorly-lit and often painful landscape: Executable abstractions are still fun,
even when you’re old.</p>
<p>Anyhow, the reason I’m writing all this stuff isn’t to expound on the nature of finite automata or regular expressions, it’s
to pass on lessons from implementing them.</p>
<h2 id='p-8'>Lesson: Seek out samples</h2>
<p>In a previous episode I used the phrase
<a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1">Sample-driven development</a> to describe my luck in
digging up 992 regexp test cases, which reduced task task from intimidating to approachable.
I’ve never previously had the luxury of wading into a big software task armed with loads of test cases written by other
people, and I can’t recommend it enough. Obviously you’re not always going to dig this sort of stuff up, but give it a sincere
effort.</p>
<h2 id='p-9'>Lesson: Break up deliverables</h2>
<p>I decomposed regular expressions into ten unique features, created an enumerated type to identify them, and implemented them
by ones and twos.
Several of the feature releases used
techniques that turned out to be inefficient or just wrong when it came to subsequent features. But they worked,
they were useful, and my errors nearly all taught me useful lessons.</p>
<p>Having said that, here’s some cool output that combines this lesson and the one above, from the unit test that runs
those test cases. Each case has a regexp then one
or more samples each of strings that should and shouldn’t match. I instrumented the test to report the usage of regexp features
in the match and non-match cases.</p>
<pre>Feature match test counts:
32 '*' zero-or-more matcher
27 () parenthetized group
48 []-enclosed character-class matcher
7 '.' single-character matcher
29 |-separated logical alternatives
16 '?' optional matcher
29 '+' one-or-more matcher
Feature non-match test counts:
45 '+' one-or-more matcher
24 '*' zero-or-more matcher
31 () parenthetized group
49 []-enclosed character-class matcher
6 '.' single-character matcher
32 |-separated logical alternatives
21 '?' optional matcher</pre>
<p> Of course, since most of the tests combine multiple features, the numbers for all the features
get bigger each time I implement a new one. Very confidence-building.</p>
<h2 id='p-2'>Lesson: Thompson’s construction</h2>
<p>This is the classic nineteen-sixties regular-expression implementation by Ken Thompson, described in Wikipedia
<a href="https://en.wikipedia.org/wiki/Thompson%27s_construction">here</a> and (for me at least) more usefully, in a
storytelling style by Russ Cox,
<a href="https://swtch.com/%7Ersc/regexp/regexp1.html">here</a>.</p>
<p>On several occasions I rushed ahead and implemented a feature without checking those sources, because how hard could it be?
In nearly every case, I had problems with that first cut and then after I went and consulted the oracle, I could see where I’d
gone wrong and how to fix it.</p>
<p>So big thanks, Ken and Russ.</p>
<h2 id='p-3'>Lesson: List crushing</h2>
<p>In some particularly nasty regular expressions that
combine <code>[]</code> and <code>?</code> and <code>+</code> and <code>*</code>, you can
get multiple states connected in complicated ways with epsilon links.</p>
<p>In Thompson’s Construction, traversing an NFA transitions not just from one state to another but from a current set of states
to a next set, repeat until you match or fail. You also compute epsilon closures as you go along; I’m skipping over details
here. The problem was that traversing these pathologically complex regexps with a sufficiently long string was leading to an
exponential explosion in the current-states and next-states sizes<span class='dashes'> —</span> not a figure of speech, I mean
<code>O(2<sup>N</sup>)</code>. And despite the usage of the word “set” above, these weren’t, they contained endless
duplicates.</p>
<p>The <em>best</em> solution would be to study the traversal algorithm and improve it so it didn’t emit fountains of dupes. That
would be hard. The next-best would to turn these things into actual de-duped sets, but that would require a hash table right in
the middle of the traversal hot spot, and be expensive.</p>
<p>So what I did was to detect whenever the next-steps list got to be longer than N, sorted it, and crushed out all the dupes.
As I write, N is now 500 based on running benchmarks and finding a value that makes number go down.</p>
<p>The reason this is good engineering is that the condition where you have to crush the list almost never happens, so in the
vast majority of cases the the only cost is an <code>if len(nextSteps)>N</code> comparison. Some may find this approach
impure, and they have a point. I would at some point like to go back and find a better upstream approach. But for now it’s still
really fast in practice, so I sleep soundly.</p>
<h2 id='p-4'>Lesson: Hell’s benchmark</h2>
<p>I’ve
<a href="/ongoing/When/202x/2025/07/21/Automaton-merge-war#p-1">written before</a> about my struggles with the benchmark where I
merge 12,959 wildcard patterns together. Back before I was doing epsilon processing correctly, I had a kludgey implementation
that could match patterns in the merged FA at typical Quamina speeds, hundreds of thousands per second. With correct epsilon
general-purpose epsilon handling, I have so far not been smart enough to find a way to preserve that performance. With the full
13K patterns, Quamina matches at less than 2K/second, and with a mere thousand, at 16K/second. I spent literally days
trying to get better results, but decided that it was more valuable to Quamina to handle a large subset of regular expressions
correctly than to run idiotically large merges at full speed.</p>
<p>I’m pretty sure that given enough time and consideration, I’ll be able to make it better. Or maybe someone else who’s smarter
than me can manage it.</p>
<h2 id='p-11'>Question: What next?</h2>
<p>The still-unimplemented regexp features are:</p>
<pre>{lo,hi} : occurrence-count matcher
~p{} : Unicode property matcher
~P{} : Unicode property-complement matcher
[^] : complementary character-class matcher</pre>
<p>Now I’m wondering what to do next. <code>[^]</code> is pretty easy I think and is useful, also I get to invert a
state-transition table. The
<code>{lo,hi}</code> idiom shouldn’t be hard but I’ve been using regexps for longer than most of you have been alive and have
never felt the need for it, thus I don’t feel much urgency. The Unicode properties I think have a good fun factor just because
processing the Unicode character database tables is cool. And, I’ve used them.</p>
<p><i>[Update: the <code>[^]</code> thing took a grand total of a couple of hours to build and test. Hmm, what next?]</i></p>
<h2 id='p-10'>Lesson: Coding while aging</h2>
<p>I tell people I keep working on code for the sake of preserving my mental fitness. But mostly I do it for fun. Same for
writing about it. So, thanks for reading.</p>
</div></content></entry>
<entry>
<title>Humanist Plumbing</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/12/18/Humanist-Plumbing' />
<link rel='replies' thr:count='5' type='application/xhtml+xml' href='/ongoing/When/202x/2025/12/18/Humanist-Plumbing#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/12/18/Humanist-Plumbing</id>
<published>2025-12-18T12:00:00-08:00</published>
<updated>2025-12-20T10:40:20-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Business' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Business' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>What happened was, a faucet started dripping. And then I managed to route around the malignant machineries of late-stage capitalism. These days, that’s almost always a story worth telling</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>What happened was, a faucet started dripping. And then I managed to route around the malignant machineries of late-stage
capitalism. These days, that’s almost always a story worth telling.</p>
<p>Normally, faced with a drip,
we’d pull out the old cartridge, take it to the hardware store, and buy another to swap in.
But the fixture in our
<a href="/ongoing/When/202x/2025/02/28/Moved">recently-acquired</a> place was kind of exotic and abstract and neither of us
could figure it out. We were gloomy because we’ve had terrible luck over the years with the local plumbing storefronts.
So…</p>
<h2 id='p-1'>The neighbors</h2>
<p>Our neighborhood has an online chat; both sides of the streets in a square around a single city block. This is our first
experience with such a thing. I gather that these don’t always work out well, but this one has been mostly pretty great.</p>
<p>So at 9AM I posted “Hey folks, looking for a plumber recommendation” and by ten there were three.</p>
<p><i>[Late-stage capital: “You’re supposed to ask the AI in your browser. It’ll
provide a handy link to a vendor based on geography and reviews but mostly advertising spend.
Why would you want to talk to other people?”]</i></p>
<h2 id='p-2'>Thomas</h2>
<p>I picked a neighbor’s suggestion, first name
Thomas, and called the number. “Thomas here” on the second ring. I explained and he said “What’s the brand name? If
it’s one of those Chinese no-names I probably have to replace the whole thing.” I said “No idea, but I’ll take a picture and send it to
you.”</p>
<p>Turns out the brand was
<a href="https://riobel.design/en/">Riobel</a>, never heard of them. I texted Thomas a picture and he got right back to me: “That’s
high-end, it’s got a lifetime warranty. I’ll come by a little after 5 and take it out. Their dealer is in PoCo (an outer suburb)
and I live out there, so I can swap it.”</p>
<p><i>[Late-stage capital: “You’re supposed to engage with the chatbot on the site we sent you to, which will integrate with your
calendar and arrange for a diagnostic visit a week from Wednesday. You could call them but you’d be in voice-menu hell and
eventually end up at the same chatbot.”]</i></p>
<p>When Thomas showed up, with a sidekick, he was affable and obviously competent.
Within five minutes I was glad I’d called for help; that faucet’s construction was highly non-obvious. Thomas knew what he was
doing and it still took him the best part of a half-hour to get it all disassembled and the cartridge extracted.</p>
<h2 id='p-6'>Nothing’s perfect</h2>
<p>The next morning, a text from Thomas: “Bad news. That part is back-ordered till May at Riobel’s dealer. We can maybe get it
online but you’d have to pay.” He attached a screenie of a Web search for the part number; there were several online
vendors.</p>
<p>It’s irritating that the “lifetime warranty” doesn’t seem to be helping me, but to be fair, the part was initially installed
in 2011.</p>
<p><i>[Late-stage capital: “Lifetime warranty? Huh? Oh, of course you mean our VIP-class
subscription offering, that’s monthly with a
discount for annual up-front payment.”</i> (And the part would still be back-ordered.)]</p>
<h2 id='p-3'>Kolani</h2>
<p>High-end plumbing parts are expensive. But one of Thomas’ recommendations,
<a href="https://kolani.ca">Kolani Kitchen and bath</a>, was asking less.</p>
<p>They had a phone number on their
Web site so I called it and the voice menu only had three options: Location, opening hours, and Operator.
The operator was an intelligent human and picked up right away.
“Hi, I’m looking at ordering a cartridge and wanted to see if you had it in stock.” “Gimme the part number?” I
did and she went away for a couple of minutes and came back “Yeah, it’s in stock.” So I ordered it and I have a tracking
number.</p>
<p><i>[Late-stage capital: “There aren’t supposed to be independent dealers; the manufacturer has taken PE money and eliminated
the middlemen to better capture all the value-add.
Or maybe there’ll be a wholesaler, but just one, because another PE rolled up all the distributors to maximize pricing power.
Either way, you won’t be able to get a human on the line.”]</i></p>
<h2 id='p-7'>Payment</h2>
<p>Next morning, I got an email that my order had been canceled. So I called that intelligent operator and she said “I was going
to email you. Our system won’t take payment if the billing and delivery addresses are different. Sorry. If you’re in a hurry you
could do an e-transfer?” (In Canada, all the banks are in a payments federation that makes this dead easy.) So I
did and the part has shipped.</p>
<p><i>[Late-stage capital: “What? If you’d used our Integrated online payment offering, it would all just work. What if it
doesn’t, you ask? Yeah, sucks to be you in that situation, of course there’d be nobody you could talk to about that.”]</i></p>
<p>Thomas came by again to put the old cartridge back in for now and said “This thing, don’t worry about a drip, it’s not fast
and it probably won’t get worse. Text me when the new part gets in.”</p>
<h2 id='p-5'>Late-stage capitalism</h2>
<p>It won’t be missed when it’s gone.</p>
</div></content></entry>
<entry>
<title>After the Bubble</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble' />
<link rel='replies' thr:count='7' type='application/xhtml+xml' href='/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble</id>
<published>2025-12-07T12:00:00-08:00</published>
<updated>2025-12-09T15:29:05-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>The GenAI bubble is going to pop. Everyone knows that. To me, the urgent and interesting questions are how widespread the damage will be and what the hangover will feel like. On that basis, I was going to post a link on Mastodon to Paul Krugman’s <a href='https://paulkrugman.substack.com/p/talking-with-paul-kedrosky'>Talking With Paul Kedrosky</a>. It’s great, but while I was reading it I thought “This is going to be Greek to people who haven’t been watching the bubble details.” So consider this a preface to the Krugman-Kedrosky piece. If you already know about the GPU-fragility and SPV-voodoo issues, just skip this and go read that</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>The GenAI bubble is going to pop. Everyone knows that. To me, the urgent and interesting questions are how widespread the
damage will be and what the hangover will feel like.
On that basis, I was going to post a link on Mastodon to Paul Krugman’s
<a href="https://paulkrugman.substack.com/p/talking-with-paul-kedrosky">Talking With Paul Kedrosky</a>. It’s great, but while I
was reading it I thought “This is going to be Greek to people who haven’t been watching the bubble details.”
So consider this a
preface to the Krugman-Kedrosky piece. If you already know about the GPU-fragility and SPV-voodoo issues, just skip this and go
read that.</p>
<h2 id='p-2'>Depreciation</h2>
<p>When companies buy expensive stuff, for accounting purposes they pretend they haven’t spent the money; instead they
“depreciate” it over a few years. That is to say, if you spent a million bucks on a piece of gear and decided to depreciate it
over four years, your annual financials would show four annual charges of $250K.
Management gets to pick your depreciation period, which provides a major opening
for creative accounting when the boss wants to make things look better or worse than they are.</p>
<p>Even when you’re perfectly honest it can be hard to choose a fair figure. I can remember one of the big
cloud vendors announcing they were going to change their fleet depreciation from three to four years and that having an impact on
their share price.</p>
<p>Depreciation is orderly whether or not it matches reality: anyone who runs a data center can tell you about racks with 20
systems in them that have been running fine since 2012. Still, orderly is good.</p>
<p>In the world of LLMs, depreciation is different. When you’re doing huge model-building tasks, you’re running
those expensive GPUs flat out and red hot for days on end. Apparently they don’t like that, and flame out way more often than
conventional computer equipment. Nobody who is doing this is willing to come clean with hard numbers but there are data points, for
example from
<a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/faulty-nvidia-h100-gpus-and-hbm3-memory-caused-half-of-the-failures-during-llama-3-training-one-failure-every-three-hours-for-metas-16384-gpu-training-cluster">Meta</a>
and (very unofficially)
<a href="https://www.tomshardware.com/pc-components/gpus/datacenter-gpu-service-life-can-be-surprisingly-short-only-one-to-three-years-is-expected-according-to-unnamed-google-architect">Google</a>.</p>
<p>So GPUs are apparently fragile. And they are expensive to run because they require huge
amounts of electricity. More, in fact, than we currently have, which is why electrical bills are spiking here and there around
the world.</p>
<p>Why does this matter? Because when the 19th-century railway bubble burst, we were left with railways. When the
early-electrification bubble burst, we were left with the grid. And when the
<a href="https://en.wikipedia.org/wiki/Dot-com_bubble">dot-com bubble</a> burst, we were left with a lot of valuable
infrastructure whose cost was sunk, in particular dark fibre. The AI bubble? Not so much; What with GPU burnout and power charges,
the infrastructure is going to be expensive to keep running, not something that new classes of application can pick up and use on
the cheap.</p>
<p>Which suggests that the post-bubble hangover will have few bright spots.</p>
<h2 id='p-1'>SPVs</h2>
<p>This is a set of purely financial issues but I think they’re at the center of the story.</p>
<p>It’s like this. The Big-Tech giants are insanely profitable but they don’t have enough money lying around to build the
hundreds of billions of dollars worth of data centers the AI prophets say we’re going to need. Which shouldn’t be a problem;
investors would line up to lend them as much as they want, because they’re pretty sure
they’re going to get it back, plus interest.</p>
<p>But apparently they don’t want to borrow the money and have the debts on their balance sheet. So they’re
setting up “Special Purpose Vehicles”, synthetic companies that are going to build and own the data centers; the Big Techs
promise to pay to use them, whether or not genAI pans out and whether or not the data centers become operational. Somehow,
this doesn’t count as “debt”.</p>
<p>The financial voodoo runs deep here. I recommend Matt Levine’s
<a href="https://newsletterhunt.com/emails/205961">Coffee pod financing</a> and the <cite>Financial Times’</cite>
<a href="https://www.ft.com/content/d0344253-b0a2-4c6d-8b97-520243678afd">A closer look at the record-smashing ‘Hyperion’
corporate bond sale</a>. Levine’s explanation has less jargon and is hilarious; the
<cite>FT</cite> is more technical but still likely to provoke horrified eye-rolls.</p>
<p>If you think there’s a distinct odor of 2008 around all this, you’d be right.</p>
<p>If the genAI fanpholks are right, all the debt-only-don’t-call-it-that will be covered by profits and everyone can sleep
sound. Only it won’t. Thus, either the debts will apply a meat-axe to Big Tech profits, or (like 2008) somehow they won’t be
paid back. If whoever’s going to bite the dust is “too big to fail”,
the money has to come from… somewhere? Taxpayers? Pension funds? Insurance companies?</p>
<h2 id='p-3'>Paul K and Paul K</h2>
<p>I think I’ve set
<a href="https://paulkrugman.substack.com/p/talking-with-paul-kedrosky">that piece</a> up enough now. It points out a few other
issues that I think people should care about. I have one criticism: They argue that genAI won’t produce sufficient revenue from
consumers to pay back the current investment frenzy. I mean, they’re right, it won’t, but that’s not what the investors are
buying. They’re buying the promise, not of <em>more revenue</em>, but of <em>higher profits</em> that happen when tens of
millions of knowledge workers are replaced by (presumably-cheaper) genAI.</p>
<p>I wonder who, after the loss of those tens of millions of high-paid jobs, are going to be the
consumers who’ll buy the goods that’ll drive the profits that’ll pay back the investors. But that problem is kind of
intrinsic to Late-stage Capitalism.</p>
<p>Anyhow, there will be a crash and a hangover. I think the people telling us that genAI is the future and we
must pay it fealty richly deserve their impending financial wipe-out.
But still, I hope the hangover is less terrible than I think it will be.</p>
</div></content></entry>
<entry>
<title>Tracy Numbers</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics' />
<link rel='replies' thr:count='2' type='application/xhtml+xml' href='/ongoing/When/202x/2025/12/02/Bell-Combinatorics#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics</id>
<published>2025-12-02T12:00:00-08:00</published>
<updated>2025-12-02T12:00:00-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Music' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Music' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking a class in Afro-Cuban rhythms from <a href='https://drumming.ca'>Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the basics of Afro-Cuban are the <a href='https://en.wikipedia.org/wiki/Bell_pattern'>Bell Patterns</a>, which come straight out of Africa. The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It feels like it’s in four, particularly when played fast</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking
a class in Afro-Cuban rhythms from
<a href="https://drumming.ca">Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the
basics of Afro-Cuban are the
<a href="https://en.wikipedia.org/wiki/Bell_pattern">Bell Patterns</a>, which come straight out of Africa.
The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of
three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It
feels like it’s in four, particularly when played fast.</p>
<p>Here’s the standard bell pattern in music notation. Instead of one 12/8 bar, I’ve broken it into four 3/8 chunks. Let’s call
those “mini-measures”; I’ll use that or just “minis” in the rest of this piece.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern" />
<div class='caption'><p><audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.m4a"></audio></p></div>
<p>Bell patterns are never played in isolation, but circularly on fast repeat, so the first note immediately follows
the last.</p>
<p>In the sound sample, I’m playing a background beat on a conga, emphasizing the beginning of the 12/8 measures.
The actual bell pattern is on the high “child” bell of a
<a href="https://en.wikipedia.org/wiki/Ewe_drumming#Gankogui">Gankoqui</a>, an African dual-cowbell set.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/PXL_20251201_192632520.png" alt="Black cat considers a Gankoqui" />
<div class='caption'><p><a href="/ongoing/When/202x/2021/02/22/Meet-Thorn">“þ” the cat</a> was trying bell patterns but
unfortunately<br/>cats can’t count as high as 12. Collar by
<a href="https://www.birdsbesafe.com">BirdsBeSafe.com</a>.</p></div>
<p>That’s my Gankoqui.
I bought it off someone on Etsy who imports them from Ghana.
It came with that little thin stick that sounds nice, but sometimes I use a regular drumstick when things get loud.</p>
<h2 id='p-1'>The problem</h2>
<p>Russell’s a good teacher and the standard pattern isn’t that tricky, but I just couldn’t get a grip on it.
It’s a little harder than it looks what with cycling it really fast, and then
you’re playing it against complicated music with other instrumental voices.
I probably would have got there, but the lessons ran out of gas in the depths of Covid.</p>
<h2 id='p-2'>Introducing Tracy</h2>
<p>She was Russell’s long-time partner, a good person and good drummer too. When you were struggling
with a complex rhythm it was helpful to watch Tracy’s hands, because she was <em>always</em> on the beat.</p>
<p>Tracy lived with stage four metastatic cancer for many years and braved endless awful rounds of therapy while remaining generally
cheerful. She could be morbidly funny; I bought her congas (you can hear one behind the beat in the samples) when she had a
storage-space problem. She told me she was carefully planning her finances so she’d run out of money just before the cancer got
her.</p>
<p>I always enjoyed any time I spent with her. Then, a dozen years into her cancer
journey, this last summer it got into her brain and it was pretty clear her end times were upon her.</p>
<h2 id='p-3'>The hospice</h2>
<p>Tracy’s last months were spent at
<a href="https://stjohnhospice.ca">St. John Hospice</a> in Vancouver’s far west. I can’t say enough
good things about it. If you’re near Vancouver and your death becomes imminent, try to be there if you can’t be at home.
It’s comfortable and the staff are expert and infinitely kind. The rules that apply at hospices
are different from those at hospitals; for example, Tracy’s cat joined her in residency and had the run of the place.</p>
<p>I (and other fans of Russell and Tracy) visited the hospice a few times. My last visit was just days before her death
and, while she was fatigued and spaced-out, it was still Tracy.
I wasn’t close enough to call her a friend, but I miss her.</p>
<p>We got to talking about Afro-Cuban music and I laughed at myself, saying how I never could get that damn bell pattern
down. Said Russell: “Oh, you mean the standard 12/8 pattern? Tracy, let’s show him” and on the second try, they were doing it
together, just voices, <i>ta ta ta-ta, ta ta ta</i>. </p>
<p>Driving home from the hospice, I told myself that if Tracy could manage the bell pattern in her condition, I could bloody
well learn it. So I studied the details and used a metronome app and after a while
I thought I had it down pretty well.</p>
<h2 id='p-4'>Sounds cool</h2>
<p>I go to a weekly by-invitation African drum jam where I’m on the weaker end of the skill
spectrum. The first time a 12/8 came along after I thought I’d learned the pattern, I had to summon up courage
and then I fluffed the first few bars. But after a while I
was grooving along and smiling and thinking the bell sounded pretty cool against the thunder of all the djembés and dununs.</p>
<p>And, even played amateurishly, it does sound cool. Let’s have another look at the music.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern" />
<div class='caption'><p><audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.m4a"></audio></p></div>
<p>West-African drumming often tries to achieve rhythmic tension, where a given note could fit in multiple ways and your
ear is not 100% sure what’s going on. The standard pattern does this, twice.</p>
<p>Remember, I said that 12/8 sounds like it’s
“in four”, especially if you hit the first beat of each of the four mini-measures. But two of
the four minis here go around the first note, weakening the 4/4 feel.
Especially on that third mini; you can feel the beat slide by the missing “one”.</p>
<p>Also, the last three notes are evenly spaced two beats
apart, so six of them would fill the 12-beat pattern, suggesting that this might be in triple time, not 12/8.</p>
<p>The effect, to my ears, is of the bell, higher-pitched than the drums, shifting against the rhythm, or even dancing
across it. At the drum jam, at almost any given moment it won’t be just drums, one or more people will have
clave sticks or rattles or tambourines or cowbells weaving through the beat.</p>
<h2 id='p-5'>Mixing it up</h2>
<p>After I felt confident playing the standard pattern, it still sounded cool, but I wanted to branch out, not just
go around and around the same seven notes. So the first thing I did was start mixing in a few of these.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-1.png" alt="bell pattern variation" />
<div class='caption'><p><audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/5333.m4a"></audio></p></div>
<p>This repeats the second bar through the end of the phrase. In the sound sample I mix it up with the standard pattern.
It’s got less rhythmic tension but on the other hand
flows along smoothly with the drum thunder. Also you don’t have to think at all, so you can enjoy listening to what the other
people are playing.</p>
<p>Then I got a little more ambitious and reshuffled:</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-2.png" alt="bell pattern variation" />
<div class='caption'><p><audio controls="controls" src="https://www.tbray.org/ongoing/When/202x/2025/12/02/5253.m4a"></audio></p></div>
<p>The mini-measures are the same as in the standard pattern, just in a different order. Anyhow, this kind of thing is fun.</p>
<h2 id='p-6'>Combinatorics</h2>
<p>Then one evening I was lying in bed, thoughts wandering, and wondered “How many bell patterns are there?”
A little mental math showed that of course there are eight possible arrangements of tones
in a 3-note mini-measure. Here they are:</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/8-measures.png" alt="Possible arrangements of notes in 3/8 time" />
<div class='caption'><p>I’ll use the boxed numbers to identify the minis.</p></div>
<p>Why are the minis numbered in that order? Every computer programmer looking at this already knows, but for the rest of you: If the
notes are ones and the rests are zeroes, they are the eight binary numbers between zero and seven inclusive.
So each number’s binary bits show where the drumstrokes are.
By the way, numbers four through
seven have a note on the one beat, zero through three don’t.</p>
<p>Is it weird to have a zero i.e. silent mini? I don’t think so, sometimes spaces between the notes really matter.</p>
<h2 id='p-7'>Patterns</h2>
<p>Anyhow, the original question was about the number of different bell patterns. Each has four
mini-measures with 8 possible values. So the answer is 8 ⨉ 8 ⨉ 8 ⨉ 8, which is 4,096.</p>
<p>And each of them can be identified by four little numbers, ranging from T0000 (I can hear the bandleader yelling “gimme zeroes
for the sax break”) to T7777, a flurry of eighth notes that you might use in the big encore-number finish designed to leave the
audience yelling as you walk off stage. The standard bell pattern is T5325; in binary “101 011 010 101” and the 1’s are drumstrokes.
The first variation above is T5333 and the second is T5253.</p>
<p>The “T” in front of each bell pattern number is for Tracy.</p>
<p>If you go look at the
<a href="https://en.wikipedia.org/wiki/Bell_pattern">Wikipedia Bell-pattern article</a>, they emphasize that there are lots of
different patterns. Now they all have numbers! The article
<a href="https://en.wikipedia.org/wiki/Bell_pattern#128_bell_patterns">makes special mention of</a> T5124, T5221, and T5244.</p>
<h2 id='p-8'>But why, Tim?!</h2>
<p>I’m a computer programmer with a Math degree, and an amateur musician.
Anyone who thinks that these are disjoint disciplines is wrong.
And, I think the notation is (on a very small scale) kind of pleasing.</p>
<p>But the work has actually helped me.
Now that I’ve considered each mini-measure and its personality. I find all of them sneaking into
my Gankoqui excursions, which have gotten noticeably weirder, for example T5635.
Nobody’s threatened to kick me out of the jam, so far.</p>
<p>Also, this has given me a real appreciation of whoever it was that, probably thousands of years ago and certainly in Africa,
picked the “standard” pattern as, well, standard. Because it’s great.</p>
<h2 id='p-9'>What’s missing?</h2>
<p>You may have noticed that Gankoquis have two bells and I’ve been ignoring that fact. Normally you’d play these patterns
on the smaller “child” bell, but sometimes bringing the big parent bell in for a couple of strokes works
well.
<a href="https://www.youtube.com/watch?v=X2K0i8e6Ftc">Here’s an example</a> (h/t Russell).</p>
<p>Also, this discussion has been limited to 3/8 minis in 12/8 measures. There’s another whole universe of 4/4 rhythms that
also have bell patterns (but everything exists in the shadow of the
<a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave rhythm</a>).
In that world a pattern has four measures, each of which can have sixteen possible values, so there are 65,536 different ones.</p>
<p>And I could repeat the numbers construction above for 4/4. But I’m not going to, because the rewards feel smaller. In my
experience, 4/4 rhythms lope smoothly along and everyone knows where the one is even when there’s no note on it, so there’s less
ambiguity to work with.
Anyhow, any neophyte (like for example me) can play a pretty smooth bell line against 4/4; just start with
<a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave</a> and add
variations (or don’t) and you’ll be fine.</p>
<h2 id='p-10'>Useful?</h2>
<p>These numbers are just elementary mathemusical fun. If anyone else wanted to use them that’d be a pleasant surprise.
If “anyone else” is you, go ahead, but they have a name and you have to use it. These are called Tracy Numbers.</p>
<h2 id='p-11'>Colophon</h2>
<p>Music fragments by
<a href="https://www.mu.se/musescore-studio">MuseScore Studio</a>. Sound samples facilitated by GarageBand, a Shure MV51, and PSB
Alphas.</p>
</div></content></entry>
<entry>
<title>Fútbol Joy</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football' />
<link rel='replies' thr:count='1' type='application/xhtml+xml' href='/ongoing/When/202x/2025/11/23/Soccer-vs-Football#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football</id>
<published>2025-11-23T12:00:00-08:00</published>
<updated>2025-11-27T20:38:07-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Sports/Football' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Sports' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Football' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Sports/Soccer' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Soccer' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Last Saturday I had one of my peak 2025 experiences, at the <a href='https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs'>MLS semifinal</a> between the <a href='https://www.whitecapsfc.com/'>Vancouver Whitecaps FC</a> (hereinafter “Caps”) and <a href='https://en.wikipedia.org/wiki/Los_Angeles_FC'>Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”. 53,095 other fans were there with my son and I; we came home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other TV sports</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Last Saturday I had one of my peak 2025 experiences, at the
<a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">MLS semifinal</a>
between the <a href="https://www.whitecapsfc.com/">Vancouver Whitecaps FC</a> (hereinafter “Caps”) and
<a href="https://en.wikipedia.org/wiki/Los_Angeles_FC">Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”.
53,095 other fans were there with my son and I; we came
home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other TV sports.</p>
<p>Earlier this year
<a href="/ongoing/When/202x/2025/05/04/Southsiders">I wrote about becoming a Caps fan</a>. Anyone who enjoys this will probably
like that piece too.</p>
<p>Let’s set the scene with pictures.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_004124670.png" alt="Before the fútbol at the pub" />
<div class='caption'><p>Supporters gather pre-game at a nearby Irish-flavored pub.</p></div>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_011735082.png" alt="Parading from the pub to the match" />
<div class='caption'><p>Supporters march to the game.<br/>When you’re in a frivolous parade, everyone smiles<br/>at
you, even the drivers hemmed in by paraders.</p></div>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_024033770.png" alt="Whitecaps tifo banner: fire that burns / blue melts gold" />
<div class='caption'><p>The banner is what’s called a
<a href="https://en.wikipedia.org/wiki/Tifo">tifo</a>.<br/>I have to admit I failed to parse it.</p></div>
<h2 id='p-5'>The game</h2>
<p>It was 120 minutes of ridiculously over-the-top psychodrama. I was exhausted at the end.
If you want a full retrospective, type “whitecaps lafc” into any Web search to get the particulars. Or
<a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">hit
this</a>. But here’s the short version:</p>
<ol>
<li><p>The Caps came out sharp and fast and had LAFC pretty well flummoxed through most of the first half, scoring two goals,
<a href="https://www.youtube.com/watch?v=9nEOw8ckWMA">one of which was a jaw-dropper</a>.
They also managed to contain LAFC’s superstar
<a href="https://en.wikipedia.org/wiki/Son_Heung-min">Son Heung-min</a>.</p></li>
<li><p>In the second half, the visitors reconfigured and were much better. Son did the superstar thing and scored two goals,
<a href="https://www.youtube.com/watch?v=-L9N8pkrkSM">one another jaw-dropper</a>, just as the game was ending, to tie things
up.</p></li>
<li><p>The Caps lost two players, one for fouls, one to injury, and were down two men through most of overtime. LAFC’s assault
was relentless but the Caps held on, getting more than a little lucky.</p></li>
<li><p>So it went to a penalty-kick competition. Son, shockingly, missed; he was exhausted and limping. At the end of the
day the Caps scored four out of five to LAFC’s three and got the win.</p></li>
</ol>
<p>Suffice it to say that the dramatic peak wasn’t
any of the flashes of brilliance, but rather the errors that happen when people are at the limit of their endurance. Vancouver
made one fewer, that’s all there was to it.</p>
<h2 id='p-3'>That sound</h2>
<p>There’s not another like it on this planet. I mean tens of thousands of voices in a big stadium greeting a home goal.
Fútbol specifically because its goals, compared to North American sports where points come in dozens, are
such huge markers. The sound-pressure wavefront, coming from every direction, of all those inarticulate howls of joy,
all in the same tiny fraction of a second, is a whole-body experience.</p>
<h2 id='p-6'>The side effect</h2>
<p>I’ve long been a televised-sports fan; the only TV show that isn’t scripted and thus has real drama. But
since getting mixed up in fútbol, I’ve sort of gone off the other sports I used to watch. I had to think a bit to figure
out why.</p>
<p>It’s the ads. The football, basketball and hockey broadcasts screech to a halt
<a href="https://qz.com/150577/an-average-nfl-game-more-than-100-commercials-and-just-11-minutes-of-play">every ten or fewer
minutes</a> for a couple of minutes of advertising. Most of the ads are dumb, many are offensive, and the relentless
addiction-promoting gambling pitches are both. On top of which there’s the bone-headed repetition; someone somewhere thinks
I’m gonna lean toward this generic SUV as opposed to that one because of the 138th time they’ve run that commercial where hip young
people with fulfilling lives are going to have sex because of its dashboard geometry and motorized hatchback.
I mean, the other SUVs have that stuff too, but this one’s actors are more convincingly likely to be headed for bed?</p>
<p>Being in the room with this shit makes me angry even though my mute-button skillz are sharp.
The world being what it is, I really don’t need to be around something that angers me several times per hour.
So, while when young I loved playing both football and basketball, and while the pro games are good entertainment,
my patience seems to be running out.</p>
<p>Fútbol, on the other hand, has two fiftyish-minute chunks of continuous action, so you can sink into the flow of the
game. The contrast, switching back and forth between that and the other North American sports, is stark.</p>
<p>(Except for I’m mostly forgiving baseball because its natural rhythm is full of stops suitable for hot dogs and beer and
admiring cute babies and T-shirts and discussions of etymology and epidemiology. I mean, the ads are still mindless repetitive
shit, we’re just more accustomed to switching attention away when nothing’s happening.)</p>
<p>And I’m not claiming that fútbol is more virtuous or less dirty than any other sport; after all, its global
organizing body FIFA has repeatedly been exposed as
<a href="https://en.wikipedia.org/wiki/FIFA#Corruption">galactically corrupt</a>. I’m just saying it offers a better
experience.</p>
<h2 id='p-9'>Soccer?</h2>
<p>That word is an awkward invention by nineteenth-century British toffs based on abbreviating “association”. I accept that on my
continent “football” means gridiron, but people who enjoy “soccer” still say it so in print I offer “fútbol”, which is a
typographically nice little cluster; please humor me.</p>
<p>Anyhow, you might want to check out your local team; in North America, the prices are lower than the other sports, who could
be against cheap happiness with fewer gambling ads?</p>
</div></content></entry>
<entry>
<title>Long Links</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links' />
<link rel='replies' thr:count='2' type='application/xhtml+xml' href='/ongoing/When/202x/2025/11/16/Long-Links#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links</id>
<published>2025-11-16T12:00:00-08:00</published>
<updated>2025-11-19T14:20:55-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
<category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the choices will improve your day. This time out it’s almost all politics, but that’s the way the world is. And some of the politics aren’t American!</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the
choices will improve your day. This time out it’s almost all politics, but that’s the way the world is.
And some of the politics aren’t American!</p>
<p>Some of these are paywalled, sorry.
And the whole thing is kind of long so if you’re in a hurry, you might want to jump to the last section, entitled
<a href="#p-8">Wonderful things</a>.</p>
<h2 id='p-7'>Social media</h2>
<p>Here’s a real treat. Perhaps the premiere example of a blog that’s grown happily from a one-man operation to a
successful and sustainable small business would be
<a href="https://talkingpointsmemo.com">Talking Points Memo</a>. It provides what I think is about the deepest
carefully-reported coverage of the American progressive scene available anywhere. I’ve been a subscriber for years.</p>
<p>They’re celebrating their 25th anniversary and, to celebrate, have been working on a history of blogging:
<a href="https://talkingpointsmemo.com/tpm-25">Pivots, Trolls, & Blogrolls</a>.
Contributors so far: Sarah Jaffe, Matt Pearce, Brian Beutler, Kylie Cheung, Megan Greenwell, David Weigel, Jon Allsop, Adam
Mahoney, Julianne Escobedo Shepherd, Max Rivlin-Nadler, Bhaskar Sunkara, Hamilton Nolan, Ana Marie Cox, Marisa Kabas, Kelly
Weill, Aurin Squire, Marcy Wheeler, Andrew Parsons, Jeet Heer, and Sarah Posner.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/TPM.png" alt="TPM 25th anniversary series" />
<p>It’s full of razor-sharp insights and nostalgic smiles. I think it’s paywalled? If so, and if you’ve got feels about
the blog form, it’d probably be worth your while to sign up for a month just to read this collection.</p>
<p>And thanks to Josh Marshall of <cite>TPM</cite> for putting it together all these years and especially for this particular
mind candy.</p>
<h2 id='p-4'>Politics (US)</h2>
<p>The Trump administration is, generally speaking, strange.
For a terrifying trip several standard deviations off the strange end of the strangeness,
there’s
<a href="https://www.newyorker.com/magazine/2025/11/17/laura-loomers-endless-payback">Laura Loomer’s Endless Payback</a>.
At several points in my traversal of this piece I simply could not believe what I was reading. My guess is that it will
regularly be cited by historians of the 23rd century, to add spice to their narrative.</p>
<p>Many commentators on the right have been horrified at Zohran Mamdani’s New York victory, seeing him as the white-hot
pointy end of the “woke mind virus”. Well, what could be more woke, I ask, than the Department of Africana Studies at Bowdoin,
a boutique liberal-arts college in Maine?</p>
<p>Mamdani was a student there, and now the former head of said department offers us
<a href="https://lithub.com/maybe-dont-talk-to-the-new-york-times-about-zohran-mamdani/">Maybe Don’t Talk to the New York
Times About Zohran Mamdani</a>. Peter Coviello is not a moderate but is a formidable writer: “The storied choice between
socialism and barbarism was made exquisitely clear a good many years ago in the United States, and both major parties chose
barbarism.” Despite that, it’s mostly written with a light touch, often amusing. Read it.</p>
<h2 id='p-5'>Politics (Other)</h2>
<p>It’s not in the news much, but China is facing colossal economic challenges.
<a href="https://www.nytimes.com/2025/09/23/opinion/china-economy-deflation-neijuan.html">Learn about “meijuan”</a> (in English,
“involution”) which might well put the nation on the path of deflation. That’s a path that, once an economy is on it, is very
hard to get off; it took Japan decades.</p>
<p>While we’re looking at China… there used to be “Kremlinology”, a study of the entirely opaque workings of the top inner
circles of the Soviet regime. In that spirit, here’s some
<a href="https://en.wikipedia.org/wiki/Great_Hall_of_the_People">人民大会堂</a>-ology:
<a href="https://sinocism.com/p/forever-xi-jinping-perhaps-not">Forever Xi Jinping? Perhaps Not</a>.
I enjoyed it but have no idea if it’s, you know, correct. Nobody outside that inner circle does.</p>
<p>Now let’s jump seven time zones west, to France, where the redoubtable Thomas Piketty offers
<a href="https://thomaspiketty.wordpress.com/2025/11/11/le-pens-rn-has-become-the-party-of-billionaires/">Le Pen’s RN has
become the party of billionaires</a>. Unlike the Beijing piece, Piketty’s is (as usual for him) supported by concrete data and I tend
to believe it.</p>
<p>Last stop: Gaza, waiting to find out if an externally-imposed and leaky ceasefire will hold, and whether there is a path
from where they are to something better. As for “where they are”, here’s
<a href="https://www.nytimes.com/interactive/2025/10/08/opinion/gaza-strip-before-after.html">The Gaza I Knew Is
Gone</a> by Ghada Abdulfattah. It describes life’s experience for the citizens of Gaza after all these endless
months of brutality.</p>
<h2 id='p-9'>Politics (everywhere)</h2>
<p>Pope Leo’s
<a href="https://www.vatican.va/content/leo-xiv/en/apost_exhortations/documents/20251004-dilexi-te.html">Apostolic Exhortation
Dilexi Te of the Holy Father Leo XIV To All Christians On Love For The Poor</a> got a short-lived run in the headlines,
accompanied by “But that’s… socialism!” pearl-clutching from Stage Right. It deserves a read. The first three-quarters or
so are a trip through Church history, starting in Nazareth, aimed at showing that concern for the poor has always been central
to the faith. Which is fine, but eventually the Pope gets concrete about the twenty-first century, and is convincing whether or
not you believe in any gods.</p>
<p>The next section is about Tech and while
<a href="https://csrc.nist.gov/csrc/media/Presentations/2023/radical-cs/images-media/sess-1-rogaway-bcm-workshop-2023.pdf">Radical
CS</a> is a presentation from “The Third NIST Workshop on Block Cipher Modes of Operation” it’s about politics, oh yes it is. We
very much need more of this kind of thing.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/Radical-CS.png" alt="Suggestions for a radical CS" />
<h2 id='p-6'>Tech</h2>
<p>A <a href="https://infosec.exchange/@david_chisnall/115270162462304611">post from David Chisnall on Mastodon</a> contains this
gem: “Machine learning is <em>amazing</em> if … the value of a correct answer is much higher than the cost of an incorrect
answer.”
Which is one of those things that’s obviously true as soon as you hear it. The whole piece is good.</p>
<p>The churning debate around AI is full of arm-waving and relatively free of objective numerical data. So here’s Ed Zitron’s
<a href="https://www.wheresyoured.at/costs/">This Is How Much Anthropic and Cursor Spend On Amazon Web Services</a>.
And I ask: How do the people making these investments think they’re going to get their money back?</p>
<p>Speaking of things are obviously true:
<a href="https://www.newyorker.com/culture/infinite-scroll/textedit-and-the-relief-of-simple-software">TextEdit and the
Relief of Simple Software</a>. We could do so much better than we do, and in our hearts we know why we’re not, and it’s about
money and power, not technology.</p>
<p>Bluesky has brought its AT Protocol to the IETF; let’s see what happens. Here are
<a href="https://www.ietf.org/archive/id/draft-newbold-at-architecture-00.html">Authenticated Transfer: Architecture
Overview</a> and
<a href="https://www.ietf.org/archive/id/draft-holmgren-at-repository-00.html">Authenticated Transfer Repository and
Synchronization</a>. The drafts have
<a href="https://github.com/bluesky-social/ietf-drafts">source-code repos</a>.</p>
<p>Finally, here’s <a href="https://spinel.coop">Spinel</a>, which is trying to build a decentralized, transparent,
and somewhat-democratic engineering resource for the Ruby and Rails platforms. This follows on a distinctly-stinky power play where
people with money grabbed the steering wheel. Best of luck to Spinel.</p>
<h2 id='p-10'>Canadian health</h2>
<p>Canada has “single-payer” public healthcare that comes with your taxes, which in my experience works well, see
<a href="/ongoing/When/200x/2009/08/22/Alison">here</a> and
<a href="/ongoing/When/202x/2025/07/09/Saskatchewan">here.</a></p>
<p>This costs a lot of money, over $300B/year.
Predictably, there are business types panting with eagerness to get their hands on some of that
money. And they can; a lot of medical practices and clinics and labs are owned by private companies, apparently doing well while
being restricted to billing the government for the standard fees. But what they <em>really</em> want is a two-tier system where
they can directly charge rich people more for better care. It seems like every year someone thinks up a clever dodge to nibble
away at the system. Fortunately, these people have, so far, ended up losing in the courts.</p>
<p>Here’s a news story:
<a href="https://macleans.ca/society/health/ai-could-save-canadas-health-care-system/">AI Could Save Canada’s Health-Care
System</a>. It’s actually pretty coherent and I found it plausible that this technology could maybe
improve, for example, the agonizingly slow emergency-room experience.</p>
<p>But then I got curious as to the business angle and tracked the source of the story down to a business called called
<a href="https://www.getmaple.ca">maple</a>. Sure enough,
<a href="https://helpdesk.getmaple.ca/en/articles/5375023-fees-to-see-a-general-practitioner-on-maple">here they are</a> trying to
siphon off direct payments for access to doctors. I predict they’ll end up in court, and lose.</p>
<p>And then there’s the government of Alberta, run by hard-right dipshits who hate most aspects of being Canadian and loathe the
proposition that government can provide good and efficient services. Thus:
<a href="https://www.cbc.ca/news/canada/calgary/alberta-paul-parks-mri-diagnostics-adriana-lagrange-9.6952189">Alberta
government plans to allow residents to privately pay for any diagnostic or screening service</a>. Feaugh. I hope this one ends
up in court too.</p>
<h2 id='p-12'>Paying for Open Source</h2>
<p>It is coming to the world’s attention that most of our tech infrastructure is radically dependent on
open-source software maintenaned by a
cadre of developers who are old, tired, and not getting paid for their work. I have direct experience with trying unsuccessfully
to convince Big-Tech business leaders to invest in Open-Source maintenance and infrastructure. Here’s some of the coverage:</p>
<ul>
<li><p>In <cite>The Register</cite>:
<a href="https://www.theregister.com/2024/09/18/open_source_maintainers_underpaid/">Open source maintainers underpaid,
swamped by security, going gray</a>.</p></li>
<li><p>Open Source Security Foundation:
<a href="https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/">Open
Infrastructure is Not Free: A Joint Statement on Sustainable Stewardship</a>.</p></li>
<li><p>Nils Adermann:
<a href="https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/">A Call for Sustainable Open Source
Infrastructure</a>.</p></li>
<li><p>Hackernoon: <a href="https://hackernoon.com/how-can-governments-pay-open-source-maintainers">How Can Governments Pay Open Source
Maintainers?</a></p></li>
<li><p>The New Stack:
<a href="https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/">FFmpeg to Google: Fund Us or Stop Sending
Bugs</a>.</p></li>
</ul>
<p>Things obviously can’t go on as they are. The best path forward isn’t obvious to me, but we need to start finding it.</p>
<h2 id='p-11'>Economics and life</h2>
<p>Paul Krugman and Martin Wolf, two really smart guys who aren’t technologists,
<a href="https://paulkrugman.substack.com/p/talking-ai-with-martin-wolf">talk about the impact of AI</a>. Technofeudalism is
considered carefully.
My favorite out-take
is from Krugman: “[I] have come to the conclusion that anything that I want to believe about the prospects of AI and its
economic effects, all I need to do is do a little searching, and I can find some expert who will tell me whatever it is I want to
believe.” Even with that well-justified cynicism, there is deep stuff here.</p>
<p>I read Matt Levine’s newsletter almost every day; not only does it teach you things about how money makes the world go round,
it entertains; his glee at some particularly juicy financial swindle or clever arbitrage maneuver will bring a smile to your
face.
In <a href="https://newsletterhunt.com/emails/201930">Money Stuff: Quantum Bond Trading</a> he addresses a deeper question: Does
the Finance business actually benefit society? Obviously a subject worthy of attention, and he makes it amusing.</p>
<h2 id='p-8'>Wonderful things</h2>
<p> The dude who wrote <a href="https://www.bikewanderer.com/on-the-road//packrafting-the-darien-gap">Paddling the Darien</a>
is clearly crazy, I guess it’d be more polite to say “insanely brave”. Anyhow, I think there are very few people who won’t be
astonished at these pictures and stories</p>
<p>I’m not at all sure what <a href="https://jonathanhoefler.com/inventions">A. Inventions</a>, by Jonathan Hoefler,
is, actually. The link that I followed said that GenAI image generators were involved. I don’t care.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/calendars.png" alt="Alignment Calendars 1584–1811" />
<div class='caption'><p>Alignment Calendars 1584–1811,<br/>from Jonathan Hoefler’s <cite>Inventions</cite>.</p></div>
<p>Let’s end with music. Here are two absolutely exquisite song performances, courtesy of YouTube. First,
<a href="https://www.youtube.com/watch?v=1qahZ-whM6o">Old Enough</a> by the Raconteurs, Ricky Skaggs, and Ashley Monroe. The
interplay of voices and strings is magical. Then Billy Strings wiith his band and string players, doing
<a href="https://www.youtube.com/watch?v=ZCtQdALo9DI">Gild the Lily</a>. Just a lovely performance of a fine new song.</p>
<p>That’s all, folks, see you next time.</p>
</div></content></entry>
<entry>
<title>Kendzior Case-Study</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study' />
<link rel='replies' thr:count='3' type='application/xhtml+xml' href='/ongoing/When/202x/2025/11/13/Kendzior-Case-Study#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study</id>
<published>2025-11-13T12:00:00-08:00</published>
<updated>2025-11-14T10:55:57-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='The World/Social Media' />
<category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Social Media' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>There was recently a flurry of attention and dismay over <a href='https://en.wikipedia.org/wiki/Sarah_Kendzior'>Sarah Kendzior</a> having been suspended from Bluesky by its moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>There was recently a flurry of attention and dismay over
<a href="https://en.wikipedia.org/wiki/Sarah_Kendzior">Sarah Kendzior</a> having been suspended from Bluesky by its
moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In
particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there.</p>
<h2 id='p-1'>Disclosures</h2>
<p>I’m a fan of Ms Kendzior, for example check out her recent
<a href="https://sarahkendzior.substack.com/p/when-i-loved-new-York">When I Loved New York</a>; fine writing and incisive
politics. I like the Bluesky experience and have warm feelings toward the team there, although my
<a href="https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate">long-term social media bet is on Mastodon</a>.</p>
<h2 id='p-2'>Back story</h2>
<p>Back in early October, the <cite>Wall Street Journal</cite> published
<a href="https://www.wsj.com/arts-culture/music/can-we-finally-give-johnny-cash-his-due-58ab24c2">It’s Finally Time to Give
Johnny Cash His Due</a>, an appreciation for Johnny’s music that I totally agreed with. In particular I liked its praise for
<a href="https://en.wikipedia.org/wiki/American_IV:_The_Man_Comes_Around">American IV: The Man Comes Around</a> which, recorded while
he was more or less on his deathbed, is a masterpiece. It also said that, relative to other rockers, Johnny “can seem deeply
uncool”.</p>
<p>Ms Kendzior, who is apparently also a Cash fan and furthermore thinks he’s cool, posted to Bluesky “I want to shoot
the author of this article just to watch him die.” Which is pretty funny, because one of Johnny’s most famous lyrics, from
<a href="https://en.wikipedia.org/wiki/Folsom_Prison_Blues">Folsom
Prison Blues</a>, was “I shot a man in Reno just to watch him die.” (Just so you know: In 1968 Johnny performed the song at a
benefit concert for the prisoners at Folsom, and on the live record (which is good), there is a burst of applause from the
audience after the “shot a man” lyric. It was apparently added in postproduction.)</p>
<p>Subsequently, per the
<a href="https://bsky.app/profile/safety.bsky.app/post/3m5hcx4n2hc2z">Bluesky Safety</a> account ”The account owner of
@sarahkendzior.bsky.social was suspended for 72 hours for expressing a desire to shoot the author of an article.”</p>
<p>There was an outburst of fury on Bluesky about the sudden vanishing of Ms Kendzior’s account, and the explanation
quoted above didn’t seem to reduce the heat much. Since I know nothing about the mechanisms used by Bluesky Safety, I’m
not going to dive any deeper into the Bluesky story.</p>
<h2 id='p-3'>On Mastodon</h2>
<p>I do know quite a bit about Mastodon’s trust-and-safety mechanisms, having been a moderator on
<a href="https://cosocial.ca">CoSocial.ca</a> for a couple of years now. So I’m going to walk through how the same story might
have unfolded on Mastodon, assuming Ms Kendzior had made the same post about the <cite>WSJ</cite> article. There are a bunch of
forks in this story’s path, where it might have gone one way or another depending on the humans involved.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/report-menu.png" alt="Mastodon “Report” menu" class="inline" />
<h2 id='p-4'>Reporting</h2>
<p>The Mastodon process is very much human-driven. Anyone who saw Ms Kendzior’s post could pull up the per-post menu and hit the
“Report” button. I’ve put a sample of what that looks like on the right, assuming someone wanted to report yours truly.</p>
<p>By the way, there are many independent Mastodon clients; some of them have “Report” screens that are way cooler than this. I
use
<a href="https://phanpy.social">Phanpy</a>, which has a hilarious little animation with an animated rubber stamp that
leaves a red-ink “Spam” or whatever on the post you’re reporting.</p>
<p>We’ll get into what happens with reports, but here’s the first fork in the road: Would the Kendzior post have been reported?
I think there are three categories of people that are interesting. First, Kendzior fans who are hip to Johnny Cash, get the
reference, snicker, and move on. Second, followers who think “ouch, that could be misinterpreted”; they might throw a
comment onto the post or just maybe report it. Third, Reply Guys who’ll jump at any chance to take a vocal woman down; they’d
gleefully report her en masse. There’s no way to predict what would have happened, but it wouldn’t be surprising if there were
both categories of report, or either, or none.</p>
<h2 id='p-5'>Moderating</h2>
<p>When you file a report, it goes both to the moderators of your instance and the of instance where it was posted (who oversee the poster’s account).
I dug up a 2024 report someone filed against me to give a feeling for what
the moderator experience is like.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/timbray-report.png" alt="Report filed against Tim Bray for “antisemitism”" />
<p>I think it’s reasonably self-explanatory. Note that the account that filed the report is not identified, but that the server
it came from is.</p>
<p>A lot of reports are just handled quickly by a single moderator and don’t take much thought: Bitcoin scammer or Bill Gates
impersonator or someone with a swastika in their profile? Serious report, treated seriously.</p>
<p>Others require some work. In the moderation screen, just below the part on display above, there’s space for moderators to
discuss what to do. (In this particular case they decided that criticism of political leadership wasn’t “antisemitism” and
resolved the report with no action.)</p>
<p>In the Kendzior case, what might the moderators have done? The answer, as usual, is “it depends”. If there were just one or
two reports and they leaned on terminology like “bitch” and “woke”, quite possibly they would have been dismissed.</p>
<p>If one or more reports were heartfelt expressions of revulsion or trauma at what seemed to be a hideous death threat, the
moderators might well have decided to take action. Similarly if the reports were from people who’d got the reference and
snickered but then decided that there really should have been a “just kidding” addendum.</p>
<h2 id='p-6'>Action</h2>
<p>Here are the actions a moderator can take.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions.png" alt="Mastodon moderation action options" />
<p>If you select “Custom”, you get this:</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions-2.png" alt="More Mastodon moderation action optiosn" />
<p>Once again, I think these are self-explanatory. Before taking up the question of what might happen in the Kendzior case, I
should grant that moderators are just people, and sometimes they’re the wrong people. There have been servers with a reputation
for draconian moderation on posts that are even moderately controversial. They typically haven’t
done very well in terms of attracting and retaining members.</p>
<p>OK, what might happen in the Kendzior case? I’m pretty sure there are servers out there where the post would just have been
deleted. But my bet is on that “Send a warning” option. Where the warning might go something like “That
post of yours really shook up some people who didn’t get the Folsom Prison Blues reference and you should really
update it somehow to make it clear you’re not serious.”</p>
<p>Typically, people who get that kind of moderation message take it seriously. If not, the moderator can just delete the post.
And if the person makes it clear they’re not going to co-operate, that creates a serious risk that if you let them go on shaking
people up, your server could get mass-defederated, which is the death penalty. So (after some discussion) they’d delete the
account. Everyone has the right to free speech, but nobody has a right to an audience courtesy of our server.</p>
<h2 id='p-7'>Bottom line</h2>
<p>It is very, very unlikely that in the Mastodon universe, Sarah Kendzior’s account would suddenly have globally vanished. It
is quite likely that the shot-a-man post would have been edited appropriately, and possible that it would have just
vanished.</p>
<h2 id='p-8'>Will it scale?</h2>
<p>I think the possible outcomes I suggested above are, well, OK. I think the process I’ve described is also OK. The
question arises as to whether this will hold together as the Fediverse grows by orders of magnitude.</p>
<p>I think so? People are working hard on moderation tools. I think this could be an area where AI would help, by
highlighting possible problems for moderators in the same way that it highlights spots-to-look-at today for radiologists. We’ll
see.</p>
<p>There are also a couple of background realities that we should be paying more attention to. First, bad actors tend to
cluster on bad servers, simply because non-bad servers take moderation seriously. The defederation scalpel needs to be kept
sharp and kept nearby.</p>
<p>Secondly, I’m pretty convinced that the current open-enrollment policy adopted by many servers, where anyone can have an
account just by asking for it, will eventually have to be phased out. Even a tiny barrier to
entry<span class='dashes'> —</span> a few words on why you want to join or, even better, a small
payment<span class='dashes'> —</span> is going to reduce the frequency of troublemakers to an amazing degree.</p>
<h2 id='p-9'>Take-aways</h2>
<p>Well, now you know how moderation works in the Fediverse. You’ll have to make up your own mind about whether you like it.</p>
</div></content></entry>
<entry>
<title>Bye, Google Search</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind' />
<link rel='replies' thr:count='4' type='application/xhtml+xml' href='/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind</id>
<published>2025-11-01T12:00:00-07:00</published>
<updated>2025-11-03T21:29:26-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Search' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Search' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Publishing' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Publishing' />
<category scheme='https://www.tbray.org/ongoing/What/' term='The World/Life Online/De-Google' />
<category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
<category scheme='https://www.tbray.org/ongoing/What/' term='De-Google' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog fragments using Google. No longer; I wired in <a href='https://pagefind.app'>Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now, I’ll wait before getting into the details</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog
fragments using Google. No longer; I wired in
<a href="https://pagefind.app">Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,
I’ll wait before getting into the details.</p>
<h2 id='p-1'>The problem</h2>
<p>Well, I mean, Google is <em>definitely</em> Part Of The Problem in advertising, surveillance, and Internet
search. But the problem I’m talking about is that it just couldn’t find my pages, even
when I knew they were here and knew words that should find them.</p>
<p>Either it dropped the entries from the index or dropped a bunch of search terms.
Don’t know and don’t care now. <span class='o'>ongoing</span> is my outboard memory
and I search it <em>all the freaking time</em>. This failure mode was making me crazy.</p>
<h2 id='p-2'>Pagefind</h2>
<p>Tl;dr: I downloaded it and installed it and it Just Worked out of the box. I’d describe the look and feel but that’d be a
waste of time since you just tried it out. It’s fast enough and doesn’t seem to miss anything and has a decent user
interface.</p>
<h2 id='p-3'>How it works</h2>
<p>They advertise “fully static search library”, which I assumed meant it’s designed to work against sites like this one
composed of static files. And it is, but there’s more to it than that; read on.</p>
<p>First, you point a Node program at the root of your static-files tree and stand back. My tree has a bit over 5,000 files
containing about 2½ million words, adding up to a bit over 20M of text. By default, it assumes you’re indexing HTML and includes
all the text inside each page’s <code><body></code> element.</p>
<p>You have to provide a <code>glob</code> argument to match the files you want to index; in most cases, something like
<code>root/**/*.html</code> would do the trick. Working this out was for me the hardest part because among other things my
articles don’t end with <code>.html</code>; maybe it’ll be helpful for some to
note that what worked for <span class='o'>ongoing</span>
was:<br/><code>When/???x/????/??/??/[a-zA-Z0-9]<[\-_a-zA-Z0-9]:></code></p>
<p>This produced an index organized into about 11K files adding up to about 78M. It includes a directory with one file per
HTML page being searched.</p>
<p>I’d assumed I’d have to wire this up to my Web server somehow, but no: It’s all done in the client by fetching little bits
and pieces of the index using ordinary HTTP GETs.
For example, I ran a search for the word “minimal”, which resulted in my browser fetching a total of seven files totaling
about 140K. That’s what they mean by “static”; not just the data, but the index too.</p>
<p>Finally, I noticed a couple of WASM files, so I had to check out
<a href="https://github.com/Pagefind/pagefind">the source code</a> and, sure enough, this is basically a Rust app. Again I’m
impressed. I hope that slick modern Rust/WASM code isn’t offended by me rubbing it up against this blog’s messy old
Perl/Ruby/raw-JS/XML tangle.</p>
<h2 id='p-9'>Scalable?</h2>
<p>Interesting question. For the purposes of this blog, Pagefind is ideal. But, indexing my 2½ million words burned a solid
minute of CPU on the feeble VPS that hosts <span class='o'>ongoing</span>. I wonder if the elapsed time is linear in the data
size, but it wouldn’t surprise me if it were worse. Furthermore, the index occupies more storage than the underlying data, which
might be a problem for some.</p>
<p>Also, what happens when I do a search while the indexing is in progress? Just
to be sure, I think I’ll wire it up to build the index in a new directory and switch indices as atomically as possible.</p>
<p>Finally, I think that if you wanted to sustain a lot of searches per second, you’d really want to get behind a CDN, which would
make all that static index fetching really fly.</p>
<h2 id='p-4'>Configuring</h2>
<p>The default look-and-feel was mostly OK by me, but the changes I had to make did involve quality time with the inspector,
figuring out the class and ID complexities and then iterating the CSS.</p>
<p>The one thing that in the rear-view seems unnecessary is that I had to add a <code>data-pagefind-meta</code> attribute to the
element at the very bottom of the page where the date is to include it in the result list. There should be a way
to do this without custom markup. John Siracusa filed a
<a href="https://github.com/Pagefind/pagefind/issues/974">related bug</a>.</p>
<h2 id='p-8'>Deployment</h2>
<p>There’s hardly any work. I’ll re-run the indexer every day with a crontab entry and it looks it should just take care of
itself.</p>
<h2 id='p-5'>To do?</h2>
<p>Well, I could beautify the output some more but I’m pretty happy with it after just a little work. I can customize the sort
order, which I gather is in descending order of how significant Pagefind thinks the match is. There’s a temptation to sort it in
reverse date order. Actually, apparently I can also influence the significance algorithm. Anyhow I’ll run with mostly-defaults
for now.</p>
<h2 id='p-6'>Search options</h2>
<p>I notice that the software is pretty good at, and aggressive about, matching across verb forms and singular/plural and
prefixes. Which I guess is what you want? You can apparently defeat that by enclosing a word in quotes if you want it matched
exactly. Works for phrases too. I wonder what other goodies are in there; couldn’t find any docs on that subject.</p>
<p>Finally, there’s an excellent feature set I’ll never use; it’s smart about lots of languages. But alas, I write
monolingually.</p>
<h2 id='p-10'>Shameful cleanup</h2>
<p>Like I said, getting Pagefind installed and working was easy. Getting the CSS tuned up was a bit more effort. But I have to
confess that I put hours and hours into hiding my dirty secrets.</p>
<p>You see, <span class='o'>ongoing</span> contains way more
writing than you or Google can see. It’s set up so I can “semi-publish” pieces; there but unlinked. There was a whole lot of
this kind of stuff: Photo albums from social events, pitches to employers about why they should hire various people
including me, rants at
employers for example about why Solaris should adopt the Linux userland (I was right) and why Android should include a Python
SDK (I was right), and pieces that employer PR groups convinced me to bury. One of my minor regrets about no longer being
employed is I no longer get to exercise my mad PR-group-wrangling skillz.</p>
<p>But when your search software is just walking the file tree, it doesn’t know what’s “published” and what’s not. I ended up
using my rusty shell muscles with <code>xarg</code> and <code>sed</code> and <code>awk</code> and even an <code>ed(1)</code>
script. I think I got it all, but who knows, search hard enough and you might find something embarrassing. If you do, I’d sure
appreciate an email.</p>
<h2 id='p-7'>Thanks!</h2>
<p>To the folks who built this. Seems like a good thing.</p>
</div></content></entry>
<entry>
<title>Time to Migrate</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate' />
<link rel='replies' thr:count='6' type='application/xhtml+xml' href='/ongoing/When/202x/2025/11/03/Time-to-Migrate#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate</id>
<published>2025-11-03T12:00:00-08:00</published>
<updated>2025-11-03T12:00:00-08:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Business/Publishing' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Business' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Publishing' />
<category scheme='https://www.tbray.org/ongoing/What/' term='The World/Life Online' />
<category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean any combination of “less useful”, “less safe”, or “less fun”. This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to go. Come join me. Here’s why</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean
any combination of “less useful”, “less safe”, or “less fun”.
This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to
go. Come join me. Here’s why.</p>
<h2 id='p-2'>Defining terms</h2>
<p>In this post, by “Social media” I mean
“what Twitter used to be, back when it was good”. We should expect our social-media future to be <em>at least</em>
as useful, safe, and fun as that baseline. (But we can do better!)</p>
<p>By “Mastodon” I mean the many servers, mostly running the
<a href="https://github.com/mastodon/mastodon">Mastodon software</a>, that
communicate using the
<a href="https://en.wikipedia.org/wiki/ActivityPub">ActivityPub protocol</a>. Now I’ll try to convince you to start using one of
them.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/join-mastodon.png" alt="join-mastodon.org" />
<div class='caption'><p>Start at
<a href="https://joinmastodon.org">joinmastodon.org</a></p></div>
<h2 id='p-4'>The simplest argument</h2>
<p>Have you noticed that social-media products, in the long term, can’t seem to manage to stay fun and safe and useful?
I have. But there’s one huge exception, a tool that’s been serving billions of us for
decades, and works about as well as it ever did. I’m talking about email.</p>
<p>Why does email stay reasonably healthy? Because nobody owns it. Anyone on any server can communicate with anyone else on any
other and it Just Works. Nobody can buy it and make it a vehicle for their politics. Nobody can crank up the ad density or
make things worse to improve their profit margin.</p>
<p>Mastodon’s like email that way. Plus it does all the Post and Repost and Quote and Follow and Reply and Like and Block stuff that you’re
used to, and there are thousands of servers and anyone can run one and nobody can own the whole thing. It doesn’t have ads and it
won’t. It’s dead easy to use and it’s fun and you should
<a href="https://joinmastodon.org">give it a try</a>.</p>
<p>The rest of this essay goes into detail about why Mastodon is generally great and specifically better than the
alternatives. But if that simple pitch sounded good, stop here,
<a href="https://joinmastodon.org/">go get an account</a> and climb on board.</p>
<!--
<p>But first…</p>
<h2 id='p-5'>Is social media worth saving?</h2>
<p>I regularly read that it’s pernicious and evil, damaging the mental health of young people,
and should be stamped out or foregone. I disagree. I think the problem is late-stage capitalism; every company that
offers a social-media product is under relentless financial pressure to yield steadily-growing profits, going on forever.</p>
<p>Since
there’s a global limit to the number of customers that any service can attract, that means they have to suck more out of each
user. Where by “suck more out of” I mean what social-media professionals call “increase engagement”.</p>
<p>So, engagement is increased at literally any cost, notably including the
<a href="https://erinkissane.com/meta-in-myanmar-part-i-the-setup">slaughter of the Rohingya</a>.</p>
<p>I for one do <em>not</em> agree that there’s anything essentially pernicious about having networked online
conversations. Once again, I appeal to email, which generally doesn’t exhibit the usual social-media pathologies.</p>
<p>I’d even appeal to Twitter-that-was, when authoritative voices were
talking about any subject from every angle, and when you could find out if you’d just felt an earthquake and be horrified or overjoyed
about Maple Leafs playoff collapse. It was fun and useful and educational.</p>
<p>So, Social Media? Yes. Centralized corporate social media? No.</p>
<p>Now, here are a bunch of great things about Mastodon, if that pitch above didn’t quite convince you to switch now.</p> -->
<h2 id='p-18'>Why now?</h2>
<p>Two things motivated me to post this piece now. First, this month is my three-year anniversary of
<a href="/ongoing/When/202x/2022/11/26/Bye-Twitter">bailing out on Twitter</a> in favor of Mastodon.</p>
<p>Second is the release of Mastodon 4.5, which I think closes the last few important-missing-feature gaps.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/masto4-5.png" alt="Mastodon v4.5 announcement" />
<p>The software is improving rapidly, particularly in the last couple of releases. It’s got cool features you won’t find
elsewhere, and there’s very little cool stuff from elsewhere that’s not here. There was a time when newly-arrived people had
confusing or unfriendly experiences, or missed features that were important to them.
It looks to me like those days are over.</p>
<h2 id='p-6'>Migration</h2>
<p>Mastodon is many thousands of servers, and you can join the biggest,
<a href="https://mastodon.social/explore">mastodon.social</a>, or
<a href="https://joinmastodon.org/servers">shop around for another</a>. But here’s the magic thing: If you end up disliking the
server you’re on, or find a better one, you can migrate and <em>take your followers with you</em>! You can’t ever get locked
in.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/serveres.png" alt="Choosing a Mastodon server" />
<div class='caption'><p>The server-selection menu has lots of options.</p></div>
<p>This is probably Mastodon’s most important feature. It’s why no billionaire can buy it and no corporation can enshittify it. As
far as I know, Mastodon is the first widely-adopted social software ever to offer this.</p>
<h2 id='p-7'>Interaction</h2>
<p>You hear it over and over: “I had <a big number> of followers on Twitter and now I have <a less-big number> on
Mastodon, but I get so much more conversation and interaction when I post here.”</p>
<p>One of the people you’ll hear that from is me.
My follower count is less than half the 45K I had on Twitter-that-was, but I get immensely more intelligent, friendly
interaction than I ever got there. (And then sometimes I get told firmly that I’m wrong about this or that, but hey.) It’s
the best social-media experience I’ve ever had.</p>
<p>Dunno about you, but conversation and interaction
seem like a big deal to me. One reason things are lively is…</p>
<h2 id='p-8'>Sex</h2>
<p>Here’s an axiom: An ad-supported service can’t have sex-positive or explicit content. Advertisers simply won’t tolerate
having their message appear beside NSFW images or Gay-Leatherman tales or exuberant trans-positivity. Mastodon
can.</p>
<p>Of course, you gotta be reasonable, posting anything actually illegal will get your ass perma-blocked and your account
suspended. So will posting anything that’s NSFW etc without a “Content Warning”. That’s a built-in feature of Mastodon which
puts a little warning (“#NSFW” and “#Lewd” are popular) above your post, which is tastefully blurred-out until whoever’s
looking at it clicks on “Show content”.
I use these all the time when
I post about #baseball or #fútbol because a lot of the geeks and greens who follow me are pointedly uninterested in sports.</p>
<p>(Oh, typing that in reminds me that you can subscribe to hashtags on Mastodon: Let’s see, I currently subscribe to, among
others,
<a href="https://mastodon.social/search?q=%23Vancouver">#Vancouver</a>,
<a href="https://mastodon.social/search?q=%23Murderbot">#Murderbot</a>, and
<a href="https://mastodon.social/search?q=%23Fujifilm">#Fujifilm</a>.)</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/ivory.png" alt="The Ivory For Mastodon app for Apple platforms" />
<div class='caption'><p>The “Ivory for Mastodon” app for Apple platforms,<br/>one of the many fine alternative clients.</p></div>
<h2 id='p-9'>Moderation and defederation</h2>
<p>Did I just mention, two paragraphs up, getting blocked? Mastodon isn’t free of griefers, but the tools to fight them are good
and getting better.</p>
<p>The good news is that each server moderates its own members. So there’s some variation
of the standards from server to server, but less than you’d think. Since there are thousands of servers, there are
thousands of moderators, which is a lot.</p>
<p>If you act in a way that others find offensive, you’ll probably get blocked by the offended people and also reported; the
report can come from any server and it’ll go to the moderators on yours. On a well-run server, those mods will have a look and
if you’ve actually been bad, your post might get yanked and you might get warned, or in an extreme case, booted off.</p>
<p>(I’ve been reported for saying unkind things about Bibi Netanyahu and for posting too many photos of my
cats (no, really) but that kind of thing is cheerfully ignored by good moderation teams.)</p>
<p>Then there’s Mastodon’s nuclear weapon: Defederation.
Suppose you’re prone to nasty bigotry in public and you get reported a lot and your server’s moderators <em>don’t</em> rein
you in. Eventually, word will get around, and if things aren’t cleaned up, most servers will defederate yours, so that
<em>nobody</em> on their server can see posts from anyone on yours. Your site is no longer part of the “Fediverse”; this is a powerful
incentive for server owners to take moderation seriously.</p>
<p>The effect of all this is that the haters and scammers and Nazis who show up get shuffled off-stage PDQ. Well,
almost always; a couple of years ago a wave of incoming Black people had bad experiences with racist abuse. Ouch. But
the good news is that recent Mastodon releases have been shutting prone-to-abuse channels
down, so things are better than then and should continue to improve.</p>
<h2 id='p-11'>Links are good</h2>
<p>Corporate social-media services like to
<a href="https://talkingpointsmemo.com/tpm-25/how-elon-musks-changes-to-x-made-our-discourse-far-stupider">downrank posts with
links</a>.
Which makes me want
to scream, because my favorite thing to post is a link+reaction to something cool, and my favorite posts to read are too.</p>
<p>On Mastodon, when you have a link in a post, the software automatically fetches a preview of whatever you linked to and uses
it to decorate your link.
I mean, it’s the damn Internet, it only got interesting to non-geeks when we figured out how to turn millions of servers
into a great big honking searchable hypertext.</p>
<h2 id='p-12'>Search</h2>
<p>Speaking of which, Mastodon search is pretty good these days. It’s become, just like this blog, part of my outboard
memory, and I’m always typing things like “telephoto from:me has:media” into the search box. Fast enough, too.</p>
<h2 id='p-13'>Great clients</h2>
<p>Another good thing about Mastodon is that there are lots of
clients to choose from, mostly open-source. The best ones are miles ahead of Xitter and Threads and
Bluesky and, really, anything.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/Screenshot_20251110-104045.png" alt="A post from Brian Krebs in the Tusky app" />
<div class='caption'><p>Anniversary post in the Android “Tusky” app.</p></div>
<p>There are official Web and mobile clients from the Mastodon team and they’re fine, especially for admin and moderation work.
But iOS people should check out
<a href="https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/">Ivory</a>, Androiders should look at
<a href="https://tusky.app">Tusky</a>, and everyone should try
<a href="https://phanpy.social">Phanpy</a>. I live in Phanpy on both my Mac and my Pixel<span class='dashes'> —</span> it’s a
Web thing but installable as a PWA on both Android and iOS.</p>
<p>Commercial products, especially social-media services, have <em>never</em> been at peace with third-party clients.
Twitter used to be, but then it stabbed those developers in the back. It’s easy to
understand why; every product manager has it drilled into them that they <em>must control the user experience</em>. This ignores
the ancient wisdom (I first heard it from
<a href="https://en.wikipedia.org/wiki/Bill_Joy">Bill Joy</a>) “Wherever you work, most of the smart people are somewhere else.”</p>
<p>Mastodon doesn’t have that kind of product manager, but it does have a
<a href="https://docs.joinmastodon.org/api/">fully-capable API</a>, developed in the open and with no
hidden or restricted features. Which means you’re going to get better clients.</p>
<h2 id='p-14'>Algorithms</h2>
<p>The algorithms that commercial social-media services use to sort your feed have one goal only: Maximize engagement and thus
revenue. They have no concern for quality or novelty, and have been widely condemned by people who think about this stuff. So
much so that there’s a feeling that Algorithms Are Bad.</p>
<p>Mastodon has an algorithm: Show the posts from the accounts you follow, latest first. It works pretty
well. It also has “Trending” feeds of the most popular posts, hashtags, and links. I hit those once a
day or so to get a feeling for what’s going on in the world.</p>
<img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/trending.png" alt="Trending screen in PhanPy" />
<div class='caption'><p>The “Trending” display in Phanpy.</p></div>
<p>I do think there’s room for improvement here; Bluesky has shown off the idea of pluggable feed-ranking algorithms, with many to
choose from, and I like it. No reason in principle we couldn’t have the same thing on Mastodon.</p>
<h2 id='p-15'>Money</h2>
<p>Every other social network has started with a big pot of money, whether from venture-capital investors (Twitter, Instagram) or
from a Big Tech corporate parent (Google+, Threads). The people who provided that money want it back, plus a whole lot more.
Thus, the manic drive for “engagement” and growth at all costs. They need to build huge data centers and employ an elite
operations team plus an even more elite marketing group.</p>
<p>Mastodon, eh… a gaggle of nonprofits and co-ops and unincorporated affinity groups, financed by Patreon or low annual dues
or Some Random Geek who enjoys running a server.</p>
<p>Since nobody owns it, nobody can extract a profit from it. Which means that from the big-money point of view, it’s entirely
non-investable. The goal isn’t for anybody to make money, it’s to be instructive and intense and fun. It’s run on the cheap.
You know what they call systems that are cheap and diversified? Resilient. Sustainable. Long-lived.</p>
<p>Last year
<a href="https://www.tbray.org/ongoing/When/202x/2024/11/15/Not-Bluesky">I wrote</a>:
“Think of the Fediverse not as just one organism, but a population of mammals, scurrying around the ankles of the bigger and
richer alternatives. And when those alternatives enshittify or fall to earth, the Fediversians will still be there.” After
“scurrying” I should have added “and evolving”.</p>
<h2 id='p-19'>What about Bluesky?</h2>
<p>I like the Bluesky people and their software, but I worry a lot about whether they’re really decentralized in practice, and
even more about their financial future. I wrote up the details in
<a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">Why Not Bluesky</a>.</p>
<h2 id='p-16'>Mastodon’s the only option</h2>
<p>The only social-media option, I mean, that’s decentralized, not owned or controlled by anyone, and working well today as you
read this. It’s intense and interactive and fun. Why settle for less?</p>
<p><i>(Disclosure: I have no formal connections with the Mastodon organization, aside from being a low-level supporter on
Patreon.)</i></p>
</div></content></entry>
<entry>
<title>Grokipedia</title>
<link href='https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia' />
<link rel='replies' thr:count='2' type='application/xhtml+xml' href='/ongoing/When/202x/2025/10/28/Grokipedia#comments' />
<id>https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia</id>
<published>2025-10-28T12:00:00-07:00</published>
<updated>2025-10-29T21:09:53-07:00</updated>
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Publishing/Reference' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Publishing' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Reference' />
<category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
<category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
<summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I succumbed to boredom and killed the tab. Thus my introduction to <a href='https://en.wikipedia.org/wiki/Grokipedia'>Grokipedia</a>. Here are early impressions</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
<p>Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I
succumbed to boredom and killed the tab. Thus my introduction to
<a href="https://en.wikipedia.org/wiki/Grokipedia">Grokipedia</a>. Here are early impressions.</p>
<h2 id='p-1'>On Bray</h2>
<p>My Grokipedia entry has over seven thousand words, compared to a mere 1,300 in
<a href="https://en.wikipedia.org/wiki/Tim_Bray">my Wikipedia article</a>. It’s pretty clear how it was generated; an LLM, trained
on who-knows-what but definitely including that Wikipedia article and this blog, was told to go nuts.</p>
<p>Speaking as a leading but highly biased expert on the subject of T. Bray, here are the key take-aways:</p>
<h2 id='p-2'>(Overly) complete</h2>
<p>It covers all the territory; there is no phase of my life’s activity that could possibly be encountered in combing the Web
that is not exhaustively covered. In theory this should be good but in fact, who cares about the details of what I worked on
at Sun Microsystems between 2004 and 2010? I suppose I should but, like I said, I couldn’t force myself to plod all the way
through it.</p>
<h2 id='p-3'>Wrong</h2>
<p>Every paragraph contains significant errors. Sometimes the text is explicitly self-contradictory on the face of it,
sometimes the mistakes are subtle enough that only I would spot them.</p>
<h2 id='p-4'>Style</h2>
<p>The writing has that LLM view-from-nowhere flat-affect semi-academic flavor. I don’t like it but the evidence suggests that
some people do?</p>
<h2 id='p-5'>References</h2>
<p>All the references are just URLs and at least some of them entirely fail to support the text. Here’s an example. In
discussion of my expert-witness work for the FTC in their litigation against Meta concerning its acquisitions of Instagram and
WhatsApp, Grokipedia says:</p>
<blockquote><p>[Bray] opined that users' perceptions of response times in online services critically influence market
dynamics.</p></blockquote>
<p>It cites
<a href="https://www.ftc.gov/system/files/ftc_gov/pdf/FTCReplytoMetaResponse-CounterstatementofMaterialFacts.pdf">Federal
Trade Commission’s Reply to Meta Platforms, Inc.’s Response to Federal Trade Commission’s Counterstatement of Material
Facts</a> (warning: 2,857-page PDF). Okay, that was one of the things I argued, but the 425 pages of court documents that I
filed, and the references to my reporting in the monster document, make it clear that it was one tiny subset of the main
argument.</p>
<p>Anyhow, I (so that you won’t have to) spent a solid fifteen minutes spelunking back and forth through that FTC doc, looking
for strings like “response time” and “latency” and so on. Maybe somewhere in those pages there’s support for the claim quoted
above, but I couldn’t find it.</p>
<h2 id='p-6'>Useful?</h2>
<p>Wikipedia, in my mind, has two main purposes: A quick visit to find out the basics about some city or person or plant or
whatever, or a deep-dive to find out what we <em>really</em> know about genetic linkages to autism or Bach’s relationship with
Frederick the Great or whatever.</p>
<p>At the moment, Grokipedia doesn’t really serve either purpose very well. But, after all, this is release 0.1, maybe we
should give it a chance.</p>
<p>Or, maybe not.</p>
<h2 id='p-7'>Woke/Anti-Woke</h2>
<p>The whole point, one gathers, is to provide an antidote to Wikipedia’s alleged woke bias. So I dug into that. Let’s consider
three examples of what I found. First, from that same paragraph about the FTC opinion quoted above:</p>
<blockquote>
<p>While Bray and aligned progressives contend that such dominance stifles innovation by enabling predatory acquisitions and
reduced rivalry—evidenced by fewer startup exits in concentrated sectors—counterarguments highlight that Big Tech's scale has
fueled empirical gains, with these firms investing over $240 billion in U.S. R&D in 2024 (more than a quarter of national
totals) and driving AI, cloud, and patent surges.[<a href="https://www.tbray.org/ongoing/When/202x/2020/06/08/Anti-monopoly">128</a>]
[<a href="https://www.intereconomics.eu/contents/year/2025/number/2/article/big-tech-and-the-us-digital-military-industrial-complex.html">131</a>] Six tech industries alone accounted for
over one-third of
U.S. GDP growth from 2012–2021, comprising about 9% of the
economy and sustaining 9.3 million jobs amid falling consumer prices and rapid technological diffusion.
[<a href="https://itif.org/publications/2023/05/30/six-tech-industries-accounted-for-more-than-one-third-of-gdp-growth-in-the-last-decade/">132]</a>
[<a href="https://jamesmadison.org/the-united-states-is-the-leader-of-the-digital-revolution-pro-tech-policies-are-key/">133</a>]
Right-leaning economists often defend consumer welfare metrics and market self-correction, warning that forced divestitures
risk eroding the efficiencies and investment incentives that have propelled sector productivity above 6% annual growth in key
areas like durable manufacturing tech.
[<a href="https://itif.org/publications/2025/09/19/five-persistent-myths-about-big-tech/">134</a>]
[<a href="https://www.nber.org/digest/oct01/technology-and-productivity-growth?page=1&perPage=50">135</a>]</p>
</blockquote>
<p>I’ve linked the numbered citations to the indicated URLs. Maybe visit one or two of them and see what you think? Four are
to articles arguing, basically, that monopolies must be OK because the companies accused of it are growing really fast and
driving the economy. They seem mostly to be from right-wing think-tanks but I guess that’s what those think-tanks are for. One
of them, #131, <cite>Big Tech and the US Digital-Military-Industrial Complex</cite>, I think isn’t helpful to the argument at
all. But still, it’s broadly doing what they advertise: Pushing back against “woke” positions, in this case the position that
monopolization is bad.</p>
<p>I looked at a couple of other examples. For example, this is from the header of the Greta Thunberg article:</p>
<blockquote>
<p>While credited with elevating youth engagement on environmental issues, Thunberg's promotion of urgent, existential climate
threats has drawn scrutiny for diverging from nuanced empirical assessments of climate risks and adaptation capacities, as
well as for extending her activism into broader political arenas such as anti-capitalist and geopolitical protests.[5][6]</p>
</blockquote>
<p>Somehow I feel no urge to click on those citation links.</p>
<p>If Ms Thunberg is out there on the “woke” end of the spectrum, let’s flit over to the other end, namely the entry for
J.D. Vance, on the subject of his book <cite>Hillbilly Elegy</cite>.</p>
<blockquote>
<p>Critics from progressive outlets, including Sarah Smarsh in her 2018 book <cite>Heartland</cite>, faulted the memoir for
overemphasizing personal and cultural failings at the expense of structural economic policies, arguing it perpetuated
stereotypes of rural whites as self-sabotaging.[71] These objections, often rooted in institutional analyses from academia and
media, overlooked data on behavioral patterns like opioid dependency rates—peaking at 21.5 deaths per 100,000 in Appalachia
around 2016—that aligned with Vance's observations of "deaths of despair" precursors.[72]</p>
</blockquote>
<p>I read and enjoyed <cite>Heartland</cite> but the citation is to a <cite>New Yorker</cite> article that doesn’t mention
Smarsh. As for the second sentence… my first reaction as I trudged through its many clauses, was “life’s too short”.
But seriously, opioid-death statistics weaken the hypothesis about structural economic issues? Don’t get it.</p>
<h2 id='p-8'>Take-away</h2>
<p>Wikipedia is,
<a href="/ongoing/When/202x/2024/06/15/Wikipedia-Pain">to quote myself</a>, the encyclopedia that “anyone who’s willing to
provide citations can edit”.
Grokipedia is “the encyclopedia that Elon Musk’s LLM can edit, with sketchy citations and no progressive argument left
un-attacked.”</p>
<p>So I guess it’s Working As Intended?</p>
</div></content></entry>
</feed>
{
"accept-ranges": "bytes",
"cf-cache-status": "DYNAMIC",
"cf-ray": "9dd249703c515751-CMH",
"content-length": "194516",
"content-security-policy": "frame-ancestors 'self';",
"content-type": "application/atom+xml",
"date": "Mon, 16 Mar 2026 08:11:24 GMT",
"etag": "\"2f7d4-64cc96d55e3b3\"",
"last-modified": "Thu, 12 Mar 2026 01:11:06 GMT",
"server": "cloudflare",
"strict-transport-security": "max-age=31536000; includeSubdomains; preload",
"x-content-type-options": "nosniff"
}
{
"meta": {
"type": "atom",
"version": "1.0"
},
"language": "en-us",
"title": "ongoing by Tim Bray",
"description": "ongoing fragmented essay by Tim Bray",
"copyright": "All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright",
"url": "https://www.tbray.org/ongoing/",
"self": "https://www.tbray.org/ongoing/ongoing.atom",
"published": null,
"updated": "2026-03-12T01:11:06.000Z",
"generator": {
"label": "Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, and ImageMagick. Industrial-strength technology, baby.",
"version": null,
"url": "/misc/Colophon"
},
"image": {
"title": null,
"url": "rsslogo.jpg"
},
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [],
"items": [
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/03/05/Because-Algospeak",
"title": "Because Algospeak",
"description": "Recently I read Because Internet by Gretchen McCulloch and Algospeak by Adam Aleksic. The language we speak (and text) to each other is at the core of who and what we are, and the Internet is the strongest among the forces that channel and fertilize its growth. So there’s scope for plenty of books on the subject. Both books educated and entertained, one made me angry",
"url": "https://www.tbray.org/ongoing/When/202x/2026/03/05/Because-Algospeak",
"published": "2026-03-05T20:00:00.000Z",
"updated": "2026-03-07T18:29:41.000Z",
"content": "<p>Recently I read\n <a href=\"https://en.wikipedia.org/wiki/Because_Internet\">Because Internet</a> by\n <a href=\"https://gretchenmcculloch.com\">Gretchen McCulloch</a> and\n <a href=\"https://en.wikipedia.org/wiki/Algospeak_(book)\">Algospeak</a> by\n <a href=\"https://en.wikipedia.org/wiki/Adam_Aleksic\">Adam Aleksic</a>. The language we speak (and text) to each other is at the\n core of who and what we are, and the Internet is the strongest among the forces that channel and fertilize its growth.\n So there’s scope for plenty of books on the subject. Both books educated and entertained, one made me angry.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/03/05/covers.png\" alt=\"The covers of “Because Internet” and “Algospeak”\"></img>\n <h2 id=\"p-1\">Because Internet (2019)</h2>\n <p>Its approach is historical and its voice fairly uninflected. It smiles and\n argues, but it doesn’t ROFL nor does it YELL AT YOU. The history is longer, perhaps, than most people reading this have\n been online (or even alive). Ms McCulloch goes back to the days of BBSes (“bulletin-board systems”) and ListServs and IRC. Some of\n the jargon and formulations of those days live on; you’d be surprised.</p>\n <p>Here’s her table of contents.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/03/05/BI-toc.png\" alt=\"Table of Contents from “Because Internet”\"></img>\n <p>The analysis is grounded in the formalisms of the author’s profession, academic linguistics. Nothing wrong with that.</p>\n <p>Let’s look at a couple of her ideas, beginning with Chapter 1’s “Informal Writing”. A few of us, back in the late\n Eighties, noticed that computers in general and the then-nascent Internet in particular were driving a writing\n renaissance.</p>\n <p>Before computers, a knowledge worker who had laboriously constructed essays in college quite likely wrote\n almost nothing for the rest of their working life. People talked face-to-face or on the phone, and dictated to\n secretaries. Written communication was seen as necessarily formal and disjoint from the way we spoke, or that we wrote in\n personal correspondence. Then, suddenly, everyone was sitting at a keyboard only seconds away from everyone else’s screen.\n McCulloch goes deep on this:</p>\n <blockquote><p>In the future, the era of writing between the invention of the printing press and the internet may come to be\n seen as an anomaly—an era when there arose a significant gap between how easy it was to be a writer versus a reader. An era when\n we collectively stopped paying attention to the informal, unedited side of writing and let typography become static and\n disembodied.</p>\n <p>The internet didn’t create informal writing, but it did make it more common, changing some of our previously spoken\n interactions into near-real-time text exchanges.</p></blockquote>\n <p>From which all of this follows. It feels like a central insight. I suppose you could argue that centrality of informal text\n is fading in the face of short-form video. Maybe,\n it’s too soon to tell.</p>\n <p>Then consider chapter 5, about emojis. Linguists obviously need to think about them because now they’re an\n integral part of written language. McCulloch’s insight is that they correspond almost exactly to gestures, the way we use\n our hands to add force to our speech. Obviously, for example, “👍”. Or when you’re talking about something completely\n loopy and you twirl your index finger by your ear? You meant “🤪”.</p>\n <p>I offer the emoji story for flavor, an example of a linguist’s approach to what we’re doing to our language with our\n networks.</p> <p>McCulloch has lots more of this stuff.\n I enjoyed <cite>Because Internet</cite> a lot, partly because I’m old and my memories stretch back to those BBS and\n IRC days and I had a front-row seat for the decades of linguistic seething and heaving. And also because I’m a\n <a href=\"https://www.rfc-editor.org/rfc/rfc9839.html\">Unicode geek</a>.</p>\n <h2 id=\"p-2\">Algospeak (2025)</h2>\n <p>The subtitle is “How Social Media Is Transforming the Future of Language”. OK, but… \n Social media is a fertile field for language evolution. Thing is, corporate social media discourse\n lives in the dire grip of the proprietors’ algorithms. And that’s where Adam Aleksic focuses. He treats all of them\n as a single opaque object, “The Algorithm”, which I think is fair because they all are designed with one goal: To\n maximize the effectiveness of human conversation at generating advertising revenue.</p>\n <p>First, the Table of Contents.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/03/05/AS-toc.png\" alt=\"Table of Contents from “Algospeak\"></img>\n <p>Aleksic knows whereof he speaks: As “Etymology Nerd”, his aggregate following across TikTok, Instagram, and YouTube is\n over three million. He’s all about cool bits and pieces of\n linguistics, often Internet-specific usages.\n If I had the patience for podcasts I suppose his would be near the top of my list.</p>\n <p>He really enjoys his work and has fun talking about some of Social Media’s more colorful linguistic extrusions; check\n that Table of Contents. I’m kind of old and I learned a lot about the words and emojis younger folk emit, and I think most folks,\n even those just out of their teens, would too. I’m on a Discord for a \n <a href=\"/ongoing/What/Sports/Soccer/\">Major League Soccer</a> team’s fans, and while it’s totally all-ages, I can say I am regularly\n less mystified than I was before I read <cite>Algospeak</cite>.\n For example, now I know what it means when someone tosses “💀” into a chat. Do you?</p>\n <p>Aleksic isn’t averse to a little history himself. Looking back over the successive online-jargon volcanoes, he argues\n convincingly that two stand out as extra productive. First of all, the short-lived (but hot stuff at the time)\n <a href=\"https://en.wikipedia.org/wiki/Vine_(service)\">Vine</a> video platform. Second, the incel cesspool; sad but\n (apparently) true.</p>\n <h2 id=\"p-3\">The Algorithm</h2>\n <p>Remember, it’s all about what advertisers want. And wow, do they ever want a lot of things. I’ll just touch on a few of\n Aleksic’s points.</p>\n <p>First of all, they don’t want to find themselves next to downers. So if you want to talk about death or suicide or rape or\n racism or rage, \n you need to fool The Algorithm. Thus “unalive” and many other dodges. Of course, The Algorithm learns about them so you\n have to keep dodging. Neither side of this struggle can stay ahead for long.</p>\n <p>Here’s another thing I didn’t know: Apparently written Chinese is particularly rich in techniques for euphemizing, making it\n easier for users of that language to evade, for a time, The Algorithm.</p>\n <h2 id=\"p-4\">Partitioning people</h2>\n <p>Another big thing The Algorithm likes is grouping people into smaller and smaller baskets based on interests, generations,\n and many other criteria. This is because advertisers can aim very specific campaigns at just exactly the right cohort of people who\n are likely to buy what they’re selling. Here’s a quote; See how the language fills in behind advertisers’ pressure?</p>\n <blockquote><p>It doesn’t matter how much I label myself. If I’m a demisexual goblincore Gen\n Z Swiftie, I guarantee there are still others like me. The only thing these labels really change about me is that they make me\n easier to classify and market to. Ironically, true individuality may come out of a <em>lack</em> of labels and stories, because\n there’s greater freedom of expression with a blank slate. If everybody’s the “main character,” then nobody is.</p></blockquote>\n <p><cite>Algospeak</cite>, unlike <cite>Because Internet</cite>, doesn’t limit itself to written language. One of its most\n compelling studies concerns the vocal techniques of podcasters and YouTubers. The finding is simple: It’s hard to build and hold an\n audience for your show unless you sound like MrBeast. No, really.</p>\n <p>Anyhow, they’re both good books. <cite>Because Internet</cite> educated and entertained me. <cite>Algospeak</cite> is way\n more intense, intentionally more like the subject it addresses. Also it made me angry. I am a lover of human language and of its\n patterns of growth and mutation and simplification and complexification. Linguistics is one of the disciplines I regret not\n having chosen.</p>\n <p>Aleksic makes it clear that there’s an amusing narrative about how the people living and speaking in the shade of the Algorithm\n can never defeat it, but they can still manage to get their messages across. But they shouldn’t have to struggle!</p>\n <p>In fact, a few million of us have found a place to talk to each other that isn’t in The\n Algorithm’s shadow: Decentralized social media. Specifically the Fediverse (what people mean when they say “Mastodon”) and maybe\n the ATmosphere (same for “Bluesky”).</p>\n <p>I want to see how language grows in a place where new forms arrive when they’re needed, to say new things that need to be\n said. Not to either serve or resist The Algorithm.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Language",
"term": "Language",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Language",
"term": "Language",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Life Online",
"term": "Life Online",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Life Online",
"term": "Life Online",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/02/27/Kansas-and-GenAI",
"title": "Kansas and AI",
"description": "Block announced that it’s cutting 40% of its workforce. It didn’t say it was replacing those people with GenAI. Not out loud. Jack Dorsey did say “I believe the majority of companies will reach the same conclusion and make similar structural changes.” Wall Street loved it, bidding up the share price by 24%. Which reminded me of Kansas in 2010",
"url": "https://www.tbray.org/ongoing/When/202x/2026/02/27/Kansas-and-GenAI",
"published": "2026-02-27T20:00:00.000Z",
"updated": "2026-02-28T00:06:19.000Z",
"content": "<p>Block announced that it’s cutting 40% of its workforce. It didn’t say it was replacing those people with GenAI. Not out loud.\n Jack Dorsey did say “I believe the majority of companies will reach the same conclusion and make similar structural\n changes.”\n Wall Street loved it, bidding up the share price by 24%. Which reminded me of Kansas in 2010.</p>\n <h2 id=\"p-1\">The Kansas Experiment</h2>\n <p>As long as I can remember, a certain class of right-wing evangelists has preached that cutting taxes would stimulate business\n growth and everyone would come out ahead. There are a couple of problems with this theory. First, mainstream economists\n almost universally think it’s just wrong. Second, most of the people pushing it are rich and would\n benefit from the cuts.</p>\n <p>Anyhow, in 2010 US Senator Sam Brownback won the race for governor of Kansas on what was then called the “Tea Party” program:\n Prosperity through tax cuts. Tea-party Republicans also won a large majority in the state legislature. Unsurprisingly they\n immediately\n <a href=\"https://en.wikipedia.org/wiki/Kansas_experiment\">did what they said they were going to do</a>: Slashed a wide variety\n of taxes, some to zero.</p>\n <p>The predicted prosperity failed to happen. The state government’s revenue plunged and it had to dig deep into rainy-day\n reserves just to keep the doors open. There were brutal cuts to policing, road repair, and schools. Also a nasty\n feedback loop: As the state’s fiscal position worsened, its credit rating fell and interest rates rose, leading to yet more\n brutal austerity measures.</p>\n <p>Another result was that affluent Kansans made out like bandits; the cost of running the state was substantially\n transferred to the less financially fortunate.</p>\n <p>In 2017, the legislature threw in their cards and repealed the tax cuts, overriding Brownback’s veto.</p>\n <p>While this was a terrible experience for most Kansans, it is historically useful, because whenever you encounter a\n tax-cut nut (probably self-interestedly wealthy) you can say “But, Kansas!” Having said that, there are still plenty of\n those nuts, and they’ll tell you that the Kansas experiment failed because of one fine-tuning effort or another. That’s a position\n that’s hard to defend, though.</p>\n <h2 id=\"p-3\">Sidebar: Trans oppression too</h2>\n <blockquote><p>Before I move onto the AI angle, I gotta pause to acknowledge this week’s news story about the Kansas\n government’s vicious, brutal, and ignorant\n <a href=\"https://www.theguardian.com/us-news/2026/feb/26/kansas-trans-drivers-license-law-assault-on-rights\">assault on trans\n people</a>. To be clear, I think the shitty people who hate trans folk are aren’t necessarily the same shitty people as the shitty\n people who don’t want to contribute to the public good. But, something about Kansas seems to attract both\n flavors.</p></blockquote>\n <h2 id=\"p-2\">The GenAI experiment</h2>\n <p>The core value proposition of contemporary AI technology is exactly what Dorsey seems to think: Fire half your\n employees and profits will soar! If that’s true, the trillion dollars or so invested so far will seem like small potatoes. Since\n we don’t know if \n this will actually work, anyone who actually does it is conducting an experiment. Just like Sam Brownback did.\n Unsurprisingly, the investor class loves this experiment and is putting their money on it working.</p>\n <p>To be fair, voices have been raised to argue that the tech sector is a special case: That following on\n feverish over-hiring during the Covid lockdown, they need to slash headcount anyhow, and are using AI as an excuse.\n For example\n <a href=\"https://daringfireball.net/linked/2026/02/27/block-layoffs\">John Gruber</a>.</p>\n <p>I personally\n am unconvinced, but even if they’re right, it’s irrelevant. The shareholding class won’t be able to see past that 24% payoff. So \n as of today, they’ll be yelling at every CEO on the planet to start pulling the mass-firing trigger. Or else.</p>\n <p>I think I know how the experiment will turn out. Just like in Kansas, it’s not going to be fun.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/AI",
"term": "Technology/AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "AI",
"term": "AI",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/02/24/Crocuses-of-2026",
"title": "Crocuses of 2026",
"description": "I’ve run early-spring pictures of these little purple guys almost every year since this blog’s birth in early 2003. Except for last year. Because we moved and the new place didn’t have any. Only now it does, and they’re (just barely) up. [Update: Up and open, too.]",
"url": "https://www.tbray.org/ongoing/When/202x/2026/02/24/Crocuses-of-2026",
"published": "2026-02-24T20:00:00.000Z",
"updated": "2026-02-26T21:46:17.000Z",
"content": "<p>I’ve run early-spring pictures of these little purple guys almost every year since this blog’s birth\n in early 2003. Except for last year. Because\n <a href=\"/ongoing/When/202x/2025/02/28/Moved\">we moved</a> and the new place didn’t have any. Only now it does, and they’re\n (just barely) up. <i>[Update: Up and open, too.]</i></p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56234.png\" alt=\"Crocuses of February 2026\"></img>\n <p>Long-time followers may note that they’re pale and fragile compared to the exuberant blossoms of previous\n years. Not sure why, but our new place faces north and there’s this enormous\n <a href=\"https://en.wikipedia.org/wiki/Fraxinus_americana\">White Ash</a> tree right in front of it, so they’re not getting as\n much sun as at the south-facing former joint.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56235.png\" alt=\"Crocuses of February 2026\"></img>\n <p>And also this is their first spring. We bought the bulbs and hired a professional with the right tools to jam them\n into the earth last autumn, between the big tree’s roots. So they really haven’t had a chance to get their own root systems going.</p>\n <p>And finally, it really is the first day that’s bright and warm enough to get out the camera. Maybe they’ll\n be better in another few days. And quite likely next Spring.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56244.png\" alt=\"Crocuses of February 2026\"></img>\n <p>This would be the place to introduce whatever metaphor this year’s blossoms, fighting their way through the leaf cover in\n chilly air toward the sun, fit into, but I’m not gonna.</p>\n <p>I, like many, am\n <a href=\"/ongoing/When/202x/2023/10/25/Wild-World\">not dealing very well</a> with what I see when I look at the world in either\n the big or the ultra-local landscapes.\n The world in tough shape and its worst people are making it worse.\n People I love are in ugly corners and not finding help.</p>\n <p>But you know, the flowers, in their low-key way, look great and so does the tree, still in wintersleep. Today the\n sun was shining on them. It’ll be warmer and nicer soon.</p>\n <p>Metaphors can go to hell. It’s just late-winter light on pale violet petals. Enjoy the moments you have with it.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/02/24/TXT56249.png\" alt=\"Spring crocus, now open for business\"></img>\n <div class=\"caption\"><p>Update: Now open for business.</p></div>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Arts/Photos",
"term": "Arts/Photos",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Arts",
"term": "Arts",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Photos",
"term": "Photos",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion",
"title": "Open Source and GenAI?",
"description": "I’ve been puttering away on my Quamina project since 2023. In the last few weeks GenAI has intervened. Quamina + Claude, Case 1 describes a series of Claude-generated human-curated PRs, most of which I’ve now approved and merged. Quamina + Claude, Case 2 considers quamina-rs, a largely-Claude-driven port from Go to Rust. Both of these stories seem to have happy endings and negligible downsides. So empirically, I can apply LLM technology usefully to software development. But should I?",
"url": "https://www.tbray.org/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion",
"published": "2026-02-16T20:00:00.000Z",
"updated": "2026-02-18T21:41:14.000Z",
"content": "<p>I’ve been puttering away on my\n <a href=\"/ongoing/What/Technology/Quamina%20Diary/\">Quamina</a> project since 2023. In the last few weeks GenAI\n has intervened. \n <a href=\"/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1\">Quamina + Claude, Case 1</a> describes a series of\n Claude-generated human-curated PRs, most of which I’ve now approved and merged.\n <a href=\"/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2\">Quamina + Claude, Case 2</a> considers\n <a href=\"https://github.com/baldawarishi/quamina-rs\">quamina-rs</a>, a largely-Claude-driven port from Go to Rust.\n Both of these stories seem to have happy endings and negligible downsides. So empirically, I <em>can</em> apply LLM\n technology usefully to software development. But should I?</p>\n <h2 id=\"p-3\">Conclusions 1: Burn it with fire?</h2>\n <p>Let me be clear: In the big GenAI picture, I’m a contra. Why? I’ll pass the mike to Baldur Bjarnason, my\n favorite among GenAI’s blood enemies.: \n <a href=\"https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/\">“AI” is a dick move</a>.\n His tl;dr is something like “GenAI is environmentally devastating and has the goal of throwing millions of\n knowledge workers onto the street and is being sold by the worst people and is used for horrible applications and will increase\n society’s already-intolerable level of inequality!” To which I reply “Yes, yes, yes, yes, and yes.”</p>\n <p>At the end of the day, the business goal of GenAI is to boost monopolist profits by eliminating decent jobs, and\n damn the consequences. This is a horrifying prospect (although I’m somewhat comforted by my belief that it basically won’t\n work and most of the investment capital is heading straight down the toilet).</p>\n <p>But. All that granted, there’s a plausible case, specifically in software development, for exempting LLMs from this\n loathing.</p> \n <p>First of all, size.\n <a href=\"https://www.jetbrains.com/lp/devecosystem-data-playground/#global_population\">JetBrains thinks</a> that\n the world has 21 million or so software developers, i.e. less than 1% of the earth’s working population.\n Vanishingly small in the context of the lunatic tsumani of LLM overinvestment.\n Training and operating the models required for a market this small is\n rounding error measured on the Great GenAI Overbuild scale. There aren’t enough geeks to create a detectable bump in the global\n carbon load.</p>\n <p>Another odious aspect of LLMs is\n <a href=\"https://en.wikipedia.org/wiki/Reinforcement_learning_from_human_feedback\">RLHF</a>, “Reinforcement Learning From Human\n Feedback”, which relies on underpaying Third-Worlders to \n polish the models’ outputs. \n My guess is that much less is required for code-oriented LLMs. \n The combination of the compiler and your unit tests provide good starter guardrails. Then skilled\n professional intervention is required to deal with the remaining misfires, as with those Quamina PRs.</p>\n <p>Finally, it seems making billionaires into multibillionaires is intrinsic to GenAI dreams. But software-development tools won’t\n do that. Once again, the market is just too small. But even if it weren’t, consider this from Steve Yegge:</p>\n <blockquote><p>For\n <a href=\"https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163\">this blog post</a>, “Claude Code” means “Claude Code and\n all its identical-looking competitors”, i.e. Codex, \n Gemini CLI, Amp, Amazon Q-developer ClI, blah blah, because that’s what they are. Clones.</p></blockquote>\n <p>(GenAI, overbuilding wherever you look.) None of these products have moats and the chance that any of them become\n extractive monopolies is about zilch. Nobody’s ever built a major cash-cow on developer tooling</p>\n <p>One reason is (*gasp*) Open Source. Does anybody doubt that in the near future, there will\n be entirely open-source versions of what Yegge means by “Claude”?</p>\n <p>So, if you want to condemn the use of GenAI in software development, I think you need arguments other than the fact that\n it’s also being promoted for societally-toxic business purposes.</p>\n <p>I have a few. But stand by, let me push that on the stack and turn to\n technology for a bit.</p>\n <h2 id=\"p-4\">Conclusions 2: Engineering sanity?</h2>\n <p>Question: Can LLMs even participate in quality software engineering?\n Baldur doesn’t think so: “The gigantic, impossible to review, pull requests. Commits that are\n all over the place. Tests that don’t test anything. Dependencies that import literal malware. Undergraduate-level security\n issues. Incredibly verbose documentation completely disconnected from reality.”</p>\n <p>I’m not saying that these pathologies can’t or don’t happen. But in my personal experience with Quamina, they\n didn’t. (Mind you, it’s a hobby project.)</p>\n <p>And when they do happen, I would assume that mature open-source projects will use a network of\n trust, as big operations like Linux already do. PRs that don’t have the imprimatur of someone known to be clueful will be ignored.\n When I saw the first of those incoming Quamina PRs, I took the time for a serious look because I knew Rob and had seen evidence that he\n was technically competent. If I see an incoming PR that’s nontrivial and from some rando and doesn’t pass a 120-second sanity\n check, it’s unlikely to get any more attention.</p>\n <p>In fact, some essentials don’t change. If you’re not requiring that PRs be clean and\n test coverage be good and code reviews not be skipped and dependencies be curated, you’re going to get a lousy result whether\n the upstream code is coming from a human or an LLM.</p>\n <p>But it’d be naive to think that a big change in the\n shape of that upstream isn’t going to affect the profession.</p>\n <h2 id=\"p-9\">Bottlenecks</h2>\n <p>Speaking from personal experience, reviewing the PRs from Claude&Rob was neither faster nor slower, easier nor harder,\n than what I’m used to pre-GenAI. The number of my disagreements with the diffs, and the amount of arguing it took to resolve\n them, was also about as usual.\n Which creates a big problem. Because if we can generate code a whole lot faster but review doesn’t\n speed up, all we’ve done is moved the bottleneck in the system.</p>\n <p>Speaking of which, Armin Ronacher offers\n <a href=\"https://lucumr.pocoo.org/2026/2/13/the-final-bottleneck/\">The Final Bottleneck</a>, from which: “When one part of the\n pipeline becomes dramatically faster, you need to throttle input.” Think about that.</p>\n <h2 id=\"p-10\">Burnout</h2>\n <p>Meanwhile, evidence is piling up that LLM-based software development is driving\n developers to overwork and burnout. Here’s\n <a href=\"https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it\">a cool-eyed take</a> from <cite>Harvard Business\n Review</cite>. Then there’s Steve Yegge’s frantic, overly-long\n <a href=\"https://steve-yegge.medium.com/the-ai-vampire-eda6e4f07163\">The AI Vampire</a>. But my favorite, and I think a\n must-read, is Siddhant Khare’s\n <a href=\"https://siddhantkhare.com/writing/ai-fatigue-is-real\">AI fatigue is real and nobody talks about it</a>.\n From which: “AI reduces the cost of production but increases the cost of coordination, review, and decision-making. And those\n costs fall entirely on the human.”</p>\n <p>The argument we’re hearing is that GenAI makes development more efficient. And more efficient is better.\n <a href=\"https://www.tbray.org/ongoing/When/202x/2020/07/05/Too-Efficient\">Until it’s not</a>.</p>\n <p>I’m not sure the profession I joined last century would attract me today. And on Mastodon,\n <a href=\"https://cosocial.ca/@gordwait/116082229876399512\">@GordWait said</a> “At our office, we are\n noticing a huge drop in Comp Sci co-op applications. The next generation is convinced there’s no future in programming thanks to\n AI hype.”</p>\n <h2 id=\"p-11\">Can and should</h2>\n <p>Here’s another conundrum. Suppose we <em>can</em> build a whole lot more stuff, faster. <em>Should</em> we? I don’t know about you,\n but I am regularly enraged at tools that work just fine popping up “wonderful new features” modals in front of what I’m\n trying to get accomplished. Also at damaging UI churn, driven by product managers trying to get promoted. It’s\n just not obvious \n that speeding up software development is, in the big picture, a good thing.</p>\n <p>And I can’t help noting that every attempt to measure the productivity boost due to GenAI has shown zero (or worse)\n improvement. Of course, Claude’s cheering section will point out that those studies date to 2024 which is the stone age. Maybe\n they’re right.</p>\n <h2 id=\"p-8\">Vampires</h2>\n <p>(In which I once again go all\n <a href=\"/ongoing/When/202x/2023/01/16/Class-Reductionism\">class-reductionist</a>.) The real problem here is late-stage\n capitalism, and I think is best addressed in Yegge’s <cite>AI Vampires</cite> piece, from which I quote: \n “…dollar-signs appear in their <i>[employers’]</i> eyeballs, like cartoon bosses. I know that look. There’s no reasoning with\n the dollar-eyeball stare.” Yeah.</p>\n <p>Thus the ancient question: <i>cui bono?</i> Assuming GenAI genuinely boosts productivity, who gets the\n benefits? Because the ownership class sure doesn’t think they should go to their newly-more-efficient employees.</p>\n <h2 id=\"p-7\">But, what do I know?</h2>\n <p>I know that you gotta have test coverage or your software is an unmaintainable tangle of festering tech debt. I know you gotta\n have code review or your quality is on inexorable downhill drift. I <em>don’t</em> know how to build LLMs into a sane,\n sustainable software engineering culture. Nor what to do \n about capitalism’s AI Vampires.</p>\n <p>And I absolutely do <em>not</em> believe the wild-eyed claims of 10× productivity gains, assuming we demand (as we should) that\n they’re sustainable at scale.</p>\n <p>So, would I advise executives to tell software engineering shops to discard their\n culture in favor of vibe coding in the expectation of monstrous productivity wins? Nope.\n <a href=\"https://simonwillison.net/2025/Oct/7/vibe-engineering/\">Vibe engineering</a>, maybe.\n\n <a href=\"https://locusmag.com/feature/commentary-cory-doctorow-reverse-centaurs/\">Centaurs, not reverse centaurs</a>? Indeed.</p>\n <p>But would I say “Stay away, don’t even look”? Nope. I’d probably suggest pointing the LLM at well-delimited non-strategic\n issues and \n optimizations, and emphasize no shortcuts on reviewing or CI/CD standards.</p>\n <p>Also note that the GenAI apostles are at one in saying that this year’s tools are <em>so</em> much better than last year’s,\n and next year’s are guaranteed to be qualitatively still better! So why would you rush in and risk getting locked into\n soon-to-be-outmoded tooling?</p>\n <p>Rob Sayre wrote “I would never bother to type out these patches by hand. But I read them all.” I probably wouldn’t have\n either and I read them too. And now Quamina is roughly twice as fast. Which is to say, I got good results on a hobby\n project. That’s not nothing.</p>\n <p>But, also not conclusive.\n Once the AI bubble pops and we’ve recovered from the systemic damage, I think there’ll <em>probably</em> be a place for\n open-source LLM automation in developer toolkits.</p>\n <p>But maybe not. Wouldn’t surprise me much, either way.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/AI",
"term": "Technology/AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "AI",
"term": "AI",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2",
"title": "Quamina + Claude, Case 2",
"description": "Last time out I described a bunch of incremental-improvement Quamina PRs from a colleague working with Claude Opus. Today I want to talk about Rishi Baldawa’s quamina-rs, a Claude-based port of Quamina from Go to Rust. The next post is about where I stand on GenAI and code",
"url": "https://www.tbray.org/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2",
"published": "2026-02-14T20:00:00.000Z",
"updated": "2026-02-14T20:00:00.000Z",
"content": "<p><a href=\"/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1\">Last time out</a> I described a bunch of incremental-improvement\n <a href=\"/ongoing/What/Technology/Quamina%20Diary/\">Quamina</a> PRs\n from a colleague working with Claude Opus. Today I want to talk about Rishi Baldawa’s\n <a href=\"https://github.com/baldawarishi/quamina-rs\">quamina-rs</a>, a Claude-based port of Quamina from Go to Rust.\n The next post is about where I stand on GenAI and code.</p>\n <p>Anybody who cares about this kind of thing will appreciate Rishi’s write-ups, starting with\n <a href=\"https://rishi.baldawa.com/posts/the-agents-kept-going/\">The Agents Kept Going</a> (also see\n <a href=\"https://rishi.baldawa.com/posts/scaffolding-for-agent-velocity/\">Scaffolding for Agent Velocity</a>).\n He doesn’t just say what he did, he draws lessons; good ones, I think.</p>\n <h2 id=\"p-1\">Background</h2>\n <p>Rishi and I worked together at AWS, can’t remember the details, but after I left he took over what we called Ruler, now known\n as <a href=\"https://github.com/aws/event-ruler\">aws/event-ruler</a>, Quamina’s ancestor. At the time I left it had been adopted\n by quite a number of AWS and Amazon services and various instances were processing, in aggregate, a remarkable number of\n millions of events per second. So he knows the territory.</p>\n <p>As for quamina-rs, go read his blogs. I’ve got little to add, but here are a couple of juicy quotes: “…at some point while I was\n mindlessly kicking off these sessions, the agents started picking up open issues from the Go version and implementing them on\n their own.“ Also, “And I think that’s the thing worth saying plainly. It’s human to care. Agents don’t care. Automation doesn’t\n care. They need to be told what to care about, and even then they’ll misbehave the moment you look away…”</p>\n <p>Both these stories ended with useful results.\n So empirically, you can get useful results by applying GenAI to the process of code construction.</p>\n <p>Yay. I guess. But there are a lot of smart people who think this whole LLM-fueled coding direction is irremediably toxic.\n\n <a href=\"/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion\">I’m not sure they’re wrong</a>.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/AI",
"term": "Technology/AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "AI",
"term": "AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology/Quamina Diary",
"term": "Technology/Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Quamina Diary",
"term": "Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1",
"title": "Quamina + Claude, Case 1",
"description": "With 47 years of coding under my belt, and still a fascination for the new shiny, obviously I’m interested what role (if any) GenAI is going to play in the future of software. But not interested enough to actually acquire the necessary skills and try it out myself. Someday, someday. Didn’t matter; two other people went ahead without asking and applied Claude to my current code playground, Quamina. Here’s the first story. I’m going to go ahead and share it even though it will make people mad at me",
"url": "https://www.tbray.org/ongoing/When/202x/2026/02/06/Q-Plus-C-Ch1",
"published": "2026-02-06T20:00:00.000Z",
"updated": "2026-02-06T20:00:00.000Z",
"content": "<p>With 47 years of coding under my belt, and still a fascination for the new shiny, obviously I’m interested what role (if any)\n GenAI is going to play in the future of software. But not interested enough to actually acquire the necessary skills and\n try it out myself. Someday, someday. Didn’t matter; two other people went ahead without asking and applied Claude to my current\n code playground, <a href=\"/ongoing/What/Technology/Quamina%20Diary/\">Quamina</a>. Here’s the first story. I’m going to go\n ahead and share it even though it will make people mad at me.</p>\n <h2 id=\"p-1\">Why share?</h2>\n <p>Because our profession’s debate on this topic is simultaneously ridiculous and toxic. No meaningful dialogue seems possible\n between the\n <a href=\"https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04\">Gas Town</a>-and-<a href=\"https://en.wikipedia.org/wiki/Moltbook\">Moltbook</a>\n faction and the\n <a href=\"https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/\">“AI” is a dick move</a> camp.\n So, I’m not going to join in today. This is pure anecdata: What happened when Rob applied Claude to Quamina. I’m going to \n avoid rhetoric (in the linguistic sense, language designed to convince) and especially polemic (language designed to\n attack). I promise to have conclusions before too long, just not today.</p>\n <h2 id=\"p-2\">What happened was…</h2>\n <p>There’s this guy\n <a href=\"https://github.com/sayrer\">Rob Sayre</a>, I’ve known him for many years, even been in the same room once or twice,\n in the context of IETF work. I’ve never previously collaborated on code with him. Starting in\n mid-January, he’s sent\n <a href=\"https://github.com/timbray/quamina/issues?q=is%3Apr%20author%3Asayrer\">a steady flow of PRs</a>, most of which I\n eventually accept and merge.</p>\n <p>The net result is that Quamina is now roughly twice as fast on several benchmarks designed to measure typical tasks.</p>\n <h2 id=\"p-3\">Technical details</h2>\n <p>The details of what Quamina is and does are in the\n <a href=\"https://github.com/timbray/quamina?tab=readme-ov-file#quamina\">README</a>. For this discussion, let’s ignore everything\n except to say that it’s a Go library and consider its two most important APIs. <code>AddPattern()</code> adds a Pattern (literal or\n regexp) to an instance, and\n <code>MatchesForEvent</code> considers a JSON blob and reports back which Patterns it matched. It’s really fast and the\n relationship is pleasingly weak between the number of Patterns that have been added and the matching speed.</p>\n <p>Quamina is based around finite automata (both deterministic and nondeterministic) and the rest of this technical-details\n section will throw around NFA and DFA jargon, sorry about that.</p>\n <p>For code like this that is neither I/O-bound nor UI-centric, performance is really all about choosing the right\n algorithms. Once you’ve done that, it’s mostly about memory management. Obviously in Quamina, the <code>AddPattern</code> call\n needs to allocate memory to hold the finite automata. But I’d like it if the <code>MatchesForEvent</code> didn’t.</p>\n <p>Go’s only built-in data structures are “map” i.e. hash table, and “slice” i.e. appendable array. (For refugees from Java, with\n its dozens of flavors of lists and hashes, this is initially shocking, but most Go fans come to the conclusion that Go is right\n and Java is wrong.)\n In really well-optimized\n code, you’d like to see all the time spent either in your own logic or in appending to slices and updating maps.</p>\n <p>In less-well-optimized code, the profiler will show you spending horrifying amounts of time in runtime routines whose names\n include “malloc”, and in the garbage collector.\n Now, both maps and slices grow automatically as needed, which is nice, except when you’re trying to minimize allocation.\n It turns out that slices have a <b>capacity</b>, and as long as the number of things you append is less than the capacity, you won’t\n allocate, which is good. Thus, there are two standard tricks in the inventory of 100% of people who’ve optimized Go code:</p>\n <ol>\n <li><p>When you make a new slice, give it enough capacity to hold everything you’re going to be adding to it. Yes, this can\n be hard because you’re probably using it to store input data of unpredictable size, thus…</p></li>\n <li><p>After you’ve made a new slice, keep it around, clear it after each input record, and its capacity will naturally grow\n until it gets to be big enough that it fits all the rest of the records, then you’ll never allocate again.</p></li>\n </ol>\n <h2 id=\"p-4\">Those PRs</h2>\n <p>Background: Quamina is equipped with what I think is a pretty good unit-test suite, and multiple benchmarks.</p>\n <p>I started getting Rob’s PRs and initially, 100% of them were finding ways along both of those well-trodden map-and-slice\n paths, in places where I hadn’t noticed the opportunity. They were decent PRs, well-commented, sensible code, no loss of test\n coverage. After I asked to see benchmark runs to prove the gains weren’t just theoretical, they started including benchmark runs. I’ve\n found a few things to push back on but Rob and I had no problem sorting those out.</p>\n <p>At the end of the day I had no qualms about merging them, but I did find myself wondering how they were built. So I\n asked.</p>\n <h2 id=\"p-6\">Workflow</h2>\n <p>Rob had told me right away on the first one that these were substantially Claude-generated. I asked him for his workflow and part\n of what he said was “I might say\n ‘let's do some profiles of memory and CPU on this benchmark, on main and on this branch.’ It will come up with good and bad\n ideas, then I pick them.”</p>\n <p>Also: “What might be counter-intuitive is that I can context switch really quickly with it. So, you leave a comment, and I\n just tell Claude to fix that, because you are correct. Sometimes I go in and hand edit, but usually it gets close or perfect\n (what they call a \"one-shot\"). But I just have the conversation open, so I just pick up where we left off.”</p>\n <p>Here’s a sample of Claude talking to Rob. You may have to enlarge it.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2026/02/06/claude-says.png\" alt=\"Dialogue with Claude\"></img>\n <h2 id=\"p-7\">Not just the same-old</h2>\n <p>Then I got a surprise, because Claude and Rob spotted two pretty big improvements that aren’t on the standard list.\n First: To traverse an NFA, for each state you have to compute its “epsilon closure”, the set of other states you can get to\n transitively following epsilon transitions. I had already built a cache so that as you computed them, they got remembered.\n C&R pointed out “Epsilon closures are a property of the automaton structure, not the input data. Once a pattern is added and the\n NFA is built, the epsilon closure for any given state is fixed and never changes.” So you might as well compute it and save it\n when you build the NFA.</p>\n <p>This is even better than it sounds, because (for good reasons following from Quamina’s concurrency model) my closure\n caches were per-thread, while the new epsilon closures were global, stored just once for all the threads. Not bad, and not trivial.</p>\n <p>Second, when you’re computing those closures, you have to memo-ize the key functions to avoid getting caught in NFA loops.\n I’d done this with a set, which in Go you implement as <code>map[whatever]bool</code>. R&C figured out that if you gave each\n state a “closure generation” integer field and maintained a global closure-generation value, you could dodge the necessity for the\n set at the cost of one integer per state. The benchmarks proved it worked.</p>\n <p>As I wrote this piece,\n <a href=\"https://github.com/timbray/quamina/pull/491\">another PR arrived</a> with a stimulating title: “kaizen: allocation-free\n on the matching path”.</p>\n <h2 id=\"p-5\">Kaizen?</h2>\n <p>It’s\n <a href=\"https://en.wikipedia.org/wiki/Kaizen\">the idea that</a> you make things substantially better by successively introducing\n small improvements. We try to \n use the term to tag Quamina PRs that change no semantics but just make performance better or more reliable or whatever.</p>\n <h2 id=\"p-8\">But GenAI is bad!?!</h2>\n <p>Yes, so they say. Go re-read that\n <a href=\"https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/\">dick-move</a> polemic.</p>\n <p>But, I’m going to leave this little case study conclusion-free for a bit because there are two follow-up pieces.\n Next,\n <a href=\"/ongoing/When/202x/2026/02/14/Q-Plus-C-Ch2\">the story of quamina-rs</a>, a Claude-drive port of Quamina to Rust.\n Finally, <a href=\"/ongoing/When/202x/2026/02/16/GenAI-and-OSS-opinion\">Open Source and GenAI?</a>.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/AI",
"term": "Technology/AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "AI",
"term": "AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology/Quamina Diary",
"term": "Technology/Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Quamina Diary",
"term": "Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/02/03/Long-Links",
"title": "Long Links",
"description": "Welcome to the first Long Links of this so-far-pretty-lousy 2026. I can’t imagine that anyone will have time to take in all of these, but there’s a good chance one or two might brighten your day",
"url": "https://www.tbray.org/ongoing/When/202x/2026/02/03/Long-Links",
"published": "2026-02-03T20:00:00.000Z",
"updated": "2026-02-04T22:41:25.000Z",
"content": "<p>Welcome to the first <cite>Long Links</cite> of this so-far-pretty-lousy 2026. I can’t imagine that anyone will have time to\n take in all of these, but there’s a good chance one or two might brighten your day.</p>\n <h2 id=\"p-17\">Unclassified</h2>\n <p>Thomas Piketty is always right. For example,\n <a href=\"https://thomaspiketty.wordpress.com/2026/02/03/europe-a-social-democratic-power/\">Europe, a social-democratic\n power</a>.</p>\n <p>Lying is wrong. Conservatives\n <a href=\"https://thetyee.ca/Opinion/2026/02/02/Today-Conservatives-Misinformation-Norm/\">do it all the time</a>. To be fair,\n that piece is about the capital-C flavor, as in the Canadian Tories. But still.</p>\n\n <p>Clothing is open-source: “If you slice the different parts off with a seamripper, lay them all down, trace them on new\n fabric, cut them out, and stitch them back together, you can effectively clone and fork\n garments.” From\n <a href=\"https://wiki.xxiivv.com/site/devine_lu_linvega.html\">Devine Lu Linvega</a>.</p>\n <p>The Universe is weird. The Webb telescope keeps showing astronomers things that shouldn’t be there. For example,\n <a href=\"https://www.nature.com/articles/s41586-025-09973-1\">An X-ray-emitting protocluster at z ≈ 5.7 reveals rapid structure\n growth</a>; ignore the title and read the Abstract and Main sections. With pretty pictures!</p>\n <h2 id=\"p-2\">Music</h2>\n <p>One time in Vegas, I was giving a speech, something about cloud computing, and was surprised to find the venue an ornate\n velvet-lined theater. I found out from the staff, and then relayed to the audience, that the last human before me to stand on this stage\n in front of an audience had been Willie Nelson. I was tempted to fall to my knees and kiss the boards.\n <a href=\"https://www.newyorker.com/magazine/2025/12/29/willie-nelson-profile\">How Willie Nelson Sees America</a>, from <cite>The\n New Yorker</cite>, is subtitled “On the road with the musician, his band, and his family” but it ends up being the kernel of a\n good biography of an interesting person. Bonus link; on YouTube,\n <a href=\"https://www.youtube.com/watch?v=3WIR3Riq4wM\">Willie Nelson - Teatro, featuring Daniel Lanois & Emmylou Harris,\n Directed by Wim Wenders</a>. Strong stuff.</p>\n <p>Speaking of recorded music, check out\n <a href=\"https://www.dazeddigital.com/music/article/69407/1/why-listening-parties-are-everywhere-right-now-rosalia-album-launch-artist\">Why \n listening parties are everywhere right now</a>. Huh? They are? As a deranged audiophile, sounds like my kind of thing. I’d go.</p>\n <h2 id=\"p-4\">Somewhere to put worker bees</h2>\n <p>When I was working at AWS in downtown Vancouver back starting in 2015, a lot of our junior engineers lived in these\n teeny-tiny little one-room-tbh apartments. It worked out pretty well for them, they were affordable and an easy walk from the\n office and these people hadn’t built up enough of a life to need much more room.\n For a while this trend of\n so-called-“studio” flats was the new hotness in Vancouver and I guess around quite a bit of the developed world.\n Us older types with families would look at the\n condo market and tell each other “this is stupid”.</p>\n <p>We were right. The\n bottom is falling out and they’re sitting empty in their thousands. And not just the teeniest either, the whole\n condo business is in the toilet. It didn’t help that for a few years all the prices went up every year (until they didn’t) and\n you could make serious money flipping unbuilt condos, so lots of people did (until they didn’t).</p>\n <p>Anyhow, here’s a nice write-up on the subject:\n <a href=\"https://www.bbc.com/news/articles/cqxq32zzq8eo\">‘Somewhere to put worker bees’: Why Canada's micro-condos are losing\n their appeal</a>. (From the BBC, huh?)</p>\n <h2 id=\"p-5\">AI AI AI</h2>\n <p>Sorry, I can’t not relay pro- and anti-GenAI posts, because that conversation is affecting all our lives just now. I am\n actually getting ready to decloak my own conclusions, but for the moment I’m just sharing essays on the subject that strike me as\n well-written and enjoyable for their own sake. Thus\n <a href=\"https://www.baldurbjarnason.com/notes/2026/note-on-debating-llm-fans/\">‘AI' is a dick move, redux</a> from Baldur\n Bjarnason. Boy, is he mad.</p>\n <p>Sam Ruby has been doing some\n <a href=\"https://intertwingly.net/blog/2026/01/28/Twilight-Zone.html\">extremely weird shit</a>, running Rails in the browser, as\n in without even a network connection or a Ruby runtime. Yes, AI was involved in the construction.</p>\n <h2 id=\"p-6\">Software</h2>\n <p>There’s this programming language called Ivy that is in the APL lineage; that acronym will leave young’uns blank but a few greying\n eyebrows will have been raised. Anyhow,\n <a href=\"https://commandcenter.blogspot.com/2026/01/implementing-transcendental-functions.html?m=1\">Implementing the\n transcendental functions in Ivy</a> is delightfully geeky, diving deep with no awkwardness. By no less than Rob Pike.</p>\n <p>Check out Mike Swanson’s\n <a href=\"https://blog.mikeswanson.com/backseat-software/\">Backseat Software</a>. That’s “backseat” as in “backseat driver”,\n which today’s commercial software has now, annoyingly, become. This piece doesn’t make any points that I haven’t heard (or made\n myself) elsewhere, but it pulls a lot of the important ones together in a well-written and compelling package. Recommended.</p>\n <p>Old Googler Harry Glaser\n <a href=\"https://www.linkedin.com/posts/harryglaser_i-worked-on-ads-at-google-15-years-ago-when-activity-7423057144402427905-nm3p/\">reacts\n with horror</a> to the introduction of advertising by OpenAI, and makes gloomy predictions about how it will evolve. His predictions\n are obviously correct.</p>\n <p>The title says it:\n <a href=\"https://petapixel.com/2026/01/17/discovering-a-digital-photo-editing-workflow-beyond-adobe/\">Discovering a Digital\n Photo Editing Workflow Beyond Adobe</a>. It’d be a tough transition for me, but the relationship with Adobe gets harder and\n harder to justify.</p>\n <h2 id=\"p-7\">Indigenous reconciliation</h2>\n <p>Khelsilem is one of the loudest and clearest voices coming out of the Squamish nation, one of the larger and better-organized\n Indigenous communities around here.</p>\n <p>There has been a steady drumbeat of Indigenous litigation going on for decades as a\n consequence of the fact that the British colonialists who seized the territory in what we now call British Columbia didn’t\n bother to sign treaties with the people who were already there, they just assumed ownership. The Indigenous people have been\n winning a lot of court cases, which makes people nervous.</p>\n <p>Anyhow, Khelsilem’s\n <a href=\"https://khelsilem.substack.com/p/the-source-of-the-reconciliation\">The Real Source of Canada's Reconciliation Panic</a>\n covers the ground. I’m pretty sure British Columbians should read this, and suspect that anyone in a jurisdiction undergoing similar\n processes should too.</p>\n <h2 id=\"p-8\">Resonant computing, Black and Blue sky</h2>\n <p>There’s this thing called the \n <a href=\"https://resonantcomputing.org\">Resonant Computing Manifesto</a>, whose authors and signatories include names you’d\n probably recognize. Not mine; the first of its Five Principles begins with “In the era of AI…” Also, it is entirely oblivious to\n the force driving the enshittification of social-media platforms: Monopoly ownership and the pathologies of late-stage\n capitalism.</p>\n <p>Having said that, the vision it paints is attractive. And having said <em>that</em>, it’s now featured on the flags waved by\n the proponents of ATProto, which is to say Bluesky. See Mike Masnick’s\n <a href=\"https://www.techdirt.com/2026/01/27/atproto-the-enshittification-killswitch-that-enables-resonant-computing/\">ATproto:\n The Enshittification Killswitch That Enables Resonant Computing</a> (Mike is on Bluesky Corp’s Board). That piece is OK but, in\n the comments, Masnick quickly gets snotty about the Fediverse and Mastodon, in a way that I find really off-putting. And once\n again, says nothing about the underlying economic realities that poison today’s platforms.</p>\n <p>I want to like Bluesky, but I’m just too paranoid and cynical about money. It is entirely unclear who is funding the people\n and infrastructure behind Bluesky, which matters, because if Bluesky Corp goes belly-up, so does the allegedly-decentralized service.</p>\n <p>On the other hand,\n <a href=\"https://blackskyweb.xyz\">Blacksky</a> is interesting. They are trying to prove that ATProto really can be made\n decentralized in fact not just in theory.\n <a href=\"https://blackskyweb.xyz/overview/\">Their ideas and their people</a> are stimulating, and their\n <a href=\"https://opencollective.com/blacksky\">finances are transparent</a>. I’ll be\n <a href=\"https://docs.blacksky.community/migrating-to-blacksky-pds-complete-guide\">moving my ATProto presence to Blacksky</a>\n when I get some cycles and the process has become a little more automated.</p>\n <h2 id=\"p-14\">Good crypto</h2>\n <p>The cryptography community is working hard on the problem of what happens should quantum computers ever become real products as\n opposed to over-invested fever dreams. Because if they ever work, they can probably crack the algorithms that we’ve been using\n to provide basic Web privacy.</p>\n <p>The problem is technically\n hard<span class=\"dashes\"> —</span> there are good solutions though<span class=\"dashes\"> —</span> and also politically fraught,\n because maybe the designers or standards orgs are corrupt or incompetent. It’s reasonable to worry about this stuff and people\n do. They probably don’t need to: Sophie Schmieg dives deep in\n <a href=\"https://keymaterial.net/2025/11/27/ml-kem-mythbusting/\">ML-KEM Mythbusting</a>.</p>\n <h2 id=\"p-16\">Books</h2>\n <p>Here’s one of the most heartwarming things I’ve read in months:\n <a href=\"https://blog.openlibrary.org/2026/01/30/a-community-curated-nancy-drew-collection/\">A Community-Curated Nancy Drew\n Collection</a>. Reminder: The Internet can still be great.</p>\n <p>John Lanchester’s\n <a href=\"https://www.lrb.co.uk/the-paper/v46/n17/john-lanchester/for-every-winner-a-loser\">For Every Winner a Loser</a>,\n ostensibly a review of two books about famous financiers, is in fact an extended howl of\n (extremely instructive) rage against the\n financialization of everything and the unrelenting increase in inequality. What we need to do is to take the ill-gotten gains\n away from these people and put it to a use<span class=\"dashes\"> —</span> any use<span class=\"dashes\"> —</span> that improves\n human lives.</p>\n <p>I talk a lot about late-stage capitalism. But Sven Beckert published a\n <a href=\"https://www.nytimes.com/2025/11/26/books/review/capitalism-sven-beckert.html?searchResultPosition=1\">1,300-page monster entitled <cite>Capitalism</cite></a>;\n the link is to a <cite>NYT</cite> review and makes me want to read it..</p>\n <p>Charlie Stross, the sci-fi author, likes webtoons and\n <a href=\"https://www.antipope.org/charlie/blog-static/2025/12/webtoons-revisited.html\">recommends a bunch</a>. Be careful, do\n not follow those links if you’re already short of time. Semi- or fully-retired? Go ahead!</p>\n <p>I have history with dictionaries. For several years of my life in the late Eighties, I was the research project manager for\n the\n <a href=\"https://cs.uwaterloo.ca/~fwtompa/newoed-project.html\">New Oxford English Dictionary</a> project at the University of\n Waterloo. Dictionaries are a fascinating topic and, for much of the history of the publishing industry, were big money-makers;\n they dominate any short list of the biggest-selling books in history. Then came the Internet.</p>\n <p>Anyhow, Louis Menand’s\n <a href=\"https://www.newyorker.com/magazine/2025/12/29/unabridged-the-thrill-of-and-threat-to-the-modern-dictionary-stefan-fatsis-book-review\">Is\n the Dictionary Done For?</a> starts with a review of a book by Stefan Fatsis entitled <cite>Unabridged: The Thrill of (and\n Threat to) the Modern Dictionary</cite> which I haven’t read and probably won’t, but oh boy, Menand’s piece is big and rich and\n polished and just a fantastic read. If, that is, you care about words and languages. I understand there are those who don’t, which is\n weird. I’ll close with a quote from Menand:</p>\n <blockquote><p>“The dictionary projects permanence,” Fatsis concludes, “but the language is Jell-O, slippery and mutable and\n forever collapsing on itself.” He’s right, of course. Language is our fishbowl. We created it and now we’re forever trapped\n inside it.</p></blockquote>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "The World",
"term": "The World",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "The World",
"term": "The World",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/01/20/Quamina-2.0",
"title": "Quamina v2.0.0",
"description": "There’ve been a few bugfixes and optimizations since 1.5, but the headline is: Quamina now knows regular expressions. This is roughly the fourth anniversary of the first check-in and the third of v1.0.0. (But I’ve been distracted by family health issues and other tech enthusiasms.) Open-source software, it’s a damn fine hobby",
"url": "https://www.tbray.org/ongoing/When/202x/2026/01/20/Quamina-2.0",
"published": "2026-01-20T20:00:00.000Z",
"updated": "2026-01-21T23:27:06.000Z",
"content": "<p>There’ve been a few bugfixes and optimizations since 1.5, but the headline is:\n <a href=\"https://github.com/timbray/quamina?tab=readme-ov-file#quamina\">Quamina</a>\n now knows regular expressions. This is roughly the fourth anniversary of\n the first check-in and the third of v1.0.0. (But I’ve been distracted by family health issues and\n other tech enthusiasms.)\n Open-source software, it’s a damn fine\n hobby.</p>\n <p>Did I mention optimizations? There are <i>(sob)</i> also regressions; introducing REs had\n measurable negative impacts on other parts of the system.\n But it’s a good trade-off. When you ship software that’s designed for pattern-matching, it should\n really do REs. The RE story, about a year long, can be read starting\n <a href=\"/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series\">here</a>.</p>\n <h2 id=\"p-4\">Quamina facts</h2>\n <ol>\n <li><p>About 18K lines of code (excluding generated code), 12K of which are unit tests. The RE feature makes the tests run\n slower, which is annoying.</p></li>\n <li><p>Adding Quamina to your app will bulk your executable size up by about 100K, largely due\n to Unicode tables.</p></li>\n <li><p>There are a few shreds of AI-assisted code, none of much importance.</p></li>\n <li><p>A Quamina instance can match incoming data records on my 2023 M2 Mac at millions per\n second without much dependence on how many patterns are being matched at once. This assumes\n not too many horrible regular expressions. That’s per-thread of course, and Quamina does\n multithreading nicely.</p></li> \n </ol>\n <h2 id=\"p-1\">Next?</h2>\n <p>The\n <a href=\"https://github.com/timbray/quamina/issues\">open issues</a> are modest in number but\n some of them will be hard.</p>\n <p>I think I’m going to ignore that list for a while (PRs welcome, of course) and work on\n optimization. The introduction \n of epsilon transitions was required for regular expressions, but they really bog the matching\n process down. At Quamina’s core is the\n <a href=\"/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata\">finite-automaton merge</a> logic,\n which contains fairly elegant code but generally throws up its hands when confronted with\n epsilons and does the simplest thing that could possibly work. Sometimes at an annoyingly slow pace.</p>\n <p>Having said that, to optimize you need a good benchmark that pressures the\n software-under-test.\n Which is tricky, because Quamina is so fast that it’s hard to\n to feed it enough data to stress it without the feed-the-data code dominating\n the runtime and memory use. If anybody has a bright idea for how to pull together a good\n benchmark I’d love to hear it. I’m looking at\n <a href=\"https://go.dev/blog/testing-b-loop\">b.Loop()</a> in Go 1.24, any reason not to go there?</p>\n <h2 id=\"p-3\">Book?</h2>\n <p>It occurs to me that as I’ve wrestled with the hard parts of Quamina, I’ve done the obvious\n thing and trawled the Web for narratives and advice. And, more or less, been disappointed. Yes,\n there are many lectures and blogs and so on about this or that aspect of finite automata, but\n they tend to be mathemagical and theoretical and say little about how, practically speaking,\n you’d write code to do what they’re talking about.</p>\n <p>The Quamina-diary <span class=\"o\">ongoing</span> posts now contain several tens of thousands\n of words. Also I’ve previously written\n <a href=\"/ongoing/When/200x/2006/04/18/XML-Grammar\">quite a bit</a> about Lark, the world’s\n first XML parser, which I wrote and was automaton-based. So I think there’s a case for a slim\n volume entitled something like <cite>Finite-state Automata in the Code Trenches</cite>. It’d be\n a big money-maker, I betcha. I mean, when Apple TV brings it to the screen.</p>\n <h2 id=\"p-2\">Why?</h2>\n <p>Let’s be honest. While\n <a href=\"https://github.com/timbray/quamina\">the repo</a> has quite a few stars, I truly have no idea who’s\n using Quamina in production. So I can’t honestly claim that this work is making the\n world better along any measurable dimension.</p>\n <p>I don’t much care because I just can’t help it. I love executable abstractions for their own sake.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/Quamina Diary",
"term": "Technology/Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Quamina Diary",
"term": "Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/01/14/Unicode-Properties",
"title": "Losing 1½ Million Lines of Go",
"description": "Confession: My title is clickbait-y, this is really about building on the Unicode Character Database to support character-property regexp features in Quamina. Just halfway there, I’d already got to 775K lines of generated code so I abandoned that particular approach. Thus, this is about (among other things) avoiding those 1½M lines. And really only of interest to people whose pedantry includes some combination of Unicode, Go programming, and automaton wrangling. Oh, and GenAI, which (*gasp*) I think I should maybe have used",
"url": "https://www.tbray.org/ongoing/When/202x/2026/01/14/Unicode-Properties",
"published": "2026-01-14T20:00:00.000Z",
"updated": "2026-01-14T23:52:47.000Z",
"content": "<p>Confession: My title is clickbait-y, this is really about building on the Unicode Character Database to support\n character-property regexp features in\n <a href=\"https://github.com/timbray/quamina\">Quamina</a>.\n Just halfway there, I’d already got to 775K lines of generated code so I abandoned that particular approach. Thus, this\n is about (among other things) <em>avoiding</em> those 1½M lines. And really only of interest to people whose\n pedantry includes some combination of Unicode, Go programming, and automaton wrangling. Oh, and GenAI, which (*gasp*) I\n think I should maybe have used.</p>\n <h2 id=\"p-1\">Character property matching</h2>\n <p>I’m talking about regexp incantations like <code>[\\p{L}\\p{Zs}\\p{Nd}]</code>, which matches anything that Unicode classifies\n as a letter, a space, or a decimal number. (Of course, in Quamina “<code>\\</code>” is “<code>~</code>”\n <a href=\"/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#p-7\">for excellent reasons</a>, so that reads\n <code>[~p{L}~p{Zs}~p{Nd}]</code>.)</p>\n <p>(I’m writing about this now because I just launched\n <a href=\"https://github.com/timbray/quamina/pull/465\">a PR</a> to enable this feature. Just one more to go before I can\n release a new version of Quamina with full regexp support, yay.)</p>\n <h2 id=\"p-3\">Finding the properties</h2>\n <p>To build an automaton that matches something like that, you have to find out what the character properties are.\n This information comes from the\n <a href=\"https://www.unicode.org/ucd/\">Unicode Character Database</a>, helpfully provided online by the Unicode consortium.\n Of course, most programming languages have libraries that will help you out, and\n <a href=\"https://pkg.go.dev/unicode#pkg-variables\">that includes Go</a>, but I didn’t use it.</p>\n <p>Unfortunately, Go’s library doesn’t get updated every time Unicode does. As of now, January 2026,\n it’s still stuck at Unicode 15.0.0, which\n <a href=\"https://www.unicode.org/history/publicationdates.html\">dates to September 2023</a>; the latest version is 17.0.0, last\n September. Which means there are plenty of Unicode characters Go doesn’t know about, and I didn’t want Quamina to settle\n for that.</p>\n <p>So, I fetched and parsed the famous master file from\n <a href=\"https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt\">www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt</a>.\n Not exactly rocket science, it’s a flat file with <code>;</code>-delimited fields, of which I only cared about the first\n and third. There are some funky bits, such as the pair of nonstandard lines indicating that the Han characters occur\n between U+4E00 and U+9FFF inclusive; but still not really taxing.</p>\n <p>The output is, for each Unicode category, and also for each category’s complement (<code>~P{L}</code> matches everything\n that’s <em>not</em> a letter; note the capital <code>P</code>), a list of pairs of code points, each pair indicating a subset\n of the code space where that category applies. For example, here’s the first line of character pairs with category <code>C</code>.</p>\n <pre><code> {0x0020, 0x007e}, {0x00a0, 0x00ac}, {0x00ae, 0x0377},</code></pre>\n <p>How many pairs of characters, you might wonder? There are 37 categories\n and it’s all over the place but adds up to a lot. The top three categories\n are L with 1,945 pairs, Ll at 664, and M at 563. At the other end are Zl and Zp, both with just 1.\n The total number of pairs is 14,811, and the generated Go code is a mere 5,122 lines.</p>\n <h2 id=\"p-5\">Character-property automata</h2>\n <p>Turning these creations into finite automata was straightforward: I already had the code to handle regexps like\n <code>[a-zA-Z0-9]</code>, logically speaking the same problem. But, um, it wasn’t fast. My favorite unit test, an exercise in\n <a href=\"/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1\">sample-driven development</a> with 992 regexps,\n suddenly started taking multiple seconds, and my whole unit-test suite expanded from around ten seconds to over twelve; since I\n tend to run the unit tests every time I take a sip of coffee or scratch my head or whatever, this was painful. And it occurred to\n me that it would be painful in practice to people who want for some good reason or another to load up a bunch of\n Unicode-property patterns into a Quamina instance.</p>\n <p>So, I said to myself, I’ll just precompute all the automata and serialize them into code. And now we\n get to the title of this essay; my data structure is a bit messy and ad-hoc and just for the categories, before I got to the\n complement versions, I was generating 775K lines of code.</p>\n <p>Which worked! But, it was 12M in size and while Go’s runtime is fast, there was a painful pause while it absorbed those data\n structures on startup. Also, opening the generated file regularly caused my IDE\n (<a href=\"https://www.jetbrains.com/go/\">Goland</a>) to crash. And I was only halfway there. The whole approach was painful to\n work with so I went looking for Plan B.</p>\n <p>The code that generates the automaton from the code point pairs is pretty well the simplest thing that could possibly work\n and it was easy to understand but burned memory like crazy. So I worked for a bit on making it faster and\n cheaper, but so far have found no low-hanging fruit.</p>\n <p>I haven’t given up on that yet. But in the meantime, I remembered \n Computer Science’s general solution for all performance problems, by which I mean caching. So now, any Quamina instance will\n compute the automaton for a Unicode property the first time it’s used, then remember it. So now Quamina’s speed at adding\n Unicode-property regexps to an instance has increased from 135/second to 4,330, a factor of thirty and Good Enough For\n Rock-n-Roll.</p>\n <p>It’s worth pointing out that while <em>building</em> these automata is a heavyweight process, Quamina can use them to match\n input messages at its typical rates, hundreds of thousands to millions per second. Sure, these automata are “wide”, with lots of\n branches, but they’re also shallow, since they run on UTF-8 encoded characters whose maximum length is four and average length\n is much less. Most times you only have to take one or two of those many branches to match or fail.</p>\n <h2 id=\"p-2\">Should I have used Claude?</h2>\n <p>This particular segment of the Quamina project included some <em>extremely</em> routine programming tasks, for example\n fetching and parsing\n UnicodeData.txt, computing the sets of pairs, generating Go code to serialize the automata, reorganizing source files that had\n become bloated and misshapen, and writing unit tests to confirm the results were correct.</p>\n <p>Based on my own\n <a href=\"/ongoing/When/202x/2025/07/01/First-AI-Code\">very limited experience</a> with GenAI code, and in particular after\n reading Marc Brooker’s\n <a href=\"https://brooker.co.za/blog/2025/12/16/natural-language.html\">On the success of ‘natural language programming’</a> and\n Salvatore (“antirez”) Sanfilippo’s\n <a href=\"https://antirez.com/news/158\">Don't fall into the anti-AI hype</a>, I guess I’ve joined the camp that thinks\n this stuff is going to have a place in most developers’ toolboxes.</p>\n <p>I think Claude could have done all that boring stuff, including acceptable unit tests, way faster than I did.\n And furthermore got it right the first time, which I didn’t.</p>\n <p>So why didn’t I use Claude? Because I don’t have the tooling set up and I was impatient and didn’t want to invest the time in\n getting all that stuff going and improving my prompting skills. Which reminds me of all the times I’ve been trying to evangelize other\n developers on a better way to do things and was greeted by something along the lines of “Fine, but I’m too busy right now, I’ll\n just going on doing things the way I already know how to.”</p>\n <p>Does this mean I’m joining the “GenAI is the future and our investments will pay off!” mob? Not in the slightest. I still\n think it’s overpriced, overhyped, and mostly ill-suited to the business applications that “thought leaders” claim for it.\n That word “mostly” excludes the domain of code; as I said\n <a href=\"/ongoing/When/202x/2025/09/26/GenAI-Predictions#p-5\">here</a>, “It’s pretty obvious that LLMs are better at predicting code\n sequences than human language.”</p>\n <p>And, as it turns out, the domain of Developer Tools has never been a Big Business by the standards of GenAI’s promoters. Nor\n will it ever be; there just aren’t enough of us. Also, I suspect it’ll be reasonably easy in the near future for open-source\n models and agents to duplicate the capabilities of Claude and its ilk.</p>\n <p>Speaking personally, I can’t wait for the bubble to pop.</p>\n <h2 id=\"p-4\">Quamina.next?</h2>\n <p>After I ship the numeric-quantifier feature, e.g. <code>a{2-5}</code>, Quamina’s regexp support will be complete and if no\n horrid bugs pop up I’ll pretty quickly release Quamina 2.0. Regexps in pattern-matching software are a qualitative difference-maker. \n After that I dunno, there are lots more interesting features to add.</p>\n <p>Unfortunately, a couple years into my Quamina work, I got distracted by life and by other projects, and ignored it. One\n result is that so did the other people who’d made major contributions and provided PR reviews. I miss them and it’s less fun\n now. We’ll see.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/Quamina Diary",
"term": "Technology/Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Quamina Diary",
"term": "Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2026/01/01/Quamina-2026",
"title": "Regexp Lessons",
"description": "I’m just landing a chonky PR in Quamina whose effect is to enable the + and * regexp features. As in my last chapter, this is a disorderly war story not an essay, and probably not of general interest. But as I said then, the people who care about coercing finite automata into doing useful things at scale are My People (there are dozens of us)",
"url": "https://www.tbray.org/ongoing/When/202x/2026/01/01/Quamina-2026",
"published": "2026-01-01T20:00:00.000Z",
"updated": "2026-01-06T18:19:29.000Z",
"content": "<p>I’m just landing a\n <a href=\"https://github.com/timbray/quamina/pull/461\">chonky PR</a> in\n <a href=\"https://github.com/timbray/quamina\">Quamina</a> whose effect is to enable the <code>+</code> and <code>*</code> regexp\n features. As in my\n <a href=\"/ongoing/When/202x/2025/07/21/Automaton-merge-war\">last chapter</a>, this is a disorderly war story not an essay, and\n probably not of general interest. But\n as I said then, the people who care about coercing finite automata into doing useful things at scale are My People (there are\n <em>dozens</em> of us).</p>\n <h2 id=\"p-5\">2014-2026</h2>\n <p>As I write this, I’m sitting in the same couch in my Mom’s living room in Saskatchewan where, on my first Christmas after\n joining AWS, I got the first-ever iteration of this software to work. That embryo’s mature form is available to the world as\n <a href=\"https://github.com/aws/event-ruler\">aws/event-ruler</a>. (Thanks, AWS!) Quamina is its direct descendent, which means\n this story is entering its twelfth year.</p> \n <p>Mom is now 95 and good company despite her failing memory. I’ve also arrived at a qualitatively later stage of life than in\n 2014, but would like to report back from this poorly-lit and often painful landscape: Executable abstractions are still fun,\n even when you’re old.</p>\n <p>Anyhow, the reason I’m writing all this stuff isn’t to expound on the nature of finite automata or regular expressions, it’s\n to pass on lessons from implementing them.</p>\n <h2 id=\"p-8\">Lesson: Seek out samples</h2>\n <p>In a previous episode I used the phrase\n <a href=\"/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1\">Sample-driven development</a> to describe my luck in\n digging up 992 regexp test cases, which reduced task task from intimidating to approachable.\n I’ve never previously had the luxury of wading into a big software task armed with loads of test cases written by other\n people, and I can’t recommend it enough. Obviously you’re not always going to dig this sort of stuff up, but give it a sincere\n effort.</p>\n <h2 id=\"p-9\">Lesson: Break up deliverables</h2>\n <p>I decomposed regular expressions into ten unique features, created an enumerated type to identify them, and implemented them\n by ones and twos. \n Several of the feature releases used\n techniques that turned out to be inefficient or just wrong when it came to subsequent features. But they worked,\n they were useful, and my errors nearly all taught me useful lessons.</p>\n <p>Having said that, here’s some cool output that combines this lesson and the one above, from the unit test that runs \n those test cases. Each case has a regexp then one \n or more samples each of strings that should and shouldn’t match. I instrumented the test to report the usage of regexp features\n in the match and non-match cases.</p>\n <pre>Feature match test counts:\n 32 '*' zero-or-more matcher\n 27 () parenthetized group\n 48 []-enclosed character-class matcher\n 7 '.' single-character matcher\n 29 |-separated logical alternatives\n 16 '?' optional matcher\n 29 '+' one-or-more matcher\n \nFeature non-match test counts:\n 45 '+' one-or-more matcher\n 24 '*' zero-or-more matcher\n 31 () parenthetized group\n 49 []-enclosed character-class matcher\n 6 '.' single-character matcher\n 32 |-separated logical alternatives\n 21 '?' optional matcher</pre>\n <p> Of course, since most of the tests combine multiple features, the numbers for all the features\n get bigger each time I implement a new one. Very confidence-building.</p>\n <h2 id=\"p-2\">Lesson: Thompson’s construction</h2>\n <p>This is the classic nineteen-sixties regular-expression implementation by Ken Thompson, described in Wikipedia\n <a href=\"https://en.wikipedia.org/wiki/Thompson%27s_construction\">here</a> and (for me at least) more usefully, in a\n storytelling style by Russ Cox,\n <a href=\"https://swtch.com/%7Ersc/regexp/regexp1.html\">here</a>.</p>\n <p>On several occasions I rushed ahead and implemented a feature without checking those sources, because how hard could it be?\n In nearly every case, I had problems with that first cut and then after I went and consulted the oracle, I could see where I’d\n gone wrong and how to fix it.</p>\n <p>So big thanks, Ken and Russ.</p>\n <h2 id=\"p-3\">Lesson: List crushing</h2>\n <p>In some particularly nasty regular expressions that\n combine <code>[]</code> and <code>?</code> and <code>+</code> and <code>*</code>, you can\n get multiple states connected in complicated ways with epsilon links.</p>\n <p>In Thompson’s Construction, traversing an NFA transitions not just from one state to another but from a current set of states\n to a next set, repeat until you match or fail. You also compute epsilon closures as you go along; I’m skipping over details\n here. The problem was that traversing these pathologically complex regexps with a sufficiently long string was leading to an\n exponential explosion in the current-states and next-states sizes<span class=\"dashes\"> —</span> not a figure of speech, I mean\n <code>O(2<sup>N</sup>)</code>. And despite the usage of the word “set” above, these weren’t, they contained endless\n duplicates.</p>\n <p>The <em>best</em> solution would be to study the traversal algorithm and improve it so it didn’t emit fountains of dupes. That\n would be hard. The next-best would to turn these things into actual de-duped sets, but that would require a hash table right in\n the middle of the traversal hot spot, and be expensive.</p>\n <p>So what I did was to detect whenever the next-steps list got to be longer than N, sorted it, and crushed out all the dupes.\n As I write, N is now 500 based on running benchmarks and finding a value that makes number go down.</p>\n <p>The reason this is good engineering is that the condition where you have to crush the list almost never happens, so in the\n vast majority of cases the the only cost is an <code>if len(nextSteps)>N</code> comparison. Some may find this approach\n impure, and they have a point. I would at some point like to go back and find a better upstream approach. But for now it’s still\n really fast in practice, so I sleep soundly.</p>\n <h2 id=\"p-4\">Lesson: Hell’s benchmark</h2>\n <p>I’ve\n <a href=\"/ongoing/When/202x/2025/07/21/Automaton-merge-war#p-1\">written before</a> about my struggles with the benchmark where I\n merge 12,959 wildcard patterns together. Back before I was doing epsilon processing correctly, I had a kludgey implementation\n that could match patterns in the merged FA at typical Quamina speeds, hundreds of thousands per second. With correct epsilon\n general-purpose epsilon handling, I have so far not been smart enough to find a way to preserve that performance. With the full\n 13K patterns, Quamina matches at less than 2K/second, and with a mere thousand, at 16K/second. I spent literally days\n trying to get better results, but decided that it was more valuable to Quamina to handle a large subset of regular expressions\n correctly than to run idiotically large merges at full speed.</p>\n <p>I’m pretty sure that given enough time and consideration, I’ll be able to make it better. Or maybe someone else who’s smarter\n than me can manage it.</p>\n <h2 id=\"p-11\">Question: What next?</h2>\n <p>The still-unimplemented regexp features are:</p>\n <pre>{lo,hi} : occurrence-count matcher\n~p{} : Unicode property matcher\n~P{} : Unicode property-complement matcher\n[^] : complementary character-class matcher</pre>\n <p>Now I’m wondering what to do next. <code>[^]</code> is pretty easy I think and is useful, also I get to invert a\n state-transition table. The\n <code>{lo,hi}</code> idiom shouldn’t be hard but I’ve been using regexps for longer than most of you have been alive and have\n never felt the need for it, thus I don’t feel much urgency. The Unicode properties I think have a good fun factor just because\n processing the Unicode character database tables is cool. And, I’ve used them.</p>\n <p><i>[Update: the <code>[^]</code> thing took a grand total of a couple of hours to build and test. Hmm, what next?]</i></p>\n <h2 id=\"p-10\">Lesson: Coding while aging</h2>\n <p>I tell people I keep working on code for the sake of preserving my mental fitness. But mostly I do it for fun. Same for\n writing about it. So, thanks for reading.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/Quamina Diary",
"term": "Technology/Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Quamina Diary",
"term": "Quamina Diary",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/12/18/Humanist-Plumbing",
"title": "Humanist Plumbing",
"description": "What happened was, a faucet started dripping. And then I managed to route around the malignant machineries of late-stage capitalism. These days, that’s almost always a story worth telling",
"url": "https://www.tbray.org/ongoing/When/202x/2025/12/18/Humanist-Plumbing",
"published": "2025-12-18T20:00:00.000Z",
"updated": "2025-12-20T18:40:20.000Z",
"content": "<p>What happened was, a faucet started dripping. And then I managed to route around the malignant machineries of late-stage\n capitalism. These days, that’s almost always a story worth telling.</p>\n <p>Normally, faced with a drip,\n we’d pull out the old cartridge, take it to the hardware store, and buy another to swap in.\n But the fixture in our\n <a href=\"/ongoing/When/202x/2025/02/28/Moved\">recently-acquired</a> place was kind of exotic and abstract and neither of us\n could figure it out. We were gloomy because we’ve had terrible luck over the years with the local plumbing storefronts.\n So…</p>\n <h2 id=\"p-1\">The neighbors</h2>\n <p>Our neighborhood has an online chat; both sides of the streets in a square around a single city block. This is our first\n experience with such a thing. I gather that these don’t always work out well, but this one has been mostly pretty great.</p>\n <p>So at 9AM I posted “Hey folks, looking for a plumber recommendation” and by ten there were three.</p>\n <p><i>[Late-stage capital: “You’re supposed to ask the AI in your browser. It’ll \n provide a handy link to a vendor based on geography and reviews but mostly advertising spend.\n Why would you want to talk to other people?”]</i></p>\n <h2 id=\"p-2\">Thomas</h2>\n <p>I picked a neighbor’s suggestion, first name\n Thomas, and called the number. “Thomas here” on the second ring. I explained and he said “What’s the brand name? If\n it’s one of those Chinese no-names I probably have to replace the whole thing.” I said “No idea, but I’ll take a picture and send it to\n you.”</p>\n <p>Turns out the brand was\n <a href=\"https://riobel.design/en/\">Riobel</a>, never heard of them. I texted Thomas a picture and he got right back to me: “That’s\n high-end, it’s got a lifetime warranty. I’ll come by a little after 5 and take it out. Their dealer is in PoCo (an outer suburb)\n and I live out there, so I can swap it.”</p>\n <p><i>[Late-stage capital: “You’re supposed to engage with the chatbot on the site we sent you to, which will integrate with your\n calendar and arrange for a diagnostic visit a week from Wednesday. You could call them but you’d be in voice-menu hell and\n eventually end up at the same chatbot.”]</i></p>\n <p>When Thomas showed up, with a sidekick, he was affable and obviously competent.\n Within five minutes I was glad I’d called for help; that faucet’s construction was highly non-obvious. Thomas knew what he was\n doing and it still took him the best part of a half-hour to get it all disassembled and the cartridge extracted.</p>\n <h2 id=\"p-6\">Nothing’s perfect</h2>\n <p>The next morning, a text from Thomas: “Bad news. That part is back-ordered till May at Riobel’s dealer. We can maybe get it \n online but you’d have to pay.” He attached a screenie of a Web search for the part number; there were several online\n vendors.</p>\n <p>It’s irritating that the “lifetime warranty” doesn’t seem to be helping me, but to be fair, the part was initially installed\n in 2011.</p>\n <p><i>[Late-stage capital: “Lifetime warranty? Huh? Oh, of course you mean our VIP-class\n subscription offering, that’s monthly with a\n discount for annual up-front payment.”</i> (And the part would still be back-ordered.)]</p>\n <h2 id=\"p-3\">Kolani</h2>\n <p>High-end plumbing parts are expensive. But one of Thomas’ recommendations,\n <a href=\"https://kolani.ca\">Kolani Kitchen and bath</a>, was asking less.</p>\n <p>They had a phone number on their\n Web site so I called it and the voice menu only had three options: Location, opening hours, and Operator.\n The operator was an intelligent human and picked up right away.\n “Hi, I’m looking at ordering a cartridge and wanted to see if you had it in stock.” “Gimme the part number?” I\n did and she went away for a couple of minutes and came back “Yeah, it’s in stock.” So I ordered it and I have a tracking\n number.</p>\n <p><i>[Late-stage capital: “There aren’t supposed to be independent dealers; the manufacturer has taken PE money and eliminated \n the middlemen to better capture all the value-add.\n Or maybe there’ll be a wholesaler, but just one, because another PE rolled up all the distributors to maximize pricing power.\n Either way, you won’t be able to get a human on the line.”]</i></p>\n <h2 id=\"p-7\">Payment</h2>\n <p>Next morning, I got an email that my order had been canceled. So I called that intelligent operator and she said “I was going\n to email you. Our system won’t take payment if the billing and delivery addresses are different. Sorry. If you’re in a hurry you\n could do an e-transfer?” (In Canada, all the banks are in a payments federation that makes this dead easy.) So I\n did and the part has shipped.</p>\n <p><i>[Late-stage capital: “What? If you’d used our Integrated online payment offering, it would all just work. What if it\n doesn’t, you ask? Yeah, sucks to be you in that situation, of course there’d be nobody you could talk to about that.”]</i></p>\n <p>Thomas came by again to put the old cartridge back in for now and said “This thing, don’t worry about a drip, it’s not fast\n and it probably won’t get worse. Text me when the new part gets in.”</p>\n <h2 id=\"p-5\">Late-stage capitalism</h2>\n <p>It won’t be missed when it’s gone.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Business",
"term": "Business",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Business",
"term": "Business",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble",
"title": "After the Bubble",
"description": "The GenAI bubble is going to pop. Everyone knows that. To me, the urgent and interesting questions are how widespread the damage will be and what the hangover will feel like. On that basis, I was going to post a link on Mastodon to Paul Krugman’s Talking With Paul Kedrosky. It’s great, but while I was reading it I thought “This is going to be Greek to people who haven’t been watching the bubble details.” So consider this a preface to the Krugman-Kedrosky piece. If you already know about the GPU-fragility and SPV-voodoo issues, just skip this and go read that",
"url": "https://www.tbray.org/ongoing/When/202x/2025/12/07/Thin-Spots-In-the-AI-Bubble",
"published": "2025-12-07T20:00:00.000Z",
"updated": "2025-12-09T23:29:05.000Z",
"content": "<p>The GenAI bubble is going to pop. Everyone knows that. To me, the urgent and interesting questions are how widespread the\n damage will be and what the hangover will feel like.\n On that basis, I was going to post a link on Mastodon to Paul Krugman’s \n <a href=\"https://paulkrugman.substack.com/p/talking-with-paul-kedrosky\">Talking With Paul Kedrosky</a>. It’s great, but while I\n was reading it I thought “This is going to be Greek to people who haven’t been watching the bubble details.”\n So consider this a\n preface to the Krugman-Kedrosky piece. If you already know about the GPU-fragility and SPV-voodoo issues, just skip this and go\n read that.</p>\n <h2 id=\"p-2\">Depreciation</h2>\n <p>When companies buy expensive stuff, for accounting purposes they pretend they haven’t spent the money; instead they\n “depreciate” it over a few years. That is to say, if you spent a million bucks on a piece of gear and decided to depreciate it\n over four years, your annual financials would show four annual charges of $250K.\n Management gets to pick your depreciation period, which provides a major opening\n for creative accounting when the boss wants to make things look better or worse than they are.</p>\n <p>Even when you’re perfectly honest it can be hard to choose a fair figure. I can remember one of the big\n cloud vendors announcing they were going to change their fleet depreciation from three to four years and that having an impact on\n their share price.</p>\n <p>Depreciation is orderly whether or not it matches reality: anyone who runs a data center can tell you about racks with 20\n systems in them that have been running fine since 2012. Still, orderly is good.</p>\n <p>In the world of LLMs, depreciation is different. When you’re doing huge model-building tasks, you’re running\n those expensive GPUs flat out and red hot for days on end. Apparently they don’t like that, and flame out way more often than\n conventional computer equipment. Nobody who is doing this is willing to come clean with hard numbers but there are data points, for\n example from\n <a href=\"https://www.tomshardware.com/tech-industry/artificial-intelligence/faulty-nvidia-h100-gpus-and-hbm3-memory-caused-half-of-the-failures-during-llama-3-training-one-failure-every-three-hours-for-metas-16384-gpu-training-cluster\">Meta</a>\n and (very unofficially)\n <a href=\"https://www.tomshardware.com/pc-components/gpus/datacenter-gpu-service-life-can-be-surprisingly-short-only-one-to-three-years-is-expected-according-to-unnamed-google-architect\">Google</a>.</p>\n <p>So GPUs are apparently fragile. And they are expensive to run because they require huge\n amounts of electricity. More, in fact, than we currently have, which is why electrical bills are spiking here and there around\n the world.</p>\n <p>Why does this matter? Because when the 19th-century railway bubble burst, we were left with railways. When the\n early-electrification bubble burst, we were left with the grid. And when the \n <a href=\"https://en.wikipedia.org/wiki/Dot-com_bubble\">dot-com bubble</a> burst, we were left with a lot of valuable\n infrastructure whose cost was sunk, in particular dark fibre. The AI bubble? Not so much; What with GPU burnout and power charges,\n the infrastructure is going to be expensive to keep running, not something that new classes of application can pick up and use on\n the cheap.</p> \n <p>Which suggests that the post-bubble hangover will have few bright spots.</p>\n <h2 id=\"p-1\">SPVs</h2>\n <p>This is a set of purely financial issues but I think they’re at the center of the story.</p>\n <p>It’s like this. The Big-Tech giants are insanely profitable but they don’t have enough money lying around to build the\n hundreds of billions of dollars worth of data centers the AI prophets say we’re going to need. Which shouldn’t be a problem;\n investors would line up to lend them as much as they want, because they’re pretty sure\n they’re going to get it back, plus interest.</p>\n <p>But apparently they don’t want to borrow the money and have the debts on their balance sheet. So they’re\n setting up “Special Purpose Vehicles”, synthetic companies that are going to build and own the data centers; the Big Techs \n promise to pay to use them, whether or not genAI pans out and whether or not the data centers become operational. Somehow,\n this doesn’t count as “debt”.</p>\n <p>The financial voodoo runs deep here. I recommend Matt Levine’s\n <a href=\"https://newsletterhunt.com/emails/205961\">Coffee pod financing</a> and the <cite>Financial Times’</cite>\n <a href=\"https://www.ft.com/content/d0344253-b0a2-4c6d-8b97-520243678afd\">A closer look at the record-smashing ‘Hyperion’\n corporate bond sale</a>. Levine’s explanation has less jargon and is hilarious; the\n <cite>FT</cite> is more technical but still likely to provoke horrified eye-rolls.</p>\n <p>If you think there’s a distinct odor of 2008 around all this, you’d be right.</p>\n <p>If the genAI fanpholks are right, all the debt-only-don’t-call-it-that will be covered by profits and everyone can sleep\n sound. Only it won’t. Thus, either the debts will apply a meat-axe to Big Tech profits, or (like 2008) somehow they won’t be\n paid back. If whoever’s going to bite the dust is “too big to fail”, \n the money has to come from… somewhere? Taxpayers? Pension funds? Insurance companies?</p>\n <h2 id=\"p-3\">Paul K and Paul K</h2>\n <p>I think I’ve set\n <a href=\"https://paulkrugman.substack.com/p/talking-with-paul-kedrosky\">that piece</a> up enough now. It points out a few other\n issues that I think people should care about. I have one criticism: They argue that genAI won’t produce sufficient revenue from\n consumers to pay back the current investment frenzy. I mean, they’re right, it won’t, but that’s not what the investors are\n buying. They’re buying the promise, not of <em>more revenue</em>, but of <em>higher profits</em> that happen when tens of\n millions of knowledge workers are replaced by (presumably-cheaper) genAI.</p>\n <p>I wonder who, after the loss of those tens of millions of high-paid jobs, are going to be the\n consumers who’ll buy the goods that’ll drive the profits that’ll pay back the investors. But that problem is kind of\n intrinsic to Late-stage Capitalism.</p>\n <p>Anyhow, there will be a crash and a hangover. I think the people telling us that genAI is the future and we\n must pay it fealty richly deserve their impending financial wipe-out.\n But still, I hope the hangover is less terrible than I think it will be.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/AI",
"term": "Technology/AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "AI",
"term": "AI",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics",
"title": "Tracy Numbers",
"description": "Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking a class in Afro-Cuban rhythms from Russell Shumsky, with whom I’ve studied West-African drumming for many years. Among the basics of Afro-Cuban are the Bell Patterns, which come straight out of Africa. The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It feels like it’s in four, particularly when played fast",
"url": "https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics",
"published": "2025-12-02T20:00:00.000Z",
"updated": "2025-12-02T20:00:00.000Z",
"content": "<p>Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking\n a class in Afro-Cuban rhythms from\n <a href=\"https://drumming.ca\">Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the\n basics of Afro-Cuban are the\n <a href=\"https://en.wikipedia.org/wiki/Bell_pattern\">Bell Patterns</a>, which come straight out of Africa.\n The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of\n three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It\n feels like it’s in four, particularly when played fast.</p>\n <p>Here’s the standard bell pattern in music notation. Instead of one 12/8 bar, I’ve broken it into four 3/8 chunks. Let’s call\n those “mini-measures”; I’ll use that or just “minis” in the rest of this piece.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png\" alt=\"standard 12/8 bell pattern\"></img>\n <div class=\"caption\"><p><audio controls=\"controls\" src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.m4a\"></audio></p></div>\n <p>Bell patterns are never played in isolation, but circularly on fast repeat, so the first note immediately follows\n the last.</p>\n <p>In the sound sample, I’m playing a background beat on a conga, emphasizing the beginning of the 12/8 measures.\n The actual bell pattern is on the high “child” bell of a\n <a href=\"https://en.wikipedia.org/wiki/Ewe_drumming#Gankogui\">Gankoqui</a>, an African dual-cowbell set.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/PXL_20251201_192632520.png\" alt=\"Black cat considers a Gankoqui\"></img>\n <div class=\"caption\"><p><a href=\"/ongoing/When/202x/2021/02/22/Meet-Thorn\">“þ” the cat</a> was trying bell patterns but\n unfortunately<br></br>cats can’t count as high as 12. Collar by\n <a href=\"https://www.birdsbesafe.com\">BirdsBeSafe.com</a>.</p></div>\n <p>That’s my Gankoqui.\n I bought it off someone on Etsy who imports them from Ghana. \n It came with that little thin stick that sounds nice, but sometimes I use a regular drumstick when things get loud.</p>\n <h2 id=\"p-1\">The problem</h2>\n <p>Russell’s a good teacher and the standard pattern isn’t that tricky, but I just couldn’t get a grip on it.\n It’s a little harder than it looks what with cycling it really fast, and then\n you’re playing it against complicated music with other instrumental voices. \n I probably would have got there, but the lessons ran out of gas in the depths of Covid.</p>\n <h2 id=\"p-2\">Introducing Tracy</h2>\n <p>She was Russell’s long-time partner, a good person and good drummer too. When you were struggling\n with a complex rhythm it was helpful to watch Tracy’s hands, because she was <em>always</em> on the beat.</p>\n <p>Tracy lived with stage four metastatic cancer for many years and braved endless awful rounds of therapy while remaining generally\n cheerful. She could be morbidly funny; I bought her congas (you can hear one behind the beat in the samples) when she had a\n storage-space problem. She told me she was carefully planning her finances so she’d run out of money just before the cancer got\n her.</p>\n <p>I always enjoyed any time I spent with her. Then, a dozen years into her cancer\n journey, this last summer it got into her brain and it was pretty clear her end times were upon her.</p>\n <h2 id=\"p-3\">The hospice</h2>\n <p>Tracy’s last months were spent at\n <a href=\"https://stjohnhospice.ca\">St. John Hospice</a> in Vancouver’s far west. I can’t say enough\n good things about it. If you’re near Vancouver and your death becomes imminent, try to be there if you can’t be at home.\n It’s comfortable and the staff are expert and infinitely kind. The rules that apply at hospices\n are different from those at hospitals; for example, Tracy’s cat joined her in residency and had the run of the place.</p>\n <p>I (and other fans of Russell and Tracy) visited the hospice a few times. My last visit was just days before her death\n and, while she was fatigued and spaced-out, it was still Tracy.\n I wasn’t close enough to call her a friend, but I miss her.</p>\n <p>We got to talking about Afro-Cuban music and I laughed at myself, saying how I never could get that damn bell pattern\n down. Said Russell: “Oh, you mean the standard 12/8 pattern? Tracy, let’s show him” and on the second try, they were doing it\n together, just voices, <i>ta ta ta-ta, ta ta ta</i>. </p>\n <p>Driving home from the hospice, I told myself that if Tracy could manage the bell pattern in her condition, I could bloody\n well learn it. So I studied the details and used a metronome app and after a while\n I thought I had it down pretty well.</p>\n <h2 id=\"p-4\">Sounds cool</h2>\n <p>I go to a weekly by-invitation African drum jam where I’m on the weaker end of the skill\n spectrum. The first time a 12/8 came along after I thought I’d learned the pattern, I had to summon up courage\n and then I fluffed the first few bars. But after a while I \n was grooving along and smiling and thinking the bell sounded pretty cool against the thunder of all the djembés and dununs.</p>\n <p>And, even played amateurishly, it does sound cool. Let’s have another look at the music.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png\" alt=\"standard 12/8 bell pattern\"></img>\n <div class=\"caption\"><p><audio controls=\"controls\" src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.m4a\"></audio></p></div>\n <p>West-African drumming often tries to achieve rhythmic tension, where a given note could fit in multiple ways and your\n ear is not 100% sure what’s going on. The standard pattern does this, twice.</p>\n <p>Remember, I said that 12/8 sounds like it’s\n “in four”, especially if you hit the first beat of each of the four mini-measures. But two of\n the four minis here go around the first note, weakening the 4/4 feel.\n Especially on that third mini; you can feel the beat slide by the missing “one”.</p>\n <p>Also, the last three notes are evenly spaced two beats\n apart, so six of them would fill the 12-beat pattern, suggesting that this might be in triple time, not 12/8.</p>\n <p>The effect, to my ears, is of the bell, higher-pitched than the drums, shifting against the rhythm, or even dancing\n across it. At the drum jam, at almost any given moment it won’t be just drums, one or more people will have\n clave sticks or rattles or tambourines or cowbells weaving through the beat.</p>\n <h2 id=\"p-5\">Mixing it up</h2>\n <p>After I felt confident playing the standard pattern, it still sounded cool, but I wanted to branch out, not just\n go around and around the same seven notes. So the first thing I did was start mixing in a few of these.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-1.png\" alt=\"bell pattern variation\"></img>\n <div class=\"caption\"><p><audio controls=\"controls\" src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/5333.m4a\"></audio></p></div>\n <p>This repeats the second bar through the end of the phrase. In the sound sample I mix it up with the standard pattern.\n It’s got less rhythmic tension but on the other hand\n flows along smoothly with the drum thunder. Also you don’t have to think at all, so you can enjoy listening to what the other\n people are playing.</p>\n <p>Then I got a little more ambitious and reshuffled:</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-2.png\" alt=\"bell pattern variation\"></img>\n <div class=\"caption\"><p><audio controls=\"controls\" src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/5253.m4a\"></audio></p></div>\n <p>The mini-measures are the same as in the standard pattern, just in a different order. Anyhow, this kind of thing is fun.</p>\n <h2 id=\"p-6\">Combinatorics</h2>\n <p>Then one evening I was lying in bed, thoughts wandering, and wondered “How many bell patterns are there?”\n A little mental math showed that of course there are eight possible arrangements of tones\n in a 3-note mini-measure. Here they are:</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/8-measures.png\" alt=\"Possible arrangements of notes in 3/8 time\"></img>\n <div class=\"caption\"><p>I’ll use the boxed numbers to identify the minis.</p></div>\n <p>Why are the minis numbered in that order? Every computer programmer looking at this already knows, but for the rest of you: If the\n notes are ones and the rests are zeroes, they are the eight binary numbers between zero and seven inclusive.\n So each number’s binary bits show where the drumstrokes are. \n By the way, numbers four through\n seven have a note on the one beat, zero through three don’t.</p>\n <p>Is it weird to have a zero i.e. silent mini? I don’t think so, sometimes spaces between the notes really matter.</p>\n <h2 id=\"p-7\">Patterns</h2>\n <p>Anyhow, the original question was about the number of different bell patterns. Each has four\n mini-measures with 8 possible values. So the answer is 8 ⨉ 8 ⨉ 8 ⨉ 8, which is 4,096.</p>\n <p>And each of them can be identified by four little numbers, ranging from T0000 (I can hear the bandleader yelling “gimme zeroes\n for the sax break”) to T7777, a flurry of eighth notes that you might use in the big encore-number finish designed to leave the\n audience yelling as you walk off stage. The standard bell pattern is T5325; in binary “101 011 010 101” and the 1’s are drumstrokes.\n The first variation above is T5333 and the second is T5253.</p>\n <p>The “T” in front of each bell pattern number is for Tracy.</p>\n <p>If you go look at the\n <a href=\"https://en.wikipedia.org/wiki/Bell_pattern\">Wikipedia Bell-pattern article</a>, they emphasize that there are lots of\n different patterns. Now they all have numbers! The article\n <a href=\"https://en.wikipedia.org/wiki/Bell_pattern#128_bell_patterns\">makes special mention of</a> T5124, T5221, and T5244.</p>\n <h2 id=\"p-8\">But why, Tim?!</h2>\n <p>I’m a computer programmer with a Math degree, and an amateur musician.\n Anyone who thinks that these are disjoint disciplines is wrong.\n And, I think the notation is (on a very small scale) kind of pleasing.</p>\n <p>But the work has actually helped me.\n Now that I’ve considered each mini-measure and its personality. I find all of them sneaking into\n my Gankoqui excursions, which have gotten noticeably weirder, for example T5635.\n Nobody’s threatened to kick me out of the jam, so far.</p>\n <p>Also, this has given me a real appreciation of whoever it was that, probably thousands of years ago and certainly in Africa,\n picked the “standard” pattern as, well, standard. Because it’s great.</p>\n <h2 id=\"p-9\">What’s missing?</h2>\n <p>You may have noticed that Gankoquis have two bells and I’ve been ignoring that fact. Normally you’d play these patterns\n on the smaller “child” bell, but sometimes bringing the big parent bell in for a couple of strokes works \n well.\n <a href=\"https://www.youtube.com/watch?v=X2K0i8e6Ftc\">Here’s an example</a> (h/t Russell).</p>\n <p>Also, this discussion has been limited to 3/8 minis in 12/8 measures. There’s another whole universe of 4/4 rhythms that\n also have bell patterns (but everything exists in the shadow of the\n <a href=\"https://en.wikipedia.org/wiki/Clave_(rhythm)\">clave rhythm</a>).\n In that world a pattern has four measures, each of which can have sixteen possible values, so there are 65,536 different ones.</p>\n <p>And I could repeat the numbers construction above for 4/4. But I’m not going to, because the rewards feel smaller. In my\n experience, 4/4 rhythms lope smoothly along and everyone knows where the one is even when there’s no note on it, so there’s less\n ambiguity to work with.\n Anyhow, any neophyte (like for example me) can play a pretty smooth bell line against 4/4; just start with\n <a href=\"https://en.wikipedia.org/wiki/Clave_(rhythm)\">clave</a> and add\n variations (or don’t) and you’ll be fine.</p>\n <h2 id=\"p-10\">Useful?</h2>\n <p>These numbers are just elementary mathemusical fun. If anyone else wanted to use them that’d be a pleasant surprise.\n If “anyone else” is you, go ahead, but they have a name and you have to use it. These are called Tracy Numbers.</p>\n <h2 id=\"p-11\">Colophon</h2>\n <p>Music fragments by\n <a href=\"https://www.mu.se/musescore-studio\">MuseScore Studio</a>. Sound samples facilitated by GarageBand, a Shure MV51, and PSB\n Alphas.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Arts/Music",
"term": "Arts/Music",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Arts",
"term": "Arts",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Music",
"term": "Music",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football",
"title": "Fútbol Joy",
"description": "Last Saturday I had one of my peak 2025 experiences, at the MLS semifinal between the Vancouver Whitecaps FC (hereinafter “Caps”) and Los Angeles FC (“LAFC”). Both those FC’s stand for “Fútbol Club”. 53,095 other fans were there with my son and I; we came home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other TV sports",
"url": "https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football",
"published": "2025-11-23T20:00:00.000Z",
"updated": "2025-11-28T04:38:07.000Z",
"content": "<p>Last Saturday I had one of my peak 2025 experiences, at the\n <a href=\"https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs\">MLS semifinal</a> \n between the <a href=\"https://www.whitecapsfc.com/\">Vancouver Whitecaps FC</a> (hereinafter “Caps”) and\n <a href=\"https://en.wikipedia.org/wiki/Los_Angeles_FC\">Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”.\n 53,095 other fans were there with my son and I; we came\n home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other TV sports.</p>\n <p>Earlier this year\n <a href=\"/ongoing/When/202x/2025/05/04/Southsiders\">I wrote about becoming a Caps fan</a>. Anyone who enjoys this will probably\n like that piece too.</p>\n <p>Let’s set the scene with pictures.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_004124670.png\" alt=\"Before the fútbol at the pub\"></img>\n <div class=\"caption\"><p>Supporters gather pre-game at a nearby Irish-flavored pub.</p></div>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_011735082.png\" alt=\"Parading from the pub to the match\"></img>\n <div class=\"caption\"><p>Supporters march to the game.<br></br>When you’re in a frivolous parade, everyone smiles<br></br>at\n you, even the drivers hemmed in by paraders.</p></div>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_024033770.png\" alt=\"Whitecaps tifo banner: fire that burns / blue melts gold\"></img>\n <div class=\"caption\"><p>The banner is what’s called a\n <a href=\"https://en.wikipedia.org/wiki/Tifo\">tifo</a>.<br></br>I have to admit I failed to parse it.</p></div>\n <h2 id=\"p-5\">The game</h2>\n <p>It was 120 minutes of ridiculously over-the-top psychodrama. I was exhausted at the end.\n If you want a full retrospective, type “whitecaps lafc” into any Web search to get the particulars. Or\n <a href=\"https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs\">hit\n this</a>. But here’s the short version:</p>\n <ol>\n <li><p>The Caps came out sharp and fast and had LAFC pretty well flummoxed through most of the first half, scoring two goals,\n\n <a href=\"https://www.youtube.com/watch?v=9nEOw8ckWMA\">one of which was a jaw-dropper</a>.\n They also managed to contain LAFC’s superstar\n <a href=\"https://en.wikipedia.org/wiki/Son_Heung-min\">Son Heung-min</a>.</p></li>\n <li><p>In the second half, the visitors reconfigured and were much better. Son did the superstar thing and scored two goals,\n <a href=\"https://www.youtube.com/watch?v=-L9N8pkrkSM\">one another jaw-dropper</a>, just as the game was ending, to tie things\n up.</p></li> \n <li><p>The Caps lost two players, one for fouls, one to injury, and were down two men through most of overtime. LAFC’s assault\n was relentless but the Caps held on, getting more than a little lucky.</p></li>\n <li><p>So it went to a penalty-kick competition. Son, shockingly, missed; he was exhausted and limping. At the end of the\n day the Caps scored four out of five to LAFC’s three and got the win.</p></li>\n </ol>\n <p>Suffice it to say that the dramatic peak wasn’t\n any of the flashes of brilliance, but rather the errors that happen when people are at the limit of their endurance. Vancouver\n made one fewer, that’s all there was to it.</p>\n <h2 id=\"p-3\">That sound</h2>\n <p>There’s not another like it on this planet. I mean tens of thousands of voices in a big stadium greeting a home goal.\n Fútbol specifically because its goals, compared to North American sports where points come in dozens, are\n such huge markers. The sound-pressure wavefront, coming from every direction, of all those inarticulate howls of joy,\n all in the same tiny fraction of a second, is a whole-body experience.</p>\n <h2 id=\"p-6\">The side effect</h2>\n <p>I’ve long been a televised-sports fan; the only TV show that isn’t scripted and thus has real drama. But\n since getting mixed up in fútbol, I’ve sort of gone off the other sports I used to watch. I had to think a bit to figure\n out why.</p>\n <p>It’s the ads. The football, basketball and hockey broadcasts screech to a halt\n <a href=\"https://qz.com/150577/an-average-nfl-game-more-than-100-commercials-and-just-11-minutes-of-play\">every ten or fewer\n minutes</a> for a couple of minutes of advertising. Most of the ads are dumb, many are offensive, and the relentless\n addiction-promoting gambling pitches are both. On top of which there’s the bone-headed repetition; someone somewhere thinks\n I’m gonna lean toward this generic SUV as opposed to that one because of the 138th time they’ve run that commercial where hip young\n people with fulfilling lives are going to have sex because of its dashboard geometry and motorized hatchback.\n I mean, the other SUVs have that stuff too, but this one’s actors are more convincingly likely to be headed for bed?</p>\n <p>Being in the room with this shit makes me angry even though my mute-button skillz are sharp.\n The world being what it is, I really don’t need to be around something that angers me several times per hour.\n So, while when young I loved playing both football and basketball, and while the pro games are good entertainment, \n my patience seems to be running out.</p>\n <p>Fútbol, on the other hand, has two fiftyish-minute chunks of continuous action, so you can sink into the flow of the\n game. The contrast, switching back and forth between that and the other North American sports, is stark.</p>\n <p>(Except for I’m mostly forgiving baseball because its natural rhythm is full of stops suitable for hot dogs and beer and\n admiring cute babies and T-shirts and discussions of etymology and epidemiology. I mean, the ads are still mindless repetitive\n shit, we’re just more accustomed to switching attention away when nothing’s happening.)</p>\n <p>And I’m not claiming that fútbol is more virtuous or less dirty than any other sport; after all, its global\n organizing body FIFA has repeatedly been exposed as\n <a href=\"https://en.wikipedia.org/wiki/FIFA#Corruption\">galactically corrupt</a>. I’m just saying it offers a better\n experience.</p>\n <h2 id=\"p-9\">Soccer?</h2>\n <p>That word is an awkward invention by nineteenth-century British toffs based on abbreviating “association”. I accept that on my\n continent “football” means gridiron, but people who enjoy “soccer” still say it so in print I offer “fútbol”, which is a\n typographically nice little cluster; please humor me.</p>\n <p>Anyhow, you might want to check out your local team; in North America, the prices are lower than the other sports, who could\n be against cheap happiness with fewer gambling ads?</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Sports/Football",
"term": "Sports/Football",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Sports",
"term": "Sports",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Football",
"term": "Football",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Sports/Soccer",
"term": "Sports/Soccer",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Soccer",
"term": "Soccer",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links",
"title": "Long Links",
"description": "As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the choices will improve your day. This time out it’s almost all politics, but that’s the way the world is. And some of the politics aren’t American!",
"url": "https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links",
"published": "2025-11-16T20:00:00.000Z",
"updated": "2025-11-19T22:20:55.000Z",
"content": "<p>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the\n choices will improve your day. This time out it’s almost all politics, but that’s the way the world is.\n And some of the politics aren’t American!</p>\n <p>Some of these are paywalled, sorry.\n And the whole thing is kind of long so if you’re in a hurry, you might want to jump to the last section, entitled\n <a href=\"#p-8\">Wonderful things</a>.</p>\n <h2 id=\"p-7\">Social media</h2>\n <p>Here’s a real treat. Perhaps the premiere example of a blog that’s grown happily from a one-man operation to a\n successful and sustainable small business would be\n <a href=\"https://talkingpointsmemo.com\">Talking Points Memo</a>. It provides what I think is about the deepest\n carefully-reported coverage of the American progressive scene available anywhere. I’ve been a subscriber for years.</p>\n <p>They’re celebrating their 25th anniversary and, to celebrate, have been working on a history of blogging:\n <a href=\"https://talkingpointsmemo.com/tpm-25\">Pivots, Trolls, & Blogrolls</a>.\n Contributors so far: Sarah Jaffe, Matt Pearce, Brian Beutler, Kylie Cheung, Megan Greenwell, David Weigel, Jon Allsop, Adam\n Mahoney, Julianne Escobedo Shepherd, Max Rivlin-Nadler, Bhaskar Sunkara, Hamilton Nolan, Ana Marie Cox, Marisa Kabas, Kelly\n Weill, Aurin Squire, Marcy Wheeler, Andrew Parsons, Jeet Heer, and Sarah Posner.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/16/TPM.png\" alt=\"TPM 25th anniversary series\"></img>\n <p>It’s full of razor-sharp insights and nostalgic smiles. I think it’s paywalled? If so, and if you’ve got feels about \n the blog form, it’d probably be worth your while to sign up for a month just to read this collection.</p>\n <p>And thanks to Josh Marshall of <cite>TPM</cite> for putting it together all these years and especially for this particular\n mind candy.</p>\n <h2 id=\"p-4\">Politics (US)</h2>\n <p>The Trump administration is, generally speaking, strange.\n For a terrifying trip several standard deviations off the strange end of the strangeness,\n there’s \n <a href=\"https://www.newyorker.com/magazine/2025/11/17/laura-loomers-endless-payback\">Laura Loomer’s Endless Payback</a>.\n At several points in my traversal of this piece I simply could not believe what I was reading. My guess is that it will\n regularly be cited by historians of the 23rd century, to add spice to their narrative.</p>\n <p>Many commentators on the right have been horrified at Zohran Mamdani’s New York victory, seeing him as the white-hot\n pointy end of the “woke mind virus”. Well, what could be more woke, I ask, than the Department of Africana Studies at Bowdoin,\n a boutique liberal-arts college in Maine?</p>\n <p>Mamdani was a student there, and now the former head of said department offers us\n <a href=\"https://lithub.com/maybe-dont-talk-to-the-new-york-times-about-zohran-mamdani/\">Maybe Don’t Talk to the New York\n Times About Zohran Mamdani</a>. Peter Coviello is not a moderate but is a formidable writer: “The storied choice between\n socialism and barbarism was made exquisitely clear a good many years ago in the United States, and both major parties chose\n barbarism.” Despite that, it’s mostly written with a light touch, often amusing. Read it.</p> \n <h2 id=\"p-5\">Politics (Other)</h2>\n <p>It’s not in the news much, but China is facing colossal economic challenges.\n <a href=\"https://www.nytimes.com/2025/09/23/opinion/china-economy-deflation-neijuan.html\">Learn about “meijuan”</a> (in English,\n “involution”) which might well put the nation on the path of deflation. That’s a path that, once an economy is on it, is very\n hard to get off; it took Japan decades.</p>\n <p>While we’re looking at China… there used to be “Kremlinology”, a study of the entirely opaque workings of the top inner\n circles of the Soviet regime. In that spirit, here’s some\n <a href=\"https://en.wikipedia.org/wiki/Great_Hall_of_the_People\">人民大会堂</a>-ology: \n <a href=\"https://sinocism.com/p/forever-xi-jinping-perhaps-not\">Forever Xi Jinping? Perhaps Not</a>.\n I enjoyed it but have no idea if it’s, you know, correct. Nobody outside that inner circle does.</p>\n <p>Now let’s jump seven time zones west, to France, where the redoubtable Thomas Piketty offers\n <a href=\"https://thomaspiketty.wordpress.com/2025/11/11/le-pens-rn-has-become-the-party-of-billionaires/\">Le Pen’s RN has\n become the party of billionaires</a>. Unlike the Beijing piece, Piketty’s is (as usual for him) supported by concrete data and I tend\n to believe it.</p>\n <p>Last stop: Gaza, waiting to find out if an externally-imposed and leaky ceasefire will hold, and whether there is a path\n from where they are to something better. As for “where they are”, here’s\n <a href=\"https://www.nytimes.com/interactive/2025/10/08/opinion/gaza-strip-before-after.html\">The Gaza I Knew Is\n Gone</a> by Ghada Abdulfattah. It describes life’s experience for the citizens of Gaza after all these endless\n months of brutality.</p> \n <h2 id=\"p-9\">Politics (everywhere)</h2>\n <p>Pope Leo’s \n <a href=\"https://www.vatican.va/content/leo-xiv/en/apost_exhortations/documents/20251004-dilexi-te.html\">Apostolic Exhortation\n Dilexi Te of the Holy Father Leo XIV To All Christians On Love For The Poor</a> got a short-lived run in the headlines,\n accompanied by “But that’s… socialism!” pearl-clutching from Stage Right. It deserves a read. The first three-quarters or\n so are a trip through Church history, starting in Nazareth, aimed at showing that concern for the poor has always been central\n to the faith. Which is fine, but eventually the Pope gets concrete about the twenty-first century, and is convincing whether or\n not you believe in any gods.</p>\n <p>The next section is about Tech and while\n <a href=\"https://csrc.nist.gov/csrc/media/Presentations/2023/radical-cs/images-media/sess-1-rogaway-bcm-workshop-2023.pdf\">Radical \n CS</a> is a presentation from “The Third NIST Workshop on Block Cipher Modes of Operation” it’s about politics, oh yes it is. We\n very much need more of this kind of thing.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/16/Radical-CS.png\" alt=\"Suggestions for a radical CS\"></img>\n <h2 id=\"p-6\">Tech</h2>\n <p>A <a href=\"https://infosec.exchange/@david_chisnall/115270162462304611\">post from David Chisnall on Mastodon</a> contains this\n gem: “Machine learning is <em>amazing</em> if … the value of a correct answer is much higher than the cost of an incorrect\n answer.”\n Which is one of those things that’s obviously true as soon as you hear it. The whole piece is good.</p>\n <p>The churning debate around AI is full of arm-waving and relatively free of objective numerical data. So here’s Ed Zitron’s\n <a href=\"https://www.wheresyoured.at/costs/\">This Is How Much Anthropic and Cursor Spend On Amazon Web Services</a>.\n And I ask: How do the people making these investments think they’re going to get their money back?</p>\n <p>Speaking of things are obviously true:\n <a href=\"https://www.newyorker.com/culture/infinite-scroll/textedit-and-the-relief-of-simple-software\">TextEdit and the\n Relief of Simple Software</a>. We could do so much better than we do, and in our hearts we know why we’re not, and it’s about\n money and power, not technology.</p>\n <p>Bluesky has brought its AT Protocol to the IETF; let’s see what happens. Here are \n <a href=\"https://www.ietf.org/archive/id/draft-newbold-at-architecture-00.html\">Authenticated Transfer: Architecture\n Overview</a> and\n <a href=\"https://www.ietf.org/archive/id/draft-holmgren-at-repository-00.html\">Authenticated Transfer Repository and\n Synchronization</a>. The drafts have \n <a href=\"https://github.com/bluesky-social/ietf-drafts\">source-code repos</a>.</p>\n <p>Finally, here’s <a href=\"https://spinel.coop\">Spinel</a>, which is trying to build a decentralized, transparent,\n and somewhat-democratic engineering resource for the Ruby and Rails platforms. This follows on a distinctly-stinky power play where\n people with money grabbed the steering wheel. Best of luck to Spinel.</p>\n <h2 id=\"p-10\">Canadian health</h2>\n <p>Canada has “single-payer” public healthcare that comes with your taxes, which in my experience works well, see\n <a href=\"/ongoing/When/200x/2009/08/22/Alison\">here</a> and\n <a href=\"/ongoing/When/202x/2025/07/09/Saskatchewan\">here.</a></p>\n <p>This costs a lot of money, over $300B/year.\n Predictably, there are business types panting with eagerness to get their hands on some of that\n money. And they can; a lot of medical practices and clinics and labs are owned by private companies, apparently doing well while\n being restricted to billing the government for the standard fees. But what they <em>really</em> want is a two-tier system where\n they can directly charge rich people more for better care. It seems like every year someone thinks up a clever dodge to nibble\n away at the system. Fortunately, these people have, so far, ended up losing in the courts.</p>\n <p>Here’s a news story: \n <a href=\"https://macleans.ca/society/health/ai-could-save-canadas-health-care-system/\">AI Could Save Canada’s Health-Care\n System</a>. It’s actually pretty coherent and I found it plausible that this technology could maybe \n improve, for example, the agonizingly slow emergency-room experience.</p>\n <p>But then I got curious as to the business angle and tracked the source of the story down to a business called called\n <a href=\"https://www.getmaple.ca\">maple</a>. Sure enough, \n <a href=\"https://helpdesk.getmaple.ca/en/articles/5375023-fees-to-see-a-general-practitioner-on-maple\">here they are</a> trying to\n siphon off direct payments for access to doctors. I predict they’ll end up in court, and lose.</p>\n <p>And then there’s the government of Alberta, run by hard-right dipshits who hate most aspects of being Canadian and loathe the\n proposition that government can provide good and efficient services. Thus:\n <a href=\"https://www.cbc.ca/news/canada/calgary/alberta-paul-parks-mri-diagnostics-adriana-lagrange-9.6952189\">Alberta\n government plans to allow residents to privately pay for any diagnostic or screening service</a>. Feaugh. I hope this one ends\n up in court too.</p>\n <h2 id=\"p-12\">Paying for Open Source</h2>\n <p>It is coming to the world’s attention that most of our tech infrastructure is radically dependent on\n open-source software maintenaned by a\n cadre of developers who are old, tired, and not getting paid for their work. I have direct experience with trying unsuccessfully\n to convince Big-Tech business leaders to invest in Open-Source maintenance and infrastructure. Here’s some of the coverage:</p>\n <ul>\n <li><p>In <cite>The Register</cite>:\n <a href=\"https://www.theregister.com/2024/09/18/open_source_maintainers_underpaid/\">Open source maintainers underpaid,\n swamped by security, going gray</a>.</p></li>\n <li><p>Open Source Security Foundation:\n <a href=\"https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/\">Open\n Infrastructure is Not Free: A Joint Statement on Sustainable Stewardship</a>.</p></li>\n <li><p>Nils Adermann:\n <a href=\"https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/\">A Call for Sustainable Open Source\n Infrastructure</a>.</p></li>\n <li><p>Hackernoon: <a href=\"https://hackernoon.com/how-can-governments-pay-open-source-maintainers\">How Can Governments Pay Open Source\n Maintainers?</a></p></li>\n <li><p>The New Stack: \n <a href=\"https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/\">FFmpeg to Google: Fund Us or Stop Sending\n Bugs</a>.</p></li>\n </ul>\n <p>Things obviously can’t go on as they are. The best path forward isn’t obvious to me, but we need to start finding it.</p>\n <h2 id=\"p-11\">Economics and life</h2>\n <p>Paul Krugman and Martin Wolf, two really smart guys who aren’t technologists,\n <a href=\"https://paulkrugman.substack.com/p/talking-ai-with-martin-wolf\">talk about the impact of AI</a>. Technofeudalism is\n considered carefully.\n My favorite out-take\n is from Krugman: “[I] have come to the conclusion that anything that I want to believe about the prospects of AI and its\n economic effects, all I need to do is do a little searching, and I can find some expert who will tell me whatever it is I want to\n believe.” Even with that well-justified cynicism, there is deep stuff here.</p>\n <p>I read Matt Levine’s newsletter almost every day; not only does it teach you things about how money makes the world go round,\n it entertains; his glee at some particularly juicy financial swindle or clever arbitrage maneuver will bring a smile to your\n face.\n In <a href=\"https://newsletterhunt.com/emails/201930\">Money Stuff: Quantum Bond Trading</a> he addresses a deeper question: Does\n the Finance business actually benefit society? Obviously a subject worthy of attention, and he makes it amusing.</p>\n <h2 id=\"p-8\">Wonderful things</h2>\n <p> The dude who wrote <a href=\"https://www.bikewanderer.com/on-the-road//packrafting-the-darien-gap\">Paddling the Darien</a>\n is clearly crazy, I guess it’d be more polite to say “insanely brave”. Anyhow, I think there are very few people who won’t be\n astonished at these pictures and stories</p>\n <p>I’m not at all sure what <a href=\"https://jonathanhoefler.com/inventions\">A. Inventions</a>, by Jonathan Hoefler,\n is, actually. The link that I followed said that GenAI image generators were involved. I don’t care.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/16/calendars.png\" alt=\"Alignment Calendars 1584–1811\"></img>\n <div class=\"caption\"><p>Alignment Calendars 1584–1811,<br></br>from Jonathan Hoefler’s <cite>Inventions</cite>.</p></div>\n <p>Let’s end with music. Here are two absolutely exquisite song performances, courtesy of YouTube. First,\n <a href=\"https://www.youtube.com/watch?v=1qahZ-whM6o\">Old Enough</a> by the Raconteurs, Ricky Skaggs, and Ashley Monroe. The\n interplay of voices and strings is magical. Then Billy Strings wiith his band and string players, doing\n <a href=\"https://www.youtube.com/watch?v=ZCtQdALo9DI\">Gild the Lily</a>. Just a lovely performance of a fine new song.</p>\n <p>That’s all, folks, see you next time.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "The World",
"term": "The World",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "The World",
"term": "The World",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study",
"title": "Kendzior Case-Study",
"description": "There was recently a flurry of attention and dismay over Sarah Kendzior having been suspended from Bluesky by its moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there",
"url": "https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study",
"published": "2025-11-13T20:00:00.000Z",
"updated": "2025-11-14T18:55:57.000Z",
"content": "<p>There was recently a flurry of attention and dismay over\n <a href=\"https://en.wikipedia.org/wiki/Sarah_Kendzior\">Sarah Kendzior</a> having been suspended from Bluesky by its\n moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In\n particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there.</p>\n <h2 id=\"p-1\">Disclosures</h2>\n <p>I’m a fan of Ms Kendzior, for example check out her recent\n <a href=\"https://sarahkendzior.substack.com/p/when-i-loved-new-York\">When I Loved New York</a>; fine writing and incisive\n politics. I like the Bluesky experience and have warm feelings toward the team there, although my\n <a href=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate\">long-term social media bet is on Mastodon</a>.</p>\n <h2 id=\"p-2\">Back story</h2>\n <p>Back in early October, the <cite>Wall Street Journal</cite> published\n <a href=\"https://www.wsj.com/arts-culture/music/can-we-finally-give-johnny-cash-his-due-58ab24c2\">It’s Finally Time to Give\n Johnny Cash His Due</a>, an appreciation for Johnny’s music that I totally agreed with. In particular I liked its praise for\n <a href=\"https://en.wikipedia.org/wiki/American_IV:_The_Man_Comes_Around\">American IV: The Man Comes Around</a> which, recorded while\n he was more or less on his deathbed, is a masterpiece. It also said that, relative to other rockers, Johnny “can seem deeply\n uncool”.</p>\n <p>Ms Kendzior, who is apparently also a Cash fan and furthermore thinks he’s cool, posted to Bluesky “I want to shoot\n the author of this article just to watch him die.” Which is pretty funny, because one of Johnny’s most famous lyrics, from\n <a href=\"https://en.wikipedia.org/wiki/Folsom_Prison_Blues\">Folsom\n Prison Blues</a>, was “I shot a man in Reno just to watch him die.” (Just so you know: In 1968 Johnny performed the song at a\n benefit concert for the prisoners at Folsom, and on the live record (which is good), there is a burst of applause from the\n audience after the “shot a man” lyric. It was apparently added in postproduction.)</p>\n <p>Subsequently, per the \n <a href=\"https://bsky.app/profile/safety.bsky.app/post/3m5hcx4n2hc2z\">Bluesky Safety</a> account ”The account owner of\n @sarahkendzior.bsky.social was suspended for 72 hours for expressing a desire to shoot the author of an article.”</p>\n <p>There was an outburst of fury on Bluesky about the sudden vanishing of Ms Kendzior’s account, and the explanation\n quoted above didn’t seem to reduce the heat much. Since I know nothing about the mechanisms used by Bluesky Safety, I’m\n not going to dive any deeper into the Bluesky story.</p>\n <h2 id=\"p-3\">On Mastodon</h2>\n <p>I do know quite a bit about Mastodon’s trust-and-safety mechanisms, having been a moderator on\n <a href=\"https://cosocial.ca\">CoSocial.ca</a> for a couple of years now. So I’m going to walk through how the same story might\n have unfolded on Mastodon, assuming Ms Kendzior had made the same post about the <cite>WSJ</cite> article. There are a bunch of\n forks in this story’s path, where it might have gone one way or another depending on the humans involved.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/report-menu.png\" alt=\"Mastodon “Report” menu\" class=\"inline\"></img>\n <h2 id=\"p-4\">Reporting</h2>\n <p>The Mastodon process is very much human-driven. Anyone who saw Ms Kendzior’s post could pull up the per-post menu and hit the\n “Report” button. I’ve put a sample of what that looks like on the right, assuming someone wanted to report yours truly.</p>\n <p>By the way, there are many independent Mastodon clients; some of them have “Report” screens that are way cooler than this. I\n use\n <a href=\"https://phanpy.social\">Phanpy</a>, which has a hilarious little animation with an animated rubber stamp that\n leaves a red-ink “Spam” or whatever on the post you’re reporting.</p>\n <p>We’ll get into what happens with reports, but here’s the first fork in the road: Would the Kendzior post have been reported?\n I think there are three categories of people that are interesting. First, Kendzior fans who are hip to Johnny Cash, get the\n reference, snicker, and move on. Second, followers who think “ouch, that could be misinterpreted”; they might throw a\n comment onto the post or just maybe report it. Third, Reply Guys who’ll jump at any chance to take a vocal woman down; they’d\n gleefully report her en masse. There’s no way to predict what would have happened, but it wouldn’t be surprising if there were\n both categories of report, or either, or none.</p>\n <h2 id=\"p-5\">Moderating</h2>\n <p>When you file a report, it goes both to the moderators of your instance and the of instance where it was posted (who oversee the poster’s account).\n I dug up a 2024 report someone filed against me to give a feeling for what\n the moderator experience is like.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/timbray-report.png\" alt=\"Report filed against Tim Bray for “antisemitism”\"></img>\n <p>I think it’s reasonably self-explanatory. Note that the account that filed the report is not identified, but that the server\n it came from is.</p>\n <p>A lot of reports are just handled quickly by a single moderator and don’t take much thought: Bitcoin scammer or Bill Gates\n impersonator or someone with a swastika in their profile? Serious report, treated seriously.</p>\n <p>Others require some work. In the moderation screen, just below the part on display above, there’s space for moderators to\n discuss what to do. (In this particular case they decided that criticism of political leadership wasn’t “antisemitism” and\n resolved the report with no action.)</p>\n <p>In the Kendzior case, what might the moderators have done? The answer, as usual, is “it depends”. If there were just one or\n two reports and they leaned on terminology like “bitch” and “woke”, quite possibly they would have been dismissed.</p>\n <p>If one or more reports were heartfelt expressions of revulsion or trauma at what seemed to be a hideous death threat, the\n moderators might well have decided to take action. Similarly if the reports were from people who’d got the reference and\n snickered but then decided that there really should have been a “just kidding” addendum.</p>\n <h2 id=\"p-6\">Action</h2>\n <p>Here are the actions a moderator can take.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/actions.png\" alt=\"Mastodon moderation action options\"></img>\n <p>If you select “Custom”, you get this:</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/actions-2.png\" alt=\"More Mastodon moderation action optiosn\"></img>\n <p>Once again, I think these are self-explanatory. Before taking up the question of what might happen in the Kendzior case, I\n should grant that moderators are just people, and sometimes they’re the wrong people. There have been servers with a reputation\n for draconian moderation on posts that are even moderately controversial. They typically haven’t \n done very well in terms of attracting and retaining members.</p>\n <p>OK, what might happen in the Kendzior case? I’m pretty sure there are servers out there where the post would just have been\n deleted. But my bet is on that “Send a warning” option. Where the warning might go something like “That\n post of yours really shook up some people who didn’t get the Folsom Prison Blues reference and you should really\n update it somehow to make it clear you’re not serious.”</p>\n <p>Typically, people who get that kind of moderation message take it seriously. If not, the moderator can just delete the post.\n And if the person makes it clear they’re not going to co-operate, that creates a serious risk that if you let them go on shaking\n people up, your server could get mass-defederated, which is the death penalty. So (after some discussion) they’d delete the\n account. Everyone has the right to free speech, but nobody has a right to an audience courtesy of our server.</p>\n <h2 id=\"p-7\">Bottom line</h2>\n <p>It is very, very unlikely that in the Mastodon universe, Sarah Kendzior’s account would suddenly have globally vanished. It\n is quite likely that the shot-a-man post would have been edited appropriately, and possible that it would have just\n vanished.</p>\n <h2 id=\"p-8\">Will it scale?</h2>\n <p>I think the possible outcomes I suggested above are, well, OK. I think the process I’ve described is also OK. The\n question arises as to whether this will hold together as the Fediverse grows by orders of magnitude.</p>\n <p>I think so? People are working hard on moderation tools. I think this could be an area where AI would help, by\n highlighting possible problems for moderators in the same way that it highlights spots-to-look-at today for radiologists. We’ll\n see.</p>\n <p>There are also a couple of background realities that we should be paying more attention to. First, bad actors tend to\n cluster on bad servers, simply because non-bad servers take moderation seriously. The defederation scalpel needs to be kept\n sharp and kept nearby.</p>\n <p>Secondly, I’m pretty convinced that the current open-enrollment policy adopted by many servers, where anyone can have an\n account just by asking for it, will eventually have to be phased out. Even a tiny barrier to\n entry<span class=\"dashes\"> —</span> a few words on why you want to join or, even better, a small\n payment<span class=\"dashes\"> —</span> is going to reduce the frequency of troublemakers to an amazing degree.</p>\n <h2 id=\"p-9\">Take-aways</h2>\n <p>Well, now you know how moderation works in the Fediverse. You’ll have to make up your own mind about whether you like it.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "The World/Social Media",
"term": "The World/Social Media",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "The World",
"term": "The World",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Social Media",
"term": "Social Media",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind",
"title": "Bye, Google Search",
"description": "For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog fragments using Google. No longer; I wired in Pagefind; click on the magnifying glass up there on the right to try it out. Go ahead, do it now, I’ll wait before getting into the details",
"url": "https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind",
"published": "2025-11-01T19:00:00.000Z",
"updated": "2025-11-04T05:29:26.000Z",
"content": "<p>For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog\n fragments using Google. No longer; I wired in\n <a href=\"https://pagefind.app\">Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,\n I’ll wait before getting into the details.</p>\n <h2 id=\"p-1\">The problem</h2>\n <p>Well, I mean, Google is <em>definitely</em> Part Of The Problem in advertising, surveillance, and Internet\n search. But the problem I’m talking about is that it just couldn’t find my pages, even \n when I knew they were here and knew words that should find them.</p>\n <p>Either it dropped the entries from the index or dropped a bunch of search terms.\n Don’t know and don’t care now. <span class=\"o\">ongoing</span> is my outboard memory\n and I search it <em>all the freaking time</em>. This failure mode was making me crazy.</p>\n <h2 id=\"p-2\">Pagefind</h2>\n <p>Tl;dr: I downloaded it and installed it and it Just Worked out of the box. I’d describe the look and feel but that’d be a\n waste of time since you just tried it out. It’s fast enough and doesn’t seem to miss anything and has a decent user\n interface.</p>\n <h2 id=\"p-3\">How it works</h2>\n <p>They advertise “fully static search library”, which I assumed meant it’s designed to work against sites like this one\n composed of static files. And it is, but there’s more to it than that; read on.</p>\n <p>First, you point a Node program at the root of your static-files tree and stand back. My tree has a bit over 5,000 files\n containing about 2½ million words, adding up to a bit over 20M of text. By default, it assumes you’re indexing HTML and includes\n all the text inside each page’s <code><body></code> element.</p>\n <p>You have to provide a <code>glob</code> argument to match the files you want to index; in most cases, something like\n <code>root/**/*.html</code> would do the trick. Working this out was for me the hardest part because among other things my\n articles don’t end with <code>.html</code>; maybe it’ll be helpful for some to\n note that what worked for <span class=\"o\">ongoing</span>\n was:<br></br><code>When/???x/????/??/??/[a-zA-Z0-9]<[\\-_a-zA-Z0-9]:></code></p> \n <p>This produced an index organized into about 11K files adding up to about 78M. It includes a directory with one file per\n HTML page being searched.</p>\n <p>I’d assumed I’d have to wire this up to my Web server somehow, but no: It’s all done in the client by fetching little bits\n and pieces of the index using ordinary HTTP GETs.\n For example, I ran a search for the word “minimal”, which resulted in my browser fetching a total of seven files totaling\n about 140K. That’s what they mean by “static”; not just the data, but the index too.</p>\n <p>Finally, I noticed a couple of WASM files, so I had to check out\n <a href=\"https://github.com/Pagefind/pagefind\">the source code</a> and, sure enough, this is basically a Rust app. Again I’m\n impressed. I hope that slick modern Rust/WASM code isn’t offended by me rubbing it up against this blog’s messy old\n Perl/Ruby/raw-JS/XML tangle.</p> \n <h2 id=\"p-9\">Scalable?</h2>\n <p>Interesting question. For the purposes of this blog, Pagefind is ideal. But, indexing my 2½ million words burned a solid\n minute of CPU on the feeble VPS that hosts <span class=\"o\">ongoing</span>. I wonder if the elapsed time is linear in the data\n size, but it wouldn’t surprise me if it were worse. Furthermore, the index occupies more storage than the underlying data, which\n might be a problem for some.</p>\n <p>Also, what happens when I do a search while the indexing is in progress? Just\n to be sure, I think I’ll wire it up to build the index in a new directory and switch indices as atomically as possible.</p>\n <p>Finally, I think that if you wanted to sustain a lot of searches per second, you’d really want to get behind a CDN, which would\n make all that static index fetching really fly.</p>\n <h2 id=\"p-4\">Configuring</h2>\n <p>The default look-and-feel was mostly OK by me, but the changes I had to make did involve quality time with the inspector,\n figuring out the class and ID complexities and then iterating the CSS.</p>\n <p>The one thing that in the rear-view seems unnecessary is that I had to add a <code>data-pagefind-meta</code> attribute to the\n element at the very bottom of the page where the date is to include it in the result list. There should be a way\n to do this without custom markup. John Siracusa filed a\n <a href=\"https://github.com/Pagefind/pagefind/issues/974\">related bug</a>.</p>\n <h2 id=\"p-8\">Deployment</h2>\n <p>There’s hardly any work. I’ll re-run the indexer every day with a crontab entry and it looks it should just take care of\n itself.</p>\n <h2 id=\"p-5\">To do?</h2>\n <p>Well, I could beautify the output some more but I’m pretty happy with it after just a little work. I can customize the sort\n order, which I gather is in descending order of how significant Pagefind thinks the match is. There’s a temptation to sort it in\n reverse date order. Actually, apparently I can also influence the significance algorithm. Anyhow I’ll run with mostly-defaults\n for now.</p>\n <h2 id=\"p-6\">Search options</h2>\n <p>I notice that the software is pretty good at, and aggressive about, matching across verb forms and singular/plural and\n prefixes. Which I guess is what you want? You can apparently defeat that by enclosing a word in quotes if you want it matched\n exactly. Works for phrases too. I wonder what other goodies are in there; couldn’t find any docs on that subject.</p>\n <p>Finally, there’s an excellent feature set I’ll never use; it’s smart about lots of languages. But alas, I write\n monolingually.</p>\n <h2 id=\"p-10\">Shameful cleanup</h2>\n <p>Like I said, getting Pagefind installed and working was easy. Getting the CSS tuned up was a bit more effort. But I have to\n confess that I put hours and hours into hiding my dirty secrets.</p>\n <p>You see, <span class=\"o\">ongoing</span> contains way more\n writing than you or Google can see. It’s set up so I can “semi-publish” pieces; there but unlinked. There was a whole lot of\n this kind of stuff: Photo albums from social events, pitches to employers about why they should hire various people\n including me, rants at\n employers for example about why Solaris should adopt the Linux userland (I was right) and why Android should include a Python\n SDK (I was right), and pieces that employer PR groups convinced me to bury. One of my minor regrets about no longer being\n employed is I no longer get to exercise my mad PR-group-wrangling skillz.</p>\n <p>But when your search software is just walking the file tree, it doesn’t know what’s “published” and what’s not. I ended up\n using my rusty shell muscles with <code>xarg</code> and <code>sed</code> and <code>awk</code> and even an <code>ed(1)</code>\n script. I think I got it all, but who knows, search hard enough and you might find something embarrassing. If you do, I’d sure\n appreciate an email.</p>\n <h2 id=\"p-7\">Thanks!</h2>\n <p>To the folks who built this. Seems like a good thing.</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/Search",
"term": "Technology/Search",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Search",
"term": "Search",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology/Publishing",
"term": "Technology/Publishing",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Publishing",
"term": "Publishing",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "The World/Life Online/De-Google",
"term": "The World/Life Online/De-Google",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "The World",
"term": "The World",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Life Online",
"term": "Life Online",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "De-Google",
"term": "De-Google",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate",
"title": "Time to Migrate",
"description": "Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean any combination of “less useful”, “less safe”, or “less fun”. This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to go. Come join me. Here’s why",
"url": "https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate",
"published": "2025-11-03T20:00:00.000Z",
"updated": "2025-11-03T20:00:00.000Z",
"content": "<p>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean\n any combination of “less useful”, “less safe”, or “less fun”.\n This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to\n go. Come join me. Here’s why.</p>\n <h2 id=\"p-2\">Defining terms</h2>\n <p>In this post, by “Social media” I mean \n “what Twitter used to be, back when it was good”. We should expect our social-media future to be <em>at least</em>\n as useful, safe, and fun as that baseline. (But we can do better!)</p>\n <p>By “Mastodon” I mean the many servers, mostly running the\n <a href=\"https://github.com/mastodon/mastodon\">Mastodon software</a>, that\n communicate using the\n <a href=\"https://en.wikipedia.org/wiki/ActivityPub\">ActivityPub protocol</a>. Now I’ll try to convince you to start using one of\n them.</p> \n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/join-mastodon.png\" alt=\"join-mastodon.org\"></img>\n <div class=\"caption\"><p>Start at\n <a href=\"https://joinmastodon.org\">joinmastodon.org</a></p></div>\n <h2 id=\"p-4\">The simplest argument</h2> \n <p>Have you noticed that social-media products, in the long term, can’t seem to manage to stay fun and safe and useful? \n I have. But there’s one huge exception, a tool that’s been serving billions of us for\n decades, and works about as well as it ever did. I’m talking about email.</p>\n <p>Why does email stay reasonably healthy? Because nobody owns it. Anyone on any server can communicate with anyone else on any\n other and it Just Works. Nobody can buy it and make it a vehicle for their politics. Nobody can crank up the ad density or\n make things worse to improve their profit margin.</p> \n <p>Mastodon’s like email that way. Plus it does all the Post and Repost and Quote and Follow and Reply and Like and Block stuff that you’re\n used to, and there are thousands of servers and anyone can run one and nobody can own the whole thing. It doesn’t have ads and it\n won’t. It’s dead easy to use and it’s fun and you should\n <a href=\"https://joinmastodon.org\">give it a try</a>.</p>\n <p>The rest of this essay goes into detail about why Mastodon is generally great and specifically better than the\n alternatives. But if that simple pitch sounded good, stop here,\n <a href=\"https://joinmastodon.org/\">go get an account</a> and climb on board.</p>\n \n <h2 id=\"p-18\">Why now?</h2>\n <p>Two things motivated me to post this piece now. First, this month is my three-year anniversary of\n <a href=\"/ongoing/When/202x/2022/11/26/Bye-Twitter\">bailing out on Twitter</a> in favor of Mastodon.</p>\n <p>Second is the release of Mastodon 4.5, which I think closes the last few important-missing-feature gaps.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/masto4-5.png\" alt=\"Mastodon v4.5 announcement\"></img>\n <p>The software is improving rapidly, particularly in the last couple of releases. It’s got cool features you won’t find\n elsewhere, and there’s very little cool stuff from elsewhere that’s not here. There was a time when newly-arrived people had\n confusing or unfriendly experiences, or missed features that were important to them.\n It looks to me like those days are over.</p> \n <h2 id=\"p-6\">Migration</h2>\n <p>Mastodon is many thousands of servers, and you can join the biggest,\n <a href=\"https://mastodon.social/explore\">mastodon.social</a>, or\n <a href=\"https://joinmastodon.org/servers\">shop around for another</a>. But here’s the magic thing: If you end up disliking the\n server you’re on, or find a better one, you can migrate and <em>take your followers with you</em>! You can’t ever get locked\n in.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/serveres.png\" alt=\"Choosing a Mastodon server\"></img>\n <div class=\"caption\"><p>The server-selection menu has lots of options.</p></div>\n <p>This is probably Mastodon’s most important feature. It’s why no billionaire can buy it and no corporation can enshittify it. As\n far as I know, Mastodon is the first widely-adopted social software ever to offer this.</p> \n <h2 id=\"p-7\">Interaction</h2>\n <p>You hear it over and over: “I had <a big number> of followers on Twitter and now I have <a less-big number> on\n Mastodon, but I get so much more conversation and interaction when I post here.”</p>\n <p>One of the people you’ll hear that from is me.\n My follower count is less than half the 45K I had on Twitter-that-was, but I get immensely more intelligent, friendly\n interaction than I ever got there. (And then sometimes I get told firmly that I’m wrong about this or that, but hey.) It’s\n the best social-media experience I’ve ever had.</p>\n <p>Dunno about you, but conversation and interaction\n seem like a big deal to me. One reason things are lively is…</p>\n <h2 id=\"p-8\">Sex</h2>\n <p>Here’s an axiom: An ad-supported service can’t have sex-positive or explicit content. Advertisers simply won’t tolerate\n having their message appear beside NSFW images or Gay-Leatherman tales or exuberant trans-positivity. Mastodon\n can.</p>\n <p>Of course, you gotta be reasonable, posting anything actually illegal will get your ass perma-blocked and your account\n suspended. So will posting anything that’s NSFW etc without a “Content Warning”. That’s a built-in feature of Mastodon which\n puts a little warning (“#NSFW” and “#Lewd” are popular) above your post, which is tastefully blurred-out until whoever’s\n looking at it clicks on “Show content”.\n I use these all the time when \n I post about #baseball or #fútbol because a lot of the geeks and greens who follow me are pointedly uninterested in sports.</p>\n <p>(Oh, typing that in reminds me that you can subscribe to hashtags on Mastodon: Let’s see, I currently subscribe to, among\n others,\n <a href=\"https://mastodon.social/search?q=%23Vancouver\">#Vancouver</a>,\n <a href=\"https://mastodon.social/search?q=%23Murderbot\">#Murderbot</a>, and\n <a href=\"https://mastodon.social/search?q=%23Fujifilm\">#Fujifilm</a>.)</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/ivory.png\" alt=\"The Ivory For Mastodon app for Apple platforms\"></img>\n <div class=\"caption\"><p>The “Ivory for Mastodon” app for Apple platforms,<br></br>one of the many fine alternative clients.</p></div>\n <h2 id=\"p-9\">Moderation and defederation</h2>\n <p>Did I just mention, two paragraphs up, getting blocked? Mastodon isn’t free of griefers, but the tools to fight them are good\n and getting better.</p>\n <p>The good news is that each server moderates its own members. So there’s some variation\n of the standards from server to server, but less than you’d think. Since there are thousands of servers, there are\n thousands of moderators, which is a lot.</p>\n <p>If you act in a way that others find offensive, you’ll probably get blocked by the offended people and also reported; the\n report can come from any server and it’ll go to the moderators on yours. On a well-run server, those mods will have a look and\n if you’ve actually been bad, your post might get yanked and you might get warned, or in an extreme case, booted off.</p>\n <p>(I’ve been reported for saying unkind things about Bibi Netanyahu and for posting too many photos of my\n cats (no, really) but that kind of thing is cheerfully ignored by good moderation teams.)</p>\n <p>Then there’s Mastodon’s nuclear weapon: Defederation.\n Suppose you’re prone to nasty bigotry in public and you get reported a lot and your server’s moderators <em>don’t</em> rein\n you in. Eventually, word will get around, and if things aren’t cleaned up, most servers will defederate yours, so that\n <em>nobody</em> on their server can see posts from anyone on yours. Your site is no longer part of the “Fediverse”; this is a powerful\n incentive for server owners to take moderation seriously.</p>\n <p>The effect of all this is that the haters and scammers and Nazis who show up get shuffled off-stage PDQ. Well,\n almost always; a couple of years ago a wave of incoming Black people had bad experiences with racist abuse. Ouch. But\n the good news is that recent Mastodon releases have been shutting prone-to-abuse channels\n down, so things are better than then and should continue to improve.</p>\n <h2 id=\"p-11\">Links are good</h2>\n <p>Corporate social-media services like to\n <a href=\"https://talkingpointsmemo.com/tpm-25/how-elon-musks-changes-to-x-made-our-discourse-far-stupider\">downrank posts with\n links</a>.\n Which makes me want\n to scream, because my favorite thing to post is a link+reaction to something cool, and my favorite posts to read are too.</p>\n <p>On Mastodon, when you have a link in a post, the software automatically fetches a preview of whatever you linked to and uses\n it to decorate your link.\n I mean, it’s the damn Internet, it only got interesting to non-geeks when we figured out how to turn millions of servers\n into a great big honking searchable hypertext.</p>\n <h2 id=\"p-12\">Search</h2>\n <p>Speaking of which, Mastodon search is pretty good these days. It’s become, just like this blog, part of my outboard\n memory, and I’m always typing things like “telephoto from:me has:media” into the search box. Fast enough, too.</p>\n <h2 id=\"p-13\">Great clients</h2>\n <p>Another good thing about Mastodon is that there are lots of\n clients to choose from, mostly open-source. The best ones are miles ahead of Xitter and Threads and\n Bluesky and, really, anything.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/Screenshot_20251110-104045.png\" alt=\"A post from Brian Krebs in the Tusky app\"></img>\n <div class=\"caption\"><p>Anniversary post in the Android “Tusky” app.</p></div>\n <p>There are official Web and mobile clients from the Mastodon team and they’re fine, especially for admin and moderation work.\n But iOS people should check out\n <a href=\"https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/\">Ivory</a>, Androiders should look at\n <a href=\"https://tusky.app\">Tusky</a>, and everyone should try\n <a href=\"https://phanpy.social\">Phanpy</a>. I live in Phanpy on both my Mac and my Pixel<span class=\"dashes\"> —</span> it’s a\n Web thing but installable as a PWA on both Android and iOS.</p>\n <p>Commercial products, especially social-media services, have <em>never</em> been at peace with third-party clients.\n Twitter used to be, but then it stabbed those developers in the back. It’s easy to\n understand why; every product manager has it drilled into them that they <em>must control the user experience</em>. This ignores\n the ancient wisdom (I first heard it from\n <a href=\"https://en.wikipedia.org/wiki/Bill_Joy\">Bill Joy</a>) “Wherever you work, most of the smart people are somewhere else.”</p>\n <p>Mastodon doesn’t have that kind of product manager, but it does have a\n <a href=\"https://docs.joinmastodon.org/api/\">fully-capable API</a>, developed in the open and with no\n hidden or restricted features. Which means you’re going to get better clients.</p>\n <h2 id=\"p-14\">Algorithms</h2>\n <p>The algorithms that commercial social-media services use to sort your feed have one goal only: Maximize engagement and thus\n revenue. They have no concern for quality or novelty, and have been widely condemned by people who think about this stuff. So\n much so that there’s a feeling that Algorithms Are Bad.</p>\n <p>Mastodon has an algorithm: Show the posts from the accounts you follow, latest first. It works pretty\n well. It also has “Trending” feeds of the most popular posts, hashtags, and links. I hit those once a\n day or so to get a feeling for what’s going on in the world.</p>\n <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/trending.png\" alt=\"Trending screen in PhanPy\"></img>\n <div class=\"caption\"><p>The “Trending” display in Phanpy.</p></div>\n <p>I do think there’s room for improvement here; Bluesky has shown off the idea of pluggable feed-ranking algorithms, with many to\n choose from, and I like it. No reason in principle we couldn’t have the same thing on Mastodon.</p>\n <h2 id=\"p-15\">Money</h2>\n <p>Every other social network has started with a big pot of money, whether from venture-capital investors (Twitter, Instagram) or\n from a Big Tech corporate parent (Google+, Threads). The people who provided that money want it back, plus a whole lot more.\n Thus, the manic drive for “engagement” and growth at all costs. They need to build huge data centers and employ an elite\n operations team plus an even more elite marketing group.</p>\n <p>Mastodon, eh… a gaggle of nonprofits and co-ops and unincorporated affinity groups, financed by Patreon or low annual dues\n or Some Random Geek who enjoys running a server.</p>\n <p>Since nobody owns it, nobody can extract a profit from it. Which means that from the big-money point of view, it’s entirely\n non-investable. The goal isn’t for anybody to make money, it’s to be instructive and intense and fun. It’s run on the cheap.\n You know what they call systems that are cheap and diversified? Resilient. Sustainable. Long-lived.</p>\n <p>Last year\n <a href=\"https://www.tbray.org/ongoing/When/202x/2024/11/15/Not-Bluesky\">I wrote</a>: \n “Think of the Fediverse not as just one organism, but a population of mammals, scurrying around the ankles of the bigger and\n richer alternatives. And when those alternatives enshittify or fall to earth, the Fediversians will still be there.” After\n “scurrying” I should have added “and evolving”.</p>\n <h2 id=\"p-19\">What about Bluesky?</h2>\n <p>I like the Bluesky people and their software, but I worry a lot about whether they’re really decentralized in practice, and\n even more about their financial future. I wrote up the details in\n <a href=\"/ongoing/When/202x/2024/11/15/Not-Bluesky\">Why Not Bluesky</a>.</p>\n <h2 id=\"p-16\">Mastodon’s the only option</h2>\n <p>The only social-media option, I mean, that’s decentralized, not owned or controlled by anyone, and working well today as you\n read this. It’s intense and interactive and fun. Why settle for less?</p>\n <p><i>(Disclosure: I have no formal connections with the Mastodon organization, aside from being a low-level supporter on\n Patreon.)</i></p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Business/Publishing",
"term": "Business/Publishing",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Business",
"term": "Business",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Publishing",
"term": "Publishing",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "The World/Life Online",
"term": "The World/Life Online",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "The World",
"term": "The World",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Life Online",
"term": "Life Online",
"url": "https://www.tbray.org/ongoing/What/"
}
]
},
{
"id": "https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia",
"title": "Grokipedia",
"description": "Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I succumbed to boredom and killed the tab. Thus my introduction to Grokipedia. Here are early impressions",
"url": "https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia",
"published": "2025-10-28T19:00:00.000Z",
"updated": "2025-10-30T04:09:53.000Z",
"content": "<p>Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I\n succumbed to boredom and killed the tab. Thus my introduction to\n <a href=\"https://en.wikipedia.org/wiki/Grokipedia\">Grokipedia</a>. Here are early impressions.</p>\n <h2 id=\"p-1\">On Bray</h2>\n <p>My Grokipedia entry has over seven thousand words, compared to a mere 1,300 in\n <a href=\"https://en.wikipedia.org/wiki/Tim_Bray\">my Wikipedia article</a>. It’s pretty clear how it was generated; an LLM, trained\n on who-knows-what but definitely including that Wikipedia article and this blog, was told to go nuts.</p>\n <p>Speaking as a leading but highly biased expert on the subject of T. Bray, here are the key take-aways:</p>\n <h2 id=\"p-2\">(Overly) complete</h2>\n <p>It covers all the territory; there is no phase of my life’s activity that could possibly be encountered in combing the Web\n that is not exhaustively covered. In theory this should be good but in fact, who cares about the details of what I worked on\n at Sun Microsystems between 2004 and 2010? I suppose I should but, like I said, I couldn’t force myself to plod all the way\n through it.</p>\n <h2 id=\"p-3\">Wrong</h2>\n <p>Every paragraph contains significant errors. Sometimes the text is explicitly self-contradictory on the face of it,\n sometimes the mistakes are subtle enough that only I would spot them.</p>\n <h2 id=\"p-4\">Style</h2>\n <p>The writing has that LLM view-from-nowhere flat-affect semi-academic flavor. I don’t like it but the evidence suggests that\n some people do?</p>\n <h2 id=\"p-5\">References</h2>\n <p>All the references are just URLs and at least some of them entirely fail to support the text. Here’s an example. In\n discussion of my expert-witness work for the FTC in their litigation against Meta concerning its acquisitions of Instagram and\n WhatsApp, Grokipedia says:</p>\n <blockquote><p>[Bray] opined that users' perceptions of response times in online services critically influence market\n dynamics.</p></blockquote>\n <p>It cites\n <a href=\"https://www.ftc.gov/system/files/ftc_gov/pdf/FTCReplytoMetaResponse-CounterstatementofMaterialFacts.pdf\">Federal\n Trade Commission’s Reply to Meta Platforms, Inc.’s Response to Federal Trade Commission’s Counterstatement of Material\n Facts</a> (warning: 2,857-page PDF). Okay, that was one of the things I argued, but the 425 pages of court documents that I\n filed, and the references to my reporting in the monster document, make it clear that it was one tiny subset of the main\n argument.</p>\n <p>Anyhow, I (so that you won’t have to) spent a solid fifteen minutes spelunking back and forth through that FTC doc, looking\n for strings like “response time” and “latency” and so on. Maybe somewhere in those pages there’s support for the claim quoted\n above, but I couldn’t find it.</p>\n <h2 id=\"p-6\">Useful?</h2>\n <p>Wikipedia, in my mind, has two main purposes: A quick visit to find out the basics about some city or person or plant or\n whatever, or a deep-dive to find out what we <em>really</em> know about genetic linkages to autism or Bach’s relationship with\n Frederick the Great or whatever.</p>\n <p>At the moment, Grokipedia doesn’t really serve either purpose very well. But, after all, this is release 0.1, maybe we\n should give it a chance.</p>\n <p>Or, maybe not.</p>\n <h2 id=\"p-7\">Woke/Anti-Woke</h2>\n <p>The whole point, one gathers, is to provide an antidote to Wikipedia’s alleged woke bias. So I dug into that. Let’s consider\n three examples of what I found. First, from that same paragraph about the FTC opinion quoted above:</p>\n <blockquote>\n <p>While Bray and aligned progressives contend that such dominance stifles innovation by enabling predatory acquisitions and\n reduced rivalry—evidenced by fewer startup exits in concentrated sectors—counterarguments highlight that Big Tech's scale has\n fueled empirical gains, with these firms investing over $240 billion in U.S. R&D in 2024 (more than a quarter of national\n totals) and driving AI, cloud, and patent surges.[<a href=\"https://www.tbray.org/ongoing/When/202x/2020/06/08/Anti-monopoly\">128</a>]\n [<a href=\"https://www.intereconomics.eu/contents/year/2025/number/2/article/big-tech-and-the-us-digital-military-industrial-complex.html\">131</a>] Six tech industries alone accounted for\n over one-third of \n U.S. GDP growth from 2012–2021, comprising about 9% of the \n economy and sustaining 9.3 million jobs amid falling consumer prices and rapid technological diffusion.\n [<a href=\"https://itif.org/publications/2023/05/30/six-tech-industries-accounted-for-more-than-one-third-of-gdp-growth-in-the-last-decade/\">132]</a> \n [<a href=\"https://jamesmadison.org/the-united-states-is-the-leader-of-the-digital-revolution-pro-tech-policies-are-key/\">133</a>]\n Right-leaning economists often defend consumer welfare metrics and market self-correction, warning that forced divestitures\n risk eroding the efficiencies and investment incentives that have propelled sector productivity above 6% annual growth in key\n areas like durable manufacturing tech.\n [<a href=\"https://itif.org/publications/2025/09/19/five-persistent-myths-about-big-tech/\">134</a>]\n [<a href=\"https://www.nber.org/digest/oct01/technology-and-productivity-growth?page=1&perPage=50\">135</a>]</p>\n </blockquote>\n <p>I’ve linked the numbered citations to the indicated URLs. Maybe visit one or two of them and see what you think? Four are\n to articles arguing, basically, that monopolies must be OK because the companies accused of it are growing really fast and\n driving the economy. They seem mostly to be from right-wing think-tanks but I guess that’s what those think-tanks are for. One\n of them, #131, <cite>Big Tech and the US Digital-Military-Industrial Complex</cite>, I think isn’t helpful to the argument at\n all. But still, it’s broadly doing what they advertise: Pushing back against “woke” positions, in this case the position that\n monopolization is bad.</p>\n <p>I looked at a couple of other examples. For example, this is from the header of the Greta Thunberg article:</p>\n <blockquote>\n <p>While credited with elevating youth engagement on environmental issues, Thunberg's promotion of urgent, existential climate\n threats has drawn scrutiny for diverging from nuanced empirical assessments of climate risks and adaptation capacities, as\n well as for extending her activism into broader political arenas such as anti-capitalist and geopolitical protests.[5][6]</p>\n </blockquote>\n <p>Somehow I feel no urge to click on those citation links.</p>\n <p>If Ms Thunberg is out there on the “woke” end of the spectrum, let’s flit over to the other end, namely the entry for\n J.D. Vance, on the subject of his book <cite>Hillbilly Elegy</cite>.</p>\n <blockquote>\n <p>Critics from progressive outlets, including Sarah Smarsh in her 2018 book <cite>Heartland</cite>, faulted the memoir for\n overemphasizing personal and cultural failings at the expense of structural economic policies, arguing it perpetuated\n stereotypes of rural whites as self-sabotaging.[71] These objections, often rooted in institutional analyses from academia and\n media, overlooked data on behavioral patterns like opioid dependency rates—peaking at 21.5 deaths per 100,000 in Appalachia\n around 2016—that aligned with Vance's observations of \"deaths of despair\" precursors.[72]</p>\n </blockquote>\n <p>I read and enjoyed <cite>Heartland</cite> but the citation is to a <cite>New Yorker</cite> article that doesn’t mention\n Smarsh. As for the second sentence… my first reaction as I trudged through its many clauses, was “life’s too short”.\n But seriously, opioid-death statistics weaken the hypothesis about structural economic issues? Don’t get it.</p>\n <h2 id=\"p-8\">Take-away</h2>\n <p>Wikipedia is,\n <a href=\"/ongoing/When/202x/2024/06/15/Wikipedia-Pain\">to quote myself</a>, the encyclopedia that “anyone who’s willing to\n provide citations can edit”.\n Grokipedia is “the encyclopedia that Elon Musk’s LLM can edit, with sketchy citations and no progressive argument left\n un-attacked.”</p>\n <p>So I guess it’s Working As Intended?</p>",
"image": null,
"media": [],
"authors": [
{
"name": "Tim Bray",
"email": null,
"url": null
}
],
"categories": [
{
"label": "Technology/Publishing/Reference",
"term": "Technology/Publishing/Reference",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology",
"term": "Technology",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Publishing",
"term": "Publishing",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Reference",
"term": "Reference",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "Technology/AI",
"term": "Technology/AI",
"url": "https://www.tbray.org/ongoing/What/"
},
{
"label": "AI",
"term": "AI",
"url": "https://www.tbray.org/ongoing/What/"
}
]
}
]
}