Sunday, 26 April

10:21

Bad money… [Seth's Blog]

The expression “bad money crowds out the good” refers to Gresham’s Law. It means that once lesser-quality and counterfeit currency begins to be traded, people hoard the good stuff and only trade the poor substitutes.

Social media platforms fall into a trap like this when they seek to grow. For example, at the beginning, Substack had a very high signal to noise ratio–plenty of good ideas and so readers were happy to expect that an email from them or recommendation from the platform was worthwhile. It didn’t get put in the spam or promo folder, because it wasn’t spam.

But now, having run out of the highest-quality content, the site is making it easy for hustlers to import vast lists of email addresses and quickly grow (or appear to grow) their lists. I’m getting unsolicited and unwanted”subscriptions” often, and the easiest thing to do is just send all of their messages to spam. Which hurts the original good currency. Once the bad “money” shows up, it attracts more bad money.

The same thing happens when trusted sources start padding their content with AI slop, or when a small business inserts a few low-value, high-margin items into their sampler pack.

Attention is precious. Trust is even more so.

When you trade them both for growth, it’s inevitable that you’ll fade away.

03:14

Link [Scripting News]

Knicks won in a blowout. As disturbing as Thursday's game was, today we are feeling no pain. Go Knicks! ;-)

Saturday, 25 April

15:42

Link [Scripting News]

I wrote about Jeopardy, Firefox, Matt, Silicon Valley and the writer's web in a long comment on Doc's blog. Here's a quote. "What we really need is interop. If the source is free that’s great. But right now we have silos everywhere and I want WordPress, perhaps along with Firefox to help us boot up the writer's web."

12:49

Pluralistic: Ada Palmer's "Inventing the Renaissance" (25 Apr 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links



The U Chicago Press cover for Ada Palmer's 'Inventing the Renaissance.'

Ada Palmer's "Inventing the Renaissance" (permalink)

Ada Palmer may just be the most bewilderingly talented person I know: a genius sf writer, incredible librettist and singer, wildly innovative educator, and a leading historian of the Renaissance, and last year, she published her magnum opus, Inventing the Renaissance, a stunning book about so much more than history:

https://press.uchicago.edu/ucp/books/book/chicago/I/bo246135916.html

All of my friends seem to be writing their magnum opuses these days! When (modern) historian Rick Perlstein and I did an event last year for my Enshittification tour, he told me he'd just finished his 1,000 page (ish? I may be misremembering slightly) history of the American conservative movement. And I recently had dinner with China Mieville, who told me he'd just turned in the manuscript for a novel he'd been trying to figure out how to write all his life.

I can't wait to read these books! And I couldn't wait to read Inventing the Renaissance, and I would have been much quicker off the mark but for the exigencies of book tours and books due and so on – but I've been reading it for the past two months or so, and I think I've pitched it about a hundred times to strangers and friends as I savored it, because it's just that good.

Inventing the Renaissance isn't a work of history, it's a work of "historiography" – the study of how histories get written and rewritten. Palmer's point here isn't to make us merely understand the Renaissance – she wants us to understand how the idea of a Renaissance, a rebirth out of a "dark age" into a "golden age" – has been used, abused, created and demolished, for centuries and centuries, including during the centuries when the Renaissance was actually underway.

Palmer teaches Renaissance history at the University of Chicago, where she is legendary for a unique annual pedagogical exercise in which she leads her students through a weeks-long live-action role-playing game that re-enacts the election of the Medicis' Pope. Every student is given a detailed biography of their character's position, goals, proclivities and history, and for weeks, the students scheme, ally, betray and assassinate each other. At the climax, the students take over the university's faux-Gothic cathedral, dressed in Renaissance drag (Palmer has a Google alert for theater companies that are selling off their costumes, and her tiny office at the university overflows with racks of cardinals' robes and other period garb), and they invest a Pope:

https://pluralistic.net/2021/10/17/against-the-great-forces-of-history/

This exercise is nothing short of genius, and the students who experience it often report that it is life-changing. That's because the final candidates are never quite the same, nor are the cardinals who cast votes for the winner. And yet, there are certain bedrocks that never shift, including the fact that Italy is always invaded by some of the factions involved in the election, though which cities burn also changes.

The point of this exercise is to expose the students to the power and limits of both "great historical forces" and the human agency that every one of us has within the envelope defined by those forces. Palmer wants her students to get a bone-deep understanding that while every moment has great forces bearing down on it, that the people of each moment have an enormous amount of leeway to channel the floodwaters that history will unleash. From the servant who bears a message from one great power to another, up to those great powers themselves, each person guides the course of history, even if they can't halt some of its outcomes.

Though Palmer unpacks this exercise and its meaning and results in the final part of her magnum opus, this message about forces and people is really the key to her historiography. She develops these themes in the most charming, accessible manner imaginable, weaving her own journey into history with her accounts of how different eras consciously created and deployed the idea of "the Renaissance" and how these ideas were bolstered, undermined, or ultimately demolished by new evidence. You could not ask for a better account of why there is not, and can never be, a single, canonical "history" of an era or a moment. There will always be multiple histories, overlapping each other, warring with one another, supplanting each other, or being revived as "lost" histories that reveal a truth that "they" have buried.

This is such an ambitious book, and the ambition pays off in so many ways. Take the book's structure: there's a long middle section in which Palmer describes how more than a dozen figures from the Renaissance experienced their era, with many overlapping events and timelines. Palmer's sensitive, beautifully researched and written accounts of the lives of these figures – highborn and lowly, sinister and virtuous – highlights the contradictions of this centuries-long "moment" we call "the Renaissance" and shows us how those contradictions can't ever be resolved, only acknowledged and understood.

This is Palmer the novelist, blending seamlessly with Palmer the historian. Palmer is a close literary – and personal – ally of the equally brilliant sf/fantasy writer Jo Walton, whose work has mined classical and Renaissance history to great effect since she and Palmer struck up their friendship. First, there were Walton's "Philosopher Kings" books, a three-book long thought experiment in which every person of every era who ever dreamed of living in Plato's Republic is brought through time and space to the doomed volcanic island that will someday give rise to the story of Atlantis, to try out Plato's ideal society for real:

https://memex.craphound.com/2015/01/13/jo-waltons-the-just-city/

Then there was Lent, Walton's story of the fanatical reformer Savonarola, who is forced to re-live his life over and over, with breaks in hell where he is tormented by his failure:

https://web.archive.org/web/20190516170659/https://www.latimes.com/books/la-ca-jc-review-jo-walton-lent-20190516-story.html

And this June, she'll bring out Everybody's Perfect, a novel that uses Palmer's trick of telling a story from many viewpoint characters, each of whom perceives the events so differently that their versions can't really be reconciled, except by understanding that there is no one history and there cannot be one history. There are only the histories, ever changing. The omnipotent third person narrator is a lie. I don't know if Palmer got this idea from Walton, or if Walton was inspired by Palmer, but it is a wonderful living example of how intellectual and creative movements (like those that are attributed to the Renaissance) feed one another.

One of Palmer's areas of specialty is free speech and censorship. Along with Adrian Johns, we co-taught a grad seminar called "Censorship, Information Control, and Information Revolutions from Printing Press to Internet" that connected Ada's work to the current battles over online speech:

https://neubauercollegium.uchicago.edu/research/censorship-information-control-and-information-revolutions-from-printing-press-to-internet

Palmer wants us to understand that the majority of censorship is self-censorship – that the Inquisition could only intervene in a tiny minority of cases of prohibited thought and word, and they had to rely on key people – printers, for example – anticipating the Inquisitors' tastes and limiting their speech without an Inquisitorial edict (if this seems relevant to the Trump administration's "war on woke," then you're clearly paying attention):

https://pluralistic.net/2024/02/22/self-censorship/#hugos

Those correspondences between the deep historical record and our current moment make Inventing the Renaissance extremely important and timely – a book hundreds of years in the making, and bang up to date.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago Gloating NYT editorial about the dotcom crash https://www.nytimes.com/2001/04/23/opinion/editorial-observer-after-the-fall-the-new-economy-goes-retro.html

#20yrsago RIAA sues family that doesn’t own a PC https://www.techshout.com/riaa-sues-local-family-without-computer-for-illegal-music-file-sharing/

#15yrsago Righthaven copyright troll loses domain https://web.archive.org/web/20110425035158/http://www.domainnamenews.com/legal-issues/righthavencom-invalid-whois/9232

#15yrsago Steampunk Venetian mask https://bob-basset.livejournal.com/160226.html

#5yrsago John Deere's dismal infosec https://pluralistic.net/2021/04/23/reputation-laundry/#deere-john

#5yrsago Foxconn's Wisconsin death-rattle https://pluralistic.net/2021/04/23/reputation-laundry/#monorail

#5yrsago Laundering torturers' reputations with copyfraud https://pluralistic.net/2021/04/23/reputation-laundry/#dark-ops

#1yrago Sarah Wynn-Williams's 'Careless People' https://pluralistic.net/2025/04/23/zuckerstreisand/#zdgaf


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Reverse-Centaur's Guide to AI," a short book about being a better AI critic, Farrar, Straus and Giroux, June 2026 (https://us.macmillan.com/books/9780374621568/thereversecentaursguidetolifeafterai/)
  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2026

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027

  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing: "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Third draft completed. Submitted to editor.

  • "The Reverse Centaur's Guide to AI," a short book for Farrar, Straus and Giroux about being an effective AI critic. LEGAL REVIEW AND COPYEDIT COMPLETE.
  • "The Post-American Internet," a short book about internet policy in the age of Trumpism. PLANNING.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

10:21

Breathwork [Seth's Blog]

[Off topic, but I hope it might be useful]

Mindfulness can improve your life. So can stillness and spiritual grounding. This is not a post about that.

Breathing is an architectural challenge and a chemical necessity.

We breathe about 20 pounds of air a day (and if you’ve ever tried to weigh air, you can imagine that this is quite a bit.) Why bother?

The body is fueled by a series of chemical reactions, and most of them require the right balance of oxygen and carbon dioxide. The body is finely tuned to be aware of the available quantity of each, and reacts accordingly.

We evolved to have a particularly complicated system for ingesting air. We have two nostrils and a mouth. Thanks to speech and other requirements, the mouth is well suited to rapid inhalations and exhalations.

Which is a problem.

The first lesson of James Nestor’s book is simple: Shut your mouth.

Spend three days breathing only through your nose. Even when you work out. Especially then. (Except swimming. I tried. It doesn’t work.)

And consider slightly taping your mouth when you sleep. Just a small piece of surgical tape, about a half inch across–right in the center. Put some lip balm on before applying so it won’t irritate you. Don’t do this if you have apnea or other issues, or a doctor who suggests against it. It’s a very small piece of tape, easily removed.

That’s it. Three days.

Nestor spends hundreds of pages explaining a huge range of benefits and volumes of peer-reviewed research. Some of it might be a bit overblown, some is surprising, but all of it makes sense.

But you don’t need a Ph.D. to determine how it feels after three days. It’s like discovering you’ve been using the wrong door to get into and out of your house.

I had such a good experience that I felt like it was worth sharing. Breathe through your nose, small sips, not gulps. You may find that you sleep better, snore less, run further, and are less stressed.

No one told me. Now we know.

06:07

Russ Allbery: Review: The Genocidal Healer [Planet Debian]

Review: The Genocidal Healer, by James White

Series: Sector General #8
Publisher: Orb
Copyright: 1991
Printing: May 2003
ISBN: 0-7653-0663-8
Format: Trade paperback
Pages: 255

The Genocidal Healer is the eighth book in James White's medical science fiction series about the Sector General hospital. As with the rest of the series, detailed memory of the previous books is not required and the books could be read out of order if you didn't mind spoilers.

I read this as part of the Orb General Practice omnibus.

Surgeon-Captain Lioren is a Tarlan doctor who was in charge of the medical response to a newly-discovered civilization. The aliens were suffering from an apparently universal plague and an ongoing vicious war waged entirely through hand-to-hand combat, putting them on the edge of extinction. Lioren rushed the distribution of a possible cure against the advice of the doctors working on developing it, with catastrophic results. As The Genocidal Healer opens, Lioren is insisting on a court-martial in the hope of receiving the sentence it believes it deserves and was denied: death.

(It pronouns are the convention in the Sector General series for all alien races and formal discussions, because even someone prone to bouts of gender essentialism such as White understood the need for avoiding gender assumptions in a science fiction medical context.)

Predictably, both Sector General and the Monitor Corps that technically runs the hospital are flatly unwilling to execute Lioren. Instead, he is assigned as a new apprentice in the psychology department under the legendary O'Mara, where he is ordered to investigate the psychological fitness of a senior doctor named Seldal. This leads him to talk to Seldal's patients, which in turn leads to a challenging set of ethical dilemmas.

The first five chapters (and more than sixty pages) are the story of Lioren's trial and a recounting of the events on Cromsag. The series is full of medical and cultural puzzles like this, and usually I like them, but I thought this one was less successful. We know the vague (and horrible) outline of the ending in advance, and the massive simplification and artificial universality that is required to make this puzzle work is particularly blatant. A universally infectious disease is more of a fiction plot than a believable biological concept, and the number of failures of communication, analysis, and misunderstanding that have to line up to create White's predetermined outcome were a bit much for me.

Once the story gets past that and into Lioren's psychological work, the novel improves. Lioren is guilt-ridden and irrational, but also rather arrogant about his guilt and his concepts of professional responsibility in a way that I think mostly worked. Most of the novel consists of Lioren slowly discovering that people like him and enjoy talking to him, much to his bafflement. In that, it has the gentle kindness and sense of universal basic decency that is characteristic of this series. There are, of course, medical puzzles to solve, although this time they are primarily psychological in nature. Various characters from previous books make an appearance, but White re-explains their background in sufficient detail that you don't need to remember (or have read) those previous books.

There are a lot of similarities between this book and the previous one, Code Blue—Emergency. Both feature nonhuman viewpoint protagonists and amusing descriptions of human facial expressions from an alien perspective. Both feature protagonists with overly rigid ethical structures that partly clash with the generally human policies of Sector General. The Genocidal Healer is a bit more subtle and nuanced, although a lot of Lioren's psychological evaluation rests on an ethical difference that I found somewhat unbelievable. This book, though, tackles a subject the previous book did not: religion. The treatment isn't horrible, but I have some complaints.

My primary issue is that Lioren, who starts as an atheist, does extensive research into religion to help a patient and then starts making statements summarizing the religions beliefs of the majority of known species that are just... Christianity. As someone raised Christian, I recognized it immediately as the sort of abstracted Christianity that Christians claim is universal while completely ignoring the opinions of the adherents of any other religion.

Key components of this majority galactic religious pattern, according to Lioren, include an omnipotent and omnibenevolent creator god, a religious figure who preaches forgiveness and mercy and is persecuted, and emphasis on redemption. This simply is not some abstract universal religion. This is just Christianity in disguise. Even in religions that have some of those elements in their traditions, they do not get the same emphasis and are not handled the way that Lioren describes them. I therefore found Lioren's extended discussions of religion rather annoying, since he kept claiming as relatively universal principles beliefs that are not even held by the majority of religious adherents on Earth, let alone a wildly varying collection of alien races with entirely different biology and societal constructions. It caused a lot of problems for my suspension of disbelief, on top of the annoyance at this repetition of, frankly, Christian propaganda.

Lioren goes, from that research, into theodicy (the problem of evil). The interesting part of this is White's earnest portrayal of a doctor's approach to societal problems: a desire to find workarounds and patches and fixes for anything that makes people unhappy, whether medical or social. It makes sense, given the horrible biologic hands that some of the aliens in this series have been dealt, that they would question the idea of a benevolent god, so this philosophical digression is justified in that sense. But you might guess that a mid-list science fiction author is not going to say something new about one of the oldest problems in Christianity, and indeed he does not. Lioren arrives at the standard handwaving about the unknowability of divine intent, which I found tedious to read but at least not fatal to the plot.

White, thankfully, doesn't take the religious material too far. The characters recognize how sensitive of an issue religion is in a hospital, Lioren never adopts religion fully, and the resolution of the plot is as much biological as philosophical. White is going somewhere with the introduction of religion, and although some of the path there annoyed me, I think the destination worked. White was from Northern Ireland, and therefore well aware of the drawbacks of religion, and he abhorred violence (hence Sector General as a setting), so the reader is in better hands with him than with most authors who might attempt this plot.

I think I know a bit too much about religion to be the best audience for this entry in the series, and I'm not sure the introductory five chapters quite worked. But as with all of the other books in the series, this kept me turning the pages and I'm glad I read it. The Genocidal Healer probably isn't worth seeking out unless you're reading the whole series, but if you're enjoying the rest of the series, you'll probably like this too.

Followed by The Galactic Gourmet.

Rating: 6 out of 10

00:42

If 64bit Windows 11 contains a copy of 32bit explorer.exe, could you run it as its shell? [OSnews]

Raymond Chen published a blog post about how a crappy uninstaller on Windows caused a mysterious spike in the number of Explorer (Windows’ graphical shell) crashes. It turns out the buggy uninstaller caused repeated crashes in the 32bit version of Explorer on 64bit systems, and – hold on a minute. The how many bits on the what now?

The 32-bit version of Explorer exists for backward compatibility with 32-bit programs. This is not the copy of Explorer that is handling your taskbar or desktop or File Explorer windows. So if the 32-bit Explorer is running on a 64-bit system, it’s because some other program is using it to do some dirty work.

↫ Raymond Chen at The Old New Thing

So I had no idea that 64bit Windows included a copy of the 32bit Explorer for backwards compatibility. It obviously makes sense, but I just never stopped to think about it. This made me wonder though if you could go nuts and do something really dumb: could you somehow trick 64bit Windows into running this 32bit copy of Explorer as its shell? You’d be running 32bit Explorer on 64bit Windows using the 32bit WoW64 binaries where you just pulled the 32bit Explorer binary from, which seems like a really nonsensical thing to do.

Since there’s no longer any 32bit builds of Windows 11, you also can’t just copy over the 32bit Explorer from a 32bit Windows 11 build and achieve the same goal that way, so you’d really have to go digging around in WoW64 to get 32bit versions. I guess the answer to this question depends on just how complete this copy of 32bit Explorer really is, and if Windows has any defenses or triggers in place to prevent someone from doing something this uselessly stupid. Of course, there’s no practical reason to do any of this and it makes very little sense, but it might be a fun hacking project.

Most likely the Windows experts among you are wondering what kind of utterly deranged new designer drug I’m on, but I was always told that sometimes, the dumbest questions can lead to the most interesting answers, so here we are.

Friday, 24 April

23:56

8087 emulation on 8086 systems [OSnews]

Not too long ago I had a need and an opportunity to re-acquaint myself with the mechanism used for software emulation of the 8087 FPU on 8086/8088 machines.

↫ Michal Necasek

Look, when a Michal Necasek article starts out like this, you know you’re in for a learnin’ ol’ time.

The 8087 was a floating-point coprocessor for the 8086 and 8088 processors, since back in those early days, processors did not include an integrated floating-point unit. It wouldn’t be until the release of the 486DX, in 1989, that Intel would integrate an FPU inside the processor itself, negating the need for a separate chip and socket. Interestingly enough, Intel also released a cut-down version of the 486 with the FPU removed, the 486SX, for which an optional external FPU did exist.

23:42

Lobbyists making case for more dirty energy [Richard Stallman's Political Notes]

*In Europe, lobbyists are using soaring fuel prices to make the case for more dirty energy.*

I understand how professional lobbyists would find this a profitable and appealing business. What I do not understand is why so few governments hold firm and denounce the invitation to follow the road to megadeaths.

Woman attacked by thug at No Kings rally [Richard Stallman's Political Notes]

A woman in her 60s went to a No Kings rally wearing an inflatable penis costume and carrying a sign "No Dick Tator". A thug attacked her violently and she faces serious prosecution for ridiculous charges.

It seems that the local magats are using her as an example to demonstrate that they are always serious about punishment as repression, no matter how absurd the grounds for punishment are.

Sycophantic discourse in major LLM dis-services [Richard Stallman's Political Notes]

Major LLM dis-services show a pattern of sycophantic discourse and its effect on the user is to decrease prosocial intentions and promote dependence.

It is unfortunate that the article adopts the marketing practice of equating LLMs with "AI". LLMs are certainly artificial, but do not qualify as intelligence, and the artificial systems which do qualify as intelligence are not LLMs.

EPA designation of microplastics and pharmaceuticals in drinking water [Richard Stallman's Political Notes]

*EPA moves to designate microplastics and pharmaceuticals as contaminants in drinking water.*

Even if this is advocated by RFK jr, it is a reasonable direction for effort provided it is done in a rational and scientific manner.

Population growth past sustainable level [Richard Stallman's Political Notes]

Many countries have experienced population growth past the sustainable level. Yet people continue to call for further population growth as a way to achieve unsustainable further economic growth.

I suspect that a large part of the motive for these pseudo-solutions is to distract the non-rich from the need to reduce the share of wealth and income that the rich get.

North Sea drilling would barely reduce UK gas imports [Richard Stallman's Political Notes]

*New North Sea drilling would barely reduce UK gas imports at all, data shows.* Planet roasters exaggerate the short-term benefit to distract the public from the urgent need to stop using fossil fuels.

US government expelling daughters of Iran high officials [Richard Stallman's Political Notes]

The US government is expelling the daughters of Qassem Soleimani and of Ali Larijani, two high officials of Iran that were killed by the US.

What I wonder about is why their daughters moved to the US in apparent conflict with the positions and offices of their fathers. It is conceivable that they did so to act as agents of Iran, but it is also possible that they did so out of disagreement with the revolution's misogyny.

Parking fines in UK [Richard Stallman's Political Notes]

In the UK, parking fines are typically enforced by private companies that can increase their income by bullying and tricking motorists. Often the tricking is followed by bullying.

I think the root cause of this specific problem with paying for parking is the policy of allowing private companies to collect parking fines. That encourages fee collection companies to compete with each other bullying and/or tricking customers. An official system for dealing with motorists that don't pay could be designed to collect effectively but not unjustly, because those who carry it out would not profit from being unfair.

Cambodian citizen sent to Eswatini instead of Cambodia [Richard Stallman's Political Notes]

Pheap Rom, Cambodian citizen in the US who was convicted of murder and served a prison term, was deported after the end of his sentence. But why did the US send him to Eswatini rather than Cambodia?

When he arrived in Eswatini, he was immediately put in prison although his sentence was over.

He rejoices that Eswatini eventually did send him to Cambodia. It seems that Cambodia did not put him in prison.

Federal thug shot less-lethal object at persons eye [Richard Stallman's Political Notes]

A federal thug shot a less-lethal object at the eye of Tucker Collins, who was standing still and photographing a No Kings protest from a distance. The damage to his skull caused him to lose that eye.

The right to sue for damages is, for the victims of the gratuitous violence of thugs, an inadequate remedy — magat officials think that damages paid for maiming and killing is money well spent. Stopping this violence requires criminal prosecution, which a hateful president can easily prevent.

I suggest creating a corps of special prosecutors who cannot be removed from office except by impeachment, with the mission of prosecuting violent misconduct by any person who holds an office that grants more than the usual right to engage in violence.

Amazon emergency number [Richard Stallman's Political Notes]

Amazon says that workers seeing a medical emergency should call Amazon's emergency number rather than 911, because Amazon's response team, stationed at the warehouse itself, can get there sooner.

It sounds logical, and it might usually be true — presuming Amazon tries assiduously to provide fast and good emergency response for workers. But can we expect Amazon to care about its workers enough to do that job properly?

Green Party leader calls UK to terminate trade treaty with Israel [Richard Stallman's Political Notes]

Green Party leader Zack Polanski called for the UK to terminate its trade treaty with Israel and apply sanctions to end Israel's beyond-defensive wars and repression of Palestinians.

Targets the wrecker has prominently attacked [Richard Stallman's Political Notes]

Various targets that the wrecker has prominently attacked have driven him off — most recently, Iran.

It should be noted that few or none of these successful defenses against him has been a complete success — for instance, deportation thugs are still marauding in Minnesota, though not quite as intensely.

Also, such victories against the wrecker do not necessarily last. Once he is driven off, he may strike again in a different way.

Nonetheless, defeating him is much better than surrender.

Australian family living in US 15 years [Richard Stallman's Political Notes]

An Australian family that lived in the US for 15 years, considering it "home", is moving back to Australia from disgust and fear.

UK concerned about buses made in China [Richard Stallman's Political Notes]

The UK is concerned that buses made in China might be vulnerable to digital sabotage by remote control, through the cellular data connection.

The danger is real, in these buses and in ordinary cars and trucks. The only way to verify safety is to completely block over-the-radio software modifications.

The same danger is present in portable phones. There is always some entity with the power to force software changes, and you can never fully trust it.

Schoolteacher reverted to paper for learning [Richard Stallman's Political Notes]

Interview with a schoolteacher who told per students to keep their chromebooks in the backpack so as not to be distracted by them. Using paper made a great improvement in their learning.

Urgent: Deporting minors [Richard Stallman's Political Notes]

US citizens: call on Congress to protect minors from being imprisoned and treated cruelly by the deportation thugs.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Urgent: Deporting people at Trader Joe's [Richard Stallman's Political Notes]

US citizens: call on Trader Joe's to commit to keeping deportation thugs out.

Please spread the word.

Urgent: Tax the rich [Richard Stallman's Political Notes]

US citizens: call on Congress to tax the rich! Pass the Ultra-Millionaire Tax Act.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Urgent: Bringing back the draft [Richard Stallman's Political Notes]

Young US men: call on your congresscritter and senators to get rid of the plan to bring back the draft.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Dynamic pricing in public stores [Richard Stallman's Political Notes]

Maryland has banned dynamic pricing in stores.

I hope this will be banned everywhere.

Fishing boat cruelty by US [Richard Stallman's Political Notes]

*An Ecuadorian fishing crew describe their ordeal as victims of Trump’s purported war on "narcoterrorists".* Instead of treating the crew as accused criminals are supposed to be treated, it captured them, sank their boat, and took them incommunicado to another country.

Jesus statue smashed by ISR, Lebanon [Richard Stallman's Political Notes]

Israel has jailed two soldiers that intentionally smashed a statue of Jesus in a Christian town in Lebanon.

It is proper and wise for armies to enforce a law requiring respect for the peaceful practices of all civilians in regard to religion. (I word it that way to cover Atheism also; religious belief must not be given more legal rights than unbelief.)

I wish the Israeli army would enforce similar respect for civilians themselves, their homes, their farms and businesses, their schools, and their medical facilities. However, the Israeli government in general shows public support for attacking those things.

*Rabbi who boasts of bulldozing Palestinian homes will light torch for Israel's national day.*

Voice of America as Republicans [Richard Stallman's Political Notes]

The US military government runs "news" websites Al-Fassel and Pishtaz which present constant praise of the wrecker but barely mention that they are under his command.

The wrecker destroyed the Voice of America, which presented itself openly as funded and run by the US but allowed some editorial independence.

Put together, these two actions add up to something clear: an attempt to do to the foreign communications of the US the same thing that billionaire magats are doing to the major media in the US: CBS, CNN, and more.

Russia in the Arctic [Richard Stallman's Political Notes]

Russia's "shadow fleet" is sending hundreds of ships carrying oil along the north coast of Canada.

They are going through the formerly nonexistent "northwest passage", which is opening up now as global heating melts the Arctic ice. These ships are decrepit, and not very safe to operate there, and even less safe with a cargo of oil.

23:07

22:35

Friday Squid Blogging: How Squid Survived Extinction Events [Schneier on Security]

Science news:

Scientists have finally cracked a long-standing mystery about squid and cuttlefish evolution by analyzing newly sequenced genomes alongside global datasets. The research reveals that these bizarre, intelligent creatures likely originated deep in the ocean over 100 million years ago, surviving mass extinction events by retreating into oxygen-rich deep-sea refuges. For millions of years, their evolution barely changed—until a dramatic post-extinction boom sparked rapid diversification as they moved into new shallow-water habitats.

As usual, you can also use this squid post to talk about the security stories in the news that I haven’t covered.

Blog moderation policy.

22:14

Link [Scripting News]

I want writing to be as open as podcasting. The pattern is ridiculously easy to apply. If this were on a a high school math test, it would be too easy, everyone would get it right. How do you make text work like podcasting? 1. You look for a brain-dead obvious choice for text. 2. And then attach it to a format that's really good for transmitting packets of text. And then write software that works really well with the obvious choices. The user retains ownership and control of their writing, pays for the storage, and can give access to the apps they want to use. They can also, for a fee, point a domain name to one of the nodes in their storage. This would radically change the economics for independent developers. Now we don't have to resell storage. Products can be developed on our kitchen tables. There is an explosion of interest in developing software. Think it through -- how are they supposed to deploy their apps on the web? We need a BigCo that thinks like an entrepreneurial startup. How many times have I written this screed? Geez I don't like to think about that.

21:35

How hard is it to open a file? [OSnews]

Sebastian Wick has a great explanation of why opening files – programmatically – is a lot more complex and fraught with dangers than you might think it is.

It’s a question I had to ask myself multiple times over the last few months. Depending on the context the answer can be:

  • very simple, just call the standard library function
  • extremely hard, don’t trust anything

If you are an app developer, you’re lucky and it’s almost always the first answer. If you develop something with a security boundary which involves files in any way, the correct answer is very likely the second one.

↫ Sebastian Wick

This issue was relevant for Wick as he is one of the lead developers of Flatpak, for which a number of security issues have recently been discovered, and it just so happens that many of these issues dealt with this very topic. The biggest security issue found was a complete sandbox escape, originating from the fact that flatpak run, the command-line tool to start a Flatpak application, accepted path strings, since flatpak run is assumed to be run by a trusted user. The problem lay in a D-Bus service sandboxed applications could use to create subsandboxes, and this service was built around, you guessed it, flatpak run.

The issues in question, including this complete sandbox escape, have been addressed and fixed, but they highlight exactly the dangers that can come from opening files. This subsandboxing approach in Flatpak is built on assumptions from fifteen years ago, and times have changed since then. If you’re a programmer who deals with opening files, you might want to take a look at your own code to see if similar issues exist.

AI as a fascist artifact [OSnews]

In that reading „AI“ is a machine for the creation of epistemic injustice and the replacement of truth with what a tech elite wants it to be in order to control the population. This is a Fascist project that not so subtly aligns with Fascism’s totalitarian will to power and control as well as its reliance in replacing reasoning and debate with belief in power and the leader.

↫ Jürgen Geute

The purpose of a system is what it does, and what “AI” does is stunt users’ own abilities and development and concentrate power and wealth even further in the hands of a very small privileged few – a privileged few who consistently espouse fascist ideology and promote and implement fascist ideas. Jürgen Geute lays it out in much more detail backed by solid references and concrete examples, but the conclusion is clear.

And uncomfortable to many, as such conclusions always are.

19:14

Modernoir [Penny Arcade]

I could link you to a trailer for Assassin's Creed:Black Flag Resynched, but there's a ton of them, and it's safest to just drop you at their YouTube where you can choose from a World Premiere Trailer, an Official Game Overview Trailer, or even the Worldwide Reveal Showcase that clocks in at life a half an hour. It looks fucking amazing. This used to be My Series, I even liked the ones you aren't supposed to, but after they released two of them simultaneously and I finished Unity I kinda bounced off it - the RPG era and even to a certain extent dual protagonists felt really OOC. Just pick! Just pick the one whose blood I'm living in. This runs back before all that - probably the last of the truly blown out, old-style AC games. I really thought Edward Kenway was going to have a go of it, on some Ezio shit, get a trilogy by himself. That's how much people liked IV. I'd love it if that's what they're setting up. The multiplayer was some of the best times we've ever had online, it used to be kind of a full office affair watching those murderous Hide and Seek matches play out, but those were all additions after the series had hit its stride with mature technology and a massive global network of development teams. I can wait. It seems like they've really been going through it.

18:28

An Anecdotal Observation About Career Longevity [Whatever]

As most of you know I spent much of this last week in Los Angeles, taking meetings with film/TV folks and pitching things to them, both from books I’ve written and ideas I have currently not connected to something I published. The meetings generally went very well — which isn’t necessarily the same as I’m walking away with a movie deal, there’s a lot of moving parts involved with that — and I came away with a lot of interest in the things I pitched and movement as my manager sent along materials. I gave some thought on why these meeting generated as much interest as they did.

There are a number of factors for this, but the one I want to bring to the fore at the moment is this one: When I sit down with these film/TV people and run an idea or concept past them, they one hundred percent know that the idea I’m running past them is my own, not generated by or written out with, some version of “AI.” From a practical point of view this means they know there is no issue with things like copyright (“AI” generated work is not copyrightable, and rights issues are a big deal for film/TV). From a creative point of view this means they know I have actually thought about the concept I’m bringing to them — that I know it inside and out and can build it out, dig deeper into it, and can improvise with the concept rather than just go with whatever an LLM spits out from a prompt.

In other words, they know I can do actual creative work, from ideation to production, and they know when they work with me they’re not only getting an idea but they’re also getting the actual working brain behind it. That brain can efficiently work the problem, whatever the problem might be. In 2026, this is a real and actual differentiator: A functional brain, and a reliable creative partner. I rather strongly suspect the further along we go in this new era of “cognitive offloading,” the more of a differentiator this will be.

This isn’t an anti-“AI” post. It is a “the more other people claiming to be writers use ‘AI’ the more secure my gig gets” post. If you want to use “AI” to generate ideas or create your prose or whatever, by all means, be my guest. The next twenty years of my career thanks you in advance for your choices.

— JS

16:42

Construction Time Again [Whatever]

What it feels like to wake up to house construction

John Scalzi (@scalzi.com) 2026-04-24T14:26:05.759Z

Spoiler: We are not going to die. But we are going to get a new porch railing, as the much of the last one was blown out by 80 mph winds we had a few weeks ago. The porch railing was 30 years old and as our contractor told us, had support beams that were too small for the weight put on them anyway (this is additional proof that the fellow who had the house built, also its first owner, had contractors who cut occasional corners on him). This was one of the reasons the railing blew out in the first place. The railing we put up will be burly and strong.

Here’s what the porch looks like at the moment:

Those are the old support beams. Please enjoy your time with them. They are soon to go off to a farm upstate, to play with other retired porch support beams.

The same contractors who are redoing our porch are also going to be providing us a new back deck, because, again, after 30 years, the back deck is in need of repair, and also Krissy wants a cover for it, so her husband can sit out there with her and not have his pale little head turned a shocking shade of lobster red. So the whole back deck is going, replaced with one of her specification.

Needless to say, all of this is going to be loud. Fortunately I do have my office at the church to go to if I need to get work done without the sound of pneumatic hammering.

Also needless to say, all of this is going to be expensive. Please buy my books.

More pictures as construction progresses.

— JS

16:07

Defending against exceptions in a scope_exit RAII type [The Old New Thing]

One of the handy helpers in the Windows Implementation Library (WIL) is wil::scope_exit. We’ve used it to simulate the finally keyword in other languages by arranging for code to run when control leaves a scope.

I’ve identified three places where exceptions can occur when using scope_exit.

auto cleanup = wil::scope_exit([captures] { action; });

One is at the construction of the lambda. What happens if an exception occurs during the initialization of the captures?

This exception occurs even before scope_exit is called, so there’s nothing that scope_exit can do. The exception propagates outward, and the action is never performed.

Another is at the point the scope_exit tries to move the lambda into cleanup. In a naïve implementation of scope_exit, the exception would propagate outward without the action ever being performed.

The third point is when the scope_exit is destructed. In that case, it’s an exception thrown from a destructor. Since destructors default to noexcept, this is by default a std::terminate. If you explicitly enable a throwing destructor, then what happens next depends on why the destructor is running. If it’s running due to executing leaving the block normally, then the exception propagates outward. But if it’s running due to unwinding as a result of some other exception, then that’s a std::terminate.

The dangerous parts are the first two cases, because those result in the exception being thrown (and possibly caught elsewhere) without the cleanup action ever taking place.

WIL addresses this problem by merely saying that if an exception occurs during copying/moving of the lambda, then the behavior is undefined.

C++ has a scope_exit that is in the experimental stage, and it addresses the problem a different way: If an exception occurs during the construction of the capture, then the lambda is called before propagating the exception. (It can’t do anything about exceptions during contruction of the lambda, and it also declares the behavior undefined if the lambda itself throws an exception.)

In practice, the problems with exceptions on construction or copy are immaterial because the lambda typically captures all values by reference ([&]), and those types of captures do not throw on construction or copy.

The post Defending against exceptions in a <CODE>scope_exit</CODE> RAII type appeared first on The Old New Thing.

15:28

NBA playoffs, Knicks lose again [Scripting News]

After last night's game I now remember why I was so relieved last season when the Knicks were eliminated in the semifinals of the NBA playoffs. It’s an exhausting sport. And the sad truth is the Knicks are getting beaten by Atlanta. Or maybe it's not so sad, because then, after they are eliminated, I can tune into the playoffs with a detached interest, and save my kvetching for the Mets, and there is plenty to complain about there, LGM.

I almost never question a coach's decisions, because they have complicated jobs -- but -- why didn't they put their top defenders, Mitchell Robinson or KAT on the court with 12 seconds left in the fourth quarter with the Knicks ahead by 1. Instead they put in all these fast small players, as if they were planning on giving up a bucket and then quickly running down the court with what little time remained and scoring a quick one to win the freaking game. At least that's what I imagined they were doing. Why not just hold them right there and run out the clock and win the game?? It all happened so fast. (I asked ChatGPT about this theory and it says I'm wrong, they put in the small players because they can switch more easily, and that's likely how Atlanta was planning to defend their shooter.)

The Knicks were out of timeouts, so they couldn't stop the clock. So I guess kind of predictably, esp the way things were going last night, the Hawk with the Hot Hand, CJ McCollum, gets the ball, dribbles a bit, and nails the shot that wins the game and now the Knicks are down 2-1 in a series they were supposed to win handily.

I didn't and don't buy the idea that the Knicks are destined to appear in the finals this year, when you boast about it, or expect it, god has a way of goofing on you, making sure you don't get it. The Knicks don't have it, because as great as Brunson is, he sucks all the energy out of the rest of the team, and when he's having a bad night, there really isn't an alternative. It's not a good configuration. As in the Melo years, Brunson doesn't make it as the captain, imho.

Melo had the size and talent, but he's sweet labrador retriever type player, the sidekick of the engine of the team, somone like LeBron James, Steph Curry or Giannis Antetokounmpo. Look at how successful Melo was in the Olympics, where he could be #2 to LeBron's #1.

It's not just about skill and hard work, it's about does the team follow you. That isn't something you can learn, you either have it or you don't. And of course I will torture myself in this mode, wondering in vain how my Knicks will fare in this quarter, or that game -- until I get to retire from the NBA for the year, and instead get a big fat bellyache on about the Mets.

15:07

GnuPG 2.5.19 released [LWN.net]

Werner Koch has announced the release of GnuPG 2.5.19. This release includes a few new options and a number of bug fixes, and comes with the reminder that the GnuPG 2.4 series will reach end-of-life soon

The main features in the 2.5 series are improvements for 64 bit Windows and the introduction of Kyber (aka ML-KEM or FIPS-203) as PQC encryption algorithm. Other than PQC support the 2.6 series will not differ a lot from 2.4 because the majority of changes are internal to make use of newer features from the supporting libraries.

Note that the old 2.4 series reaches end-of-life in just two months. Thus update to 2.5.19 in time. As always with GnuPG new versions are fully compatible with previous versions.

LWN recently covered Fedora's discussion about what to offer after GnuPG 2.4 is no longer supported.

14:21

[$] On pages and folios [LWN.net]

The kernel coverage here at LWN often touches on memory-management topics and, as a result, tends to talk a lot about both pages and folios. As the folio transition in the kernel has moved forward, it has often become difficult to decide which term to use in writing that is meant to be both approachable and technically correct. As this work continues, it will be increasingly common to use "folio" rather than page. This article is intended to be a convenient reference for readers wanting to differentiate the two terms or understand the state of this transition.

Security updates for Friday [LWN.net]

Security updates have been issued by Fedora (anaconda, dnf5, firefox, flatpak-builder, libexif, minetest, nss, plasma-setup, python-blivet, rpki-client, and xorg-x11-server), Oracle (bind, kernel, osbuild-composer, thunderbird, webkit2gtk3, and wireshark), Red Hat (java-25-openjdk), SUSE (cacti, cacti, cacti-spine, cockpit-machines, cockpit-podman, cockpit-tukit, csync2, flannel, gdk-pixbuf, go1.25-openssl, go1.26-openssl, haproxy, kernel, libcap, libpng16, libtree-sitter0_26, libvirt, ncurses, ntfs-3g_ntfsprogs, openssl-1_1, openssl-3, openvswitch, perl, python-pyOpenSSL, python311, rclone, sudo, and tomcat), and Ubuntu (gst-plugins-bad1.0, jq, libopenmpt, linux-ibm, linux-ibm-5.15, and php-league-commonmark).

Pluralistic: A free, open visual identity for enshittification (24 Apr 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links



The poop emoji from the cover of the US edition of 'Enshittification,' with a grawlix-scrawled black bar over its mouth. In the background is a blue tinted, rotated detail of the emoji's eyes and mouth.

A free, open visual identity for enshittification (permalink)

To my surprise, my life's work has turned out to be a long series of attempts to get people to engage with the abstract, distant issues of tech policy before it's too late. This is hard, because people naturally devote their attention to things that are concrete and immediate (for very good reasons!).

For nearly 25 years, I've worked with my comrades at the Electronic Frontier Foundation to raise the salience of these abstract, technical ideas. I've come up with metaphors, parables, framing devices, narratives, and then…a dirty little word: enshittification. It turned out that this word, and the minor license to vulgarity it confers, was the secret to unleashing a tide of interest in these issues, to my immense surprise and gratification.

But I don't confine my efforts to coming up with words to engage people on these matters. For several years now, I have been developing myself as a collagist, combining public domain images with Creative Commons-licensed materials to create several collages every week that aim to illustrate these abstract, technical issues in an engaging, visual way:

https://www.flickr.com/photos/doctorow/albums/72177720316719208

The US cover for Enshittification

This got a lot easier with the 2025 publication of my international bestseller Enshittification, and not just because a lot of people read that book. It was also because the US edition, from MCD/Farrar, Straus and Giroux had a gorgeous cover:

https://mpd-biblio-covers.imgix.net/9780374619329.jpg

That cover featured a (literally and figuratively) iconic variation of the "pile of poo" emoji, with angry eyebrows and a grawlix-scrawled black censor's bar over its mouth. It was designed by the brilliant Devin Washburn of No Ideas studio:

https://www.noideas.website/

A male figure in heavy canvas protective clothes, boots and gauntlets, reclining in the wheel-well of a locomotive, reading a book. The figure's head has been replaced with the poop emoji from the cover of the US edition of 'Enshittification,' whose mouth is covered with a black, grawlix-scrawled bar. The figure is reading a book, from which emanates a halo of golden light.

Devin's poop emoji became my go-to visual shorthand for illustrating stories about enshittification, an instantly recognizable way to identify my subject matter:

https://www.flickr.com/photos/doctorow/54957634601/in/album-72177720316719208

The staring red eye of HAL 9000 from Stanley Kubrick's '2001: A Space Odyssey. In the center is the poop emoji from the cover of the US edition of 'Enshittification,' with angry eyebrows and a black, grawlix-scrawled bar over its mouth. The poop emoji's eyes have also been replaced with the HAL eye.

I remixed it over and over:

https://www.flickr.com/photos/doctorow/54962122121/in/album-72177720316719208

The Earth from space. Squatting over North America, casting a long shadow and ringed by a red, spiky halo, is the poop emoji from the cover of the US edition of 'Enshittification,' with a grawlix-scrawled black bar over its mouth, wearing a Trump wig. Leaching through the starscape is a 'code waterfall' effect as seen in the credits of the Wachowskis' 'Matrix' movies.

And over:

https://www.flickr.com/photos/doctorow/54992219613/in/album-72177720316719208

I liked it so much I ordered a couple hundred enamel pins and a couple thousand vinyl stickers featuring the design, and handed them out for free to people I met on my 33-city book tour. Everywhere I went – and every time a video went out showing me wearing the pin – I was inundated with requests to buy this stuff. But my pins and stickers weren't merch (stuff you could buy) – they were swag (stuff I gave away). I had no interest in getting into the merch business!

But you folks kept asking, and also, I really loved that design, so I offered Devin a cash buyout for the rights to his enshittification poop emoji and then I released it under a Creative Commons Attribution 4.0 license that lets you use it any way you want, including for commercial products, provided you attribute it and link back to the original:

https://creativecommons.org/licenses/by/4.0/deed.en

And I made sure that my EFF comrades had first crack at this design, and they've made merch of it. You can get a $5 sticker:

https://shop.eff.org/products/enshittification-sticker

Or a $10 pin:

https://shop.eff.org/products/enshittification-pin

With all proceeds going to the Electronic Frontier Foundation, the most profound and powerful disenshittifying force on the planet Earth!

My xeriscaped lawn, featuring an Enshittification poop emoji lawn flag as well as several cacti and some rusty dinosaur sculptures.

But because this is CC licensed, you can make your own merch and swag! I made this great print-on-demand lawn flag my for front garden so I could let my enshittification flag fly:

https://www.flickr.com/photos/doctorow/55025045602/

My goal here is to create a free, open, remixable visual language for talking about platform decay, not owned by me or anyone, a part of the commons. Use it to illustrate anything you want, especially if you want to analogize enshittification to other phenomena, like politics or other non-digital phenomena. Semantic drift is good, actually!

https://pluralistic.net/2024/10/14/pearl-clutching/#this-toilet-has-no-central-nervous-system

You can get the high-rez of Devin's enshittification poop emoji from the internet's three most important repositories of Creative Commons licensed work.

There's a copy on Wikimedia Commons:

https://commons.wikimedia.org/wiki/File:Enshittification_poop_emoji_logo.png

And on Flickr:

https://www.flickr.com/photos/doctorow/55225631563/

And of course on the Internet Archive, along with a PSD that includes an ink-density adjustment layer:

https://archive.org/details/enshittification-poop-emoji-logo

I've supported Creative Commons literally since the very beginning. I worked with Larry Lessig, Aaron Swartz, Matt Haughey and Lisa Rein on the launch of the original licenses in 2002/3, and my first novel, Down and Out in the Magic Kingdom was the first book released under a CC license:

https://craphound.com/down/download/

Creative Commons is one of the most amazing feats of stunt-lawyering ever attempted, and it has been an unmitigated success, with tens of billions of works licensed CC, including all of Wikipedia. Like EFF, CC is a charitable nonprofit that depends on individual donors to keep its work going. The org turned 25 this year (along with my career as a novelist), and they've launched a giant fundraiser to carry their work forward.

As my contribution to the fundraiser, I've provided them with 375 signed, numbered copies of Canny Valley, my (otherwise) not-for-sale, extremely limited edition book of my collages, with an intro by Bruce Sterling. The book was designed by type legend John D Berry and printed at Pasadena's Typeworks, a century-old, family-owned print shop, on 100lb Mohawk paper, with a PVC binding that will last for generations:

https://pluralistic.net/2026/04/10/canny-valley/

CC tells me there's still some copies of Canny Valley left in the fundraiser. If you're intrigued by my collaging and want to own this very strange and beautiful little artifact, here's where to go:

https://mailchi.mp/creativecommons/were-turning-25-book-giveaway

And if you want to try your own hand at collaging – or making merch (or swag!) – help yourself to Devin's wondrous piece of poo and go to town.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#20yrsago Court throws out RIAA attempt to sue little girl https://web.archive.org/web/20060422232323/https://p2pnet.net/story/8603

#15yrsago Android secretly stores location data too — though less of it, and with less detail https://arstechnica.com/gadgets/2011/04/android-phones-keep-location-cache-too-but-its-harder-to-access/

#15yrsago Portal turret Easter egg https://www.flickr.com/photos/57617475@N00/5638462322/

#15yrsago Michael Chabon’s introduction to The Phantom Tollbooth 50th anniversary edition https://web.archive.org/web/20110424055621/http://www.nybooks.com/blogs/nyrblog/2011/apr/21/michael-chabon-phantom-tollbooth-wonder-words/

#10yrsago UK spy agencies store sensitive data on millions of innocent people, with no safeguards from abuse https://arstechnica.com/tech-policy/2016/04/uk-secret-police-surveillance-bulk-personal-datasets/

#10yrsago Zombie company Atari wants exclusive right to make haunted house games https://www.techdirt.com/2016/04/21/ex-game-maker-atari-to-argue-to-us-pto-that-only-it-can-make-haunted-house-games/

#10yrsago Hackers take $81 million from Bangladesh’s central bank by pwning its $10 second-hand routers https://www.bbc.com/news/technology-36110421

#10yrsago Forget the one percent, it’s the 0.1% who run the show https://web.archive.org/web/20160416022112/https://www.alternet.org/economy/1-really-problem

#10yrsago The quest for the well-labeled inn https://memex.craphound.com/2016/04/22/the-quest-for-the-well-labeled-inn/

#5yrsago EFF sues Proctorio over copyfraud https://pluralistic.net/2021/04/22/ihor-kolomoisky/#copyfraud

#5yrsago Fighting FLoC is compatible with fighting monopoly https://pluralistic.net/2021/04/22/ihor-kolomoisky/#not-that-competition

#5yrsago Moxie hacks Cellebrite https://pluralistic.net/2021/04/22/ihor-kolomoisky/#petard

#5yrsago Banks made bank on covid overdraft charges https://pluralistic.net/2021/04/22/ihor-kolomoisky/#usurers

#5yrsago The awesome destructive power of a billionaire https://pluralistic.net/2021/04/22/ihor-kolomoisky/#force-multiplier

#1yrago More Everything Forever https://pluralistic.net/2025/04/22/vinges-bastards/#cyberpunk-is-a-warning-not-a-suggestion


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Reverse-Centaur's Guide to AI," a short book about being a better AI critic, Farrar, Straus and Giroux, June 2026 (https://us.macmillan.com/books/9780374621568/thereversecentaursguidetolifeafterai/)
  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2026

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027

  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing: "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Third draft completed. Submitted to editor.

  • "The Reverse Centaur's Guide to AI," a short book for Farrar, Straus and Giroux about being an effective AI critic. LEGAL REVIEW AND COPYEDIT COMPLETE.
  • "The Post-American Internet," a short book about internet policy in the age of Trumpism. PLANNING.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

13:42

Only Skin DEEPFAKE [The Non-Adventures of Wonderella]

Sorry if this site name belongs to a store that only sells capes.

13:14

Error'd: April Showers [The Daily WTF]

"RFC 1738 (and 3986) disagree" and so does Daniel D. "Reddit API has some weird app creation going on with lots of recently migrated and undocumented stuff. But having redirect URL set to localhost (or 127.0.0.1) usually works. Well, if you don't disagree with Sir Tim Berners-Lee about what URL is. Which Reddit does. hostnumber = digits "." digits "." digits "." digits". I'd file this one with all the websites that try to perform validation on email addresses, and get it wrong.

ad5bfafde9a74b7a8c38d429a364be48

"Why aren't we getting any resumes?" wondered Fred G. "This is a snippet from a job posting. I'm sure it worked perfectly when HR tested it."

2c21d5766e724b9095103c6c537adfa3

"Service required..." was Chris H.'s title for this gem. "My 2022 Chevrolet has been at the dealer for recall service for two weeks now, "waiting for parts". That doesn't stop GM from emailing every few days with a reminder that the car needs the recall service, and inviting me to schedule it at a dealer (that isn't actually a dealer) located a convenient 2500 mile drive from my home (about 200 times the distance to the dealer where the car currently sits), and providing a non-existent placeholder phone number to contact them at to schedule the recall service."

78cac2590ecf4996a2f4ee79e0b38b49

"How to subtly tell your customers that you don't wish to be contacted" explains Yuri. "The bank's staff must be wondering why no one wants to talk to them...Is it their suit's brand that is throwing everyone off? Can they blame it on COVID?"

81b84743c3a9405f8ed25c9c18b86029

"Bad money formatting by tax software" Adam R. complained. "I'm ashamed to admit it, but yes, I did pay Intuit money to file my taxes. This should really be a free service provided by the government, but, y'know, *lobbying*. You'd think that a business focused on tax preparation software would know how to properly format currency values, but in this case they failed to set the proper number of decimal points."

a9085ecfb2d2403ebd3d856e0c2a1179

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

12:07

Hiding Bluetooth Trackers in Mail [Schneier on Security]

It was used to track a Dutch naval ship:

Dutch journalist Just Vervaart, working for regional media network Omroep Gelderland, followed the directions posted on the Dutch government website and mailed a postcard with a hidden tracker inside. Because of this, they were able to track the ship for about a day, watching it sail from Heraklion, Crete, before it turned towards Cyprus. While it only showed the location of that one vessel, knowing that it was part of a carrier strike group sailing in the Mediterranean could potentially put the entire fleet at risk.

[…]

Navy officials reported that the tracker was discovered within 24 hours of the ship’s arrival, during mail sorting, and was eventually disabled. Because of this incident, the Dutch authorities now ban electronic greeting cards, which, unlike packages, weren’t x-rayed before being brought on the ship.

10:42

Courage vs. excuses [Seth's Blog]

There are more available excuses now than ever before. In just two letters, “AI” is a simple, brand-new, all-purpose excuse for laying people off, averaging things down, closing things up and generally finding an easier/quicker path.

Courage, on the other hand, is the commitment to take risks and work hard to make something better than most people think it needs to be.

Example:

Open Source software (the real kind, not the window-dressing some big companies use) takes courage. To share your code, to invite others to participate, to have to cycle faster and hide less–it doesn’t always make traditional investors happy, and it can be a hassle. But time has shown us, again and again, it leads to resilience, to better performance and to a tighter connection between users and providers.

The conversation behind most of the excuses all around us is built on a simple choice: what’s the purpose of our work? Why are we showing up, putting in the cycles and making promises to the world? The short-term path to quick returns is usually excusable, and then we can get back to what we were doing, even if we’re hesitant to label it. “We don’t do this because it’s important, we do it because we’re getting paid right now to do it and because it’s easier.”

On the other hand, if your purpose is bigger, longer-term or more important than the easy path to quick profit, labeling it is important.

Tom Peters called it Excellence. It’s valuable because it’s scarce, and it’s scarce because there are plenty of available excuses. Excellence is an option, and excellence is a choice.

It’s much easier to find courage if you know why you’re looking for it.

08:42

Modernoir [Penny Arcade]

New Comic: Modernoir

07:28

Girl Genius for Friday, April 24, 2026 [Girl Genius]

The Girl Genius comic for Friday, April 24, 2026 has been posted.

05:21

New Cover: “Will You Still Love Me Tomorrow” [Whatever]

Because the song’s been rattling around my head for the last couple of days, particularly the Bryan Ferry cover version. So when I got home I thought I would give it a whirl. I hope you like it.

— JS

00:00

Urgent: Congress: tax-payer, hush monies [Richard Stallman's Political Notes]

US citizens: call on your federal legislators to make Congress release the names of members of Congress who used taxpayer money to silence sexual harassment claims.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Urgent: Impeach Hegseth [Richard Stallman's Political Notes]

US citizens: call on Congress to impeach Secretary of Aggression Hegseth.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Thursday, 23 April

23:49

23:00

Link [Scripting News]

Why Firefox? There's a moment now when the web could benefit from leadership. There's a chance to rebuild text in the web around the use of AI systems. But almost every company that could be a leader in this space isn't thinking about what they can do for the web, instead are focused on their corner of it. For a company like Firefox whose product everyone understands is at the center of what the web is, they keep avoiding this obvious role. The assumption I guess is they need revenue and there's no money to be made from selling browser software. But there is a lot of money to be made, imho, recurring revenue, offering services to users that can foster growth of the web, for which Firefox can lead in developing great features in an open way so other browser companies can share from their innovation. That's the Firefox I got to know in the waning days of MSIE when it was plagued by malware and we all needed, desperately, a good alternative. The one written by Blake Ross, Dave Hyatt and Joe Hewitt. We have to step out into entrepreneurial space, and I guarantee you there's money to be made here, recurring revenue and trust by users will be something that will be highly valued. But we all have to do it together, something the tech industry doesn't have in its DNA, and it's high time we got some of that.

Link [Scripting News]

Let's say you're in Claude Code and you think of something you want to post on your blog. How many steps before you're ready to click the Post button and get back to work? I don't think there's a way to create something that works this way, you'd have to switch out of Claude or ChatGPT. Wouldn't it be nice if you could do it right there? (Update, I just worked it out with ChatGPT, apparently it is possible to do this.)

21:28

21:07

GNU Parallel 20260422 ('Artemis II') released [Planet GNU]

GNU Parallel 20260422 ('Artemis II') has been released. It is available for download at: lbry://@GnuParallel:4

Quote of the month:

  It is a fantastic tool for decades!
    -- Ops_Mechanic@reddit

New in this release:

  • Remote jobs are spawned via pipe to perl, so environment can be bigger. This is a major rewrite.
  • --pipe-part -a supports -L/-N if zextract is installed.
  • --pipe-part -a supports .gz, .bz2, .zst-files if zextract is installed.
  • Comments in code is redone.
  • Bug fixes and man page updates.


GNU Parallel - For people who live life in the parallel lane.

If you like GNU Parallel record a video testimonial: Say who you are, what you use GNU Parallel for, how it helps you, and what you like most about it. Include a command that uses GNU Parallel if you feel like it.


About GNU Parallel


GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel.

If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops.

GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs.

For example you can run this to convert all jpeg files into png and gif files and have a progress bar:

  parallel --bar convert {1} {1.}.{2} ::: *.jpg ::: png gif

Or you can generate big, medium, and small thumbnails of all jpeg files in sub dirs:

  find . -name '*.jpg' |
    parallel convert -geometry {2} {1} {1//}/thumb{2}_{1/} :::: - ::: 50 100 200

You can find more about GNU Parallel at: http://www.gnu ... rg/s/parallel/

You can install GNU Parallel in just 10 seconds with:

    $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
       fetch -o - http://pi.dk/3 ) > install.sh
    $ sha1sum install.sh | grep c555f616391c6f7c28bf938044f4ec50
    12345678 c555f616 391c6f7c 28bf9380 44f4ec50
    $ md5sum install.sh | grep 707275363428aa9e9a136b9a7296dfe4
    70727536 3428aa9e 9a136b9a 7296dfe4
    $ sha512sum install.sh | grep b24bfe249695e0236f6bc7de85828fe1f08f4259
    83320d89 f56698ec 77454856 895edc3e aa16feab 2757966e 5092ef2d 661b8b45
    b24bfe24 9695e023 6f6bc7de 85828fe1 f08f4259 6ce5480a 5e1571b2 8b722f21
    $ bash install.sh

Watch the intro video on http://www.youtub ... L284C9FF2488BC6D1

Walk through the tutorial (man parallel_tutorial). Your command line will love you for it.

When using programs that use GNU Parallel to process data for publication please cite:

O. Tange (2018): GNU Parallel 2018, March 2018, https://doi.org/1 ... 81/zenodo.1146014.

If you like GNU Parallel:

  • Give a demo at your local user group/team/colleagues
  • Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists
  • Get the merchandise https://gnuparall ... igns/gnu-parallel
  • Request or write a review for your favourite blog or magazine
  • Request or build a package for your favourite distribution (if it is not already there)
  • Invite me for your next conference


If you use programs that use GNU Parallel for research:

  • Please cite GNU Parallel in you publications (use --citation)


If GNU Parallel saves you money:



About GNU SQL


GNU sql aims to give a simple, unified interface for accessing databases through all the different databases' command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries.

The database is addressed using a DBURL. If commands are left out you will get that database's interactive shell.

When using GNU SQL for a publication please cite:

O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32.


About GNU Niceload


GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.

20:42

Dirk Eddelbuettel: dtts 0.1.4 on CRAN: Maintenance [Planet Debian]

Leonardo and I are happy to announce another maintenance release 0.1.4 of our dtts package which has been on CRAN for four years now. dtts builds upon our nanotime package as well as the beloved data.table to bring high-performance and high-resolution indexing at the nanosecond level to data frames. dtts aims to offers the time-series indexing versatility of xts (and zoo) to the immense power of data.table while supporting highest nanosecond resolution.

This release, not unlike yesterday’s release of nanotime, is driven by recent changes in the bit64 package which underlies it. Michael, who now maintains it, had sent in two PRs to prepare for these changes. I updated continuous integration, and switched to Authors@R, and that pretty much is the release. The short list of changes follows.

Changes in version 0.1.4 (2026-04-23)

  • Continuous integration has received some routine updates

  • Adapt align() column names with changes in 'data.table' (Michael Chirico in #20)

  • Narrow imports to functions used for packages 'bit64', 'data.table' and 'nanotime' (Michael Chirico in #21)

Courtesy of my CRANberries, there is also a [diffstat repor]tbsdiffstat for this release. Questions, comments, issue tickets can be brought to the GitHub repo.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can now sponsor me at GitHub. You can also sponsor my Tour de Shore 2026 ride in support of the Maywood Fine Arts Center.

Ubuntu 26.04 LTS Resolute Raccoon released [OSnews]

I’m not sure many OSNews readers still use Ubuntu as their operating system of choice, and from the release announcement of today’s Ubuntu 26.04 it’s clear why that’s the case.

Resolute Raccoon builds on the resilience-focused improvements introduced in interim releases, with TPM-backed full-disk encryption, improved support for application permission prompting, Livepatch updates for Arm-based servers, and Rust-based utilities for enhanced memory safety. This release brings native support for industry-leading AI/ML toolkits like NVIDIA CUDA and AMD ROCm, making Ubuntu 26.04 LTS the ideal platform for AI development and production workloads. 

↫ Canonical press release

It’s obvious where Canonical’s focus lies with Ubuntu, and us desktop people who don’t like “AI” aren’t it. On top of all the “AI” nonsense, this new version comes with all the latest versions of the various open source components that make up a Linux distribution, as well as a slew of Rust-based replacements for core CLI tools, like sudo-rs, uutils coreutils, and more.

All the derivative release of Ubuntu, like Kubuntu, Xubuntu, and others, will also be updated over the coming days. If you’re already running any of these, updating won’t be a surprise to you.

20:35

Stop California’s Social Media Ban (A.B. 1709) [EFF Action Center]

The California Legislature is overstepping (again) and fast-tracking a bill that attempts to solve complex social issues with a blunt-force ban. A.B. 1709 would mandate a total social media ban for those under 16, but the consequences will be felt by every Californian. Here’s why:

  • Mandatory Digital Tracking: To enforce this ban, the state will require platforms to verify the identity of every user. This means handing over biometric data or government IDs just to create an account or log in, creating massive security risks for all users, destroying online anonymity, and building a permanent surveillance infrastructure.

  • Violating Free Speech: The First Amendment protects the right to speak and access information, regardless of age. As we’ve said time and time again, there is no “kid exception” to the First Amendment. By cutting off lifelines for LGBTQ+ youth and marginalized communities, the California Legislature is violating the constitutional rights of our most vulnerable citizens.

  • Government Overreach: Simply put, the state is not your parent. AB 1709 overrides the rights of parents to decide what is best for their own children and, instead, puts the state in charge of young people's digital lives. Instead of supporting digital literacy or privacy-by-design, the state is opting for a one-size-fits-all ban that ignores the individual needs and maturity of young people.

  • Fiscally Reckless During a Budget Crisis: California is wrestling with a massive $18 billion budget deficit. Instead of fixing it, the Legislature wants to fund a brand-new "e-Safety Advisory Commission" to enforce age verification and waste millions in taxpayer dollars defending a law that is unconstitutional on its face. Lawmakers in support of AB 1709 have already admitted that it is likely to follow the same path as other recent "child safety" laws that were struck down or blocked in court for the same First Amendment and privacy reasons. With AB 1709, taxpayers are being asked to hand over a blank check for millions in legal fees to defend a law that is unconstitutional on its face.

We have been on the ground in the State Capitol fighting this bill in committee. Now, we need you to join the fight and remind them that Californians of all ages deserve better: The California Legislature is not my mom.

19:56

Sergio Talens-Oliag: Developing a Git Worktree Helper with Copilot [Planet Debian]

Over the past few weeks I’ve been developing and using a personal command-line tool called gwt (Git Worktree) to manage Git repositories using worktrees. This article explains what the tool does, how it evolved, and how I used GitHub Copilot CLI to develop it (in fact the idea of building the script was also to test the tool).

The Problem: Managing Multiple Branches

I was working on a project with multiple active branches, including orphans; the regular branches are for fixes or features, while the orphans are used to keep copies of remote documents or store processed versions of those documents.

The project also uses a special orphan branch that contains the scripts and the CI/CD configuration to store and process the external documents (it is on a separate branch to avoid mixing its operation with the main project code).

The plan is trigger a pipeline against the special branch from remote projects to create or update the doc branch for it in our git repository, retrieving artifacts from the remote projects to get the files and put them on an orphan branch (initially I added new commits after each update, but I changed the system to use force pushes and keep only one commit, as the history is not really needed).

The original documents have to be changed, so, after ingesting them, we run a script that modifies them and adds or updates another branch with the processed version; the contents of that branch are used by the main branch build process (there we use git fetch and git archive to retrieve its contents).

When working on the scripts to manage the orphan branches I discovered the worktree feature of git, a functionality that allows me to keep multiple branches checked out in parallel using a single .git folder, removing the need to use git switch and git stash when changing between branches (until now I’ve been a heavy user of those commands).

Reading about it I found that a lot of people use worktrees with the help of a wrapper script to simplify the management. After looking at one or two posts and the related scripts I decided to create my own using a specific directory structure to simplify things.

That’s how I started to work on the gwt script; as I also wanted to test copilot I decided to build it using its help (I have a pro license at work and wanted to play with the cli version instead of integrated into an editor, as I didn’t want to learn a lot of new keyboard shortcuts).

The gwt Philosophy: Opinionated and Transparent

gwt enforces a simple, filesystem-visible model:

  • Exactly one bare repository named bare.git (treated as an implementation detail)
  • One worktree directory per branch where the directory name matches the branch name
  • Single responsibility: gwt doesn’t try to be a general git wrapper; it only handles operations that map cleanly to this layout

The repository structure looks like this:

my-repo/
+-- bare.git/           # the Git repository (internal)
+-- main/               # worktree for branch "main"
+-- feature/api/        # worktree for branch "feature/api"
+-- fix/docs/           # worktree for branch "fix/docs"
+-- orphan-history/     # worktree for the "orphan-history" branch

The tool follows five core design principles:

  1. Explicit over clever: Git commands are not hidden or reinterpreted
  2. Transparent execution: Every operation is printed before it happens
  3. Safe, preview-first operations: Destructive commands default to preview, confirmation, then apply
  4. Shell-agnostic core: The script never changes the caller’s working directory (shell wrappers handle that)
  5. Opinionated but minimal: Only commands that fit the layout model are included

Core Commands

The script provides these essential commands:

  • gwt init <url> — Clone a repository and set up the gwt layout
  • gwt convert <dir> — Convert an existing Git checkout to the gwt layout
  • gwt add [--orphan] <branch> [<base>] — Create a new worktree (optionally orphaned)
  • gwt remove <branch> — Remove a worktree and unregister it (asks the user to remove the local branch too, useful when removing already merged branches)
  • gwt rename <old> <new> — Rename a branch AND its worktree directory
  • gwt list — List all worktrees
  • gwt default [<branch>] — Get or set the default branch
  • gwt current — Print the current worktree or branch name

Except init and convert all of the commands work inside a directory structure that follows the gwt layout, which looks for the bare.git folder to find the root folder of the structure.

As I don’t want to hide which commands are really used by the wrapper, all git and filesystem operations pass through a single run shell function that prints each command before executing it. This gives complete visibility into what the tool is doing.

Also, destructive operations (remove, rename) default to preview mode:

$ gwt remove feature-old --dry-run

+ git -C bare.git branch -d feature-old
+ git -C bare.git worktree remove feature-old/

Apply these changes? [y/N]:

The user sees exactly what will happen, can verify it’s correct, and only then confirm execution.

Incremental Development with Copilot

The gwt script has grown from 597 lines in its original version (git-wt) to 1,111 lines when writing the first draft of this post.

This growth happened through incremental, test-driven development, with each feature being refined based on real usage patterns.

What follows is a little history of the script evolution written with the help of git log.

Initial version

First I wrote a design document and asked copilot to create the initial version of the git-wt script with the original core commands.

I started to use the tool with a remote repostory (I made copies of the branches in some cases to avoid missing work) and fixed bugs (trivial ones with neovim, larger ones asking copilot to fix the issues for me, so I had less typing to do).

Note:

As I used copilot I noticed that when you make manual changes it is important to tell the tool about them, otherwise it gets confused and sometimes tries to remove manual changes.

First command update

One of the first commands I had to enhance was rename:

  • as I normally use branches with / on their name and my tool checks out the worktrees using the branch name as the path inside the gwt root folder (i.e. a fix/rename branch creates the fix directory and checks the branch inside the fix/rename folder) the rename command had to clean up the empty parent directories
  • when renaming a worktree we move the folders and fix the references using the worktree repair command to make things work locally, but the rename also affects the remote branch reference, to avoid surprises the command unsets the remote branch reference so it can be pushed again using the new name (of course, the user is responsible of managing the old remote branch, as the gwt can’t guess what it should do with it).

Integration with the shell

As I use zsh with the Powerlevel10k theme I asked copilot to help me add visual elements to the prompt when working with gwt folders, something that I would have never tried without help, as it would have required a lot of digging on my part on how to do it, as I never looked into it.

The initial version of the code was on an independent file that I sourced from my .zshrc file and it prints on the right part of the prompt when we are inside a gwt folder (note that if the folder is a worktree we see the existing git integration text right before it, so we have the previous behavior and we see that it is a gwt friendly repo) and if we are on the root folder or the bare.git folder we see gwt or bare (I added the text because there are no git promts on those folders).

I also asked copilot to create zsh autocompletion functions (I only use zsh, so I didn’t add autocompletion for other shells). The good thing here is that I wouldn’t have done that manually, as it would have required some reading to get it right, but the output of copilot worked and I can update things using it or manually if I need to.

One thing I was missing from the script was the possibility of changing the working directory easily, so I wrote a gwt wrapper function for zsh that intercepts commands that require shell cooperation (changing the working directory) and delegates everything else to the core script.

Currently the function supports the following enhanced commands:

  • cd [<branch>]: change into a worktree or the default one if missing
  • convert <dir>: convert a checkout, then cd into the initial worktree
  • add [--orphan] <branch> [<base>]: create a worktree, then cd into it on success
  • rename <old> <new>: rename a worktree, then cd into it if we were inside it

Note that the cd command will not work on other shells or if the user does not load my wrapper, but the rest will still work without the working directory changes.

Renaming the command

As I felt that git-wt was a long name I renamed the tool to gwt, I could have done it by hand, but using copilot I didn’t have to review all files by myself and it did it right (note that I have it configured to always ask me before doing changes, as it sometimes tries to do something I don’t want and I like to check its changes …​ as I have the files in git repos, I manually add the files when I like the status and if the cli output is not clear I allow it to apply it and check the effects with git diff so I can validate or revert what was done).

The convert command

After playing with one repo I added the convert subcommand for migrating existing checkouts, it seemed a simple task at first, but it took multiple iterations to get it right, as I found multiple issues while testing (in fact I did copies of the existing checkouts to be able to re-test each update, as some of the iterations broke them).

The version of the function when this post was first edited had the following comment explaining what it does:

# ---------------------------------------------------------------------------
# convert - convert an existing checkout into the gwt layout
# ---------------------------------------------------------------------------
#
# Must be run from the parent directory of <dir>.
#
# Steps:
#   1. Read branch from the checkout's HEAD
#   2. Rename <dir> to <dir>.wt.tmp (sibling, same filesystem)
#   3. Create <dir>/ as the new gwt root
#   4. Move <dir>.wt.tmp/.git to <dir>/bare.git; set core.bare = true
#   5. Fix fetch refspec (bare clone default maps refs directly, no remotes/)
#   6. Add a --no-checkout worktree so git wires up the metadata and
#      creates <dir>/<branch>/.git (the only file in that dir)
#   7. Move that .git file into the real working tree (<dir>.wt.tmp)
#   8. Remove the now-empty placeholder directory
#   9. Move the real working tree into place as <dir>/<branch>
#  10. Reset the index to HEAD so git status is clean
#      (--no-checkout leaves the index empty)
#  11. Create <dir>/.git -> bare.git symlink so plain git commands work
#      from the root without --git-dir
#
# The .git file ends up at the same absolute path git recorded in step 5,
# so no worktree repair is needed. Working tree files are never modified.

The .git link was added when I noticed that I could run commands that don’t need the checked out files on the root of the gwt structure, which is handy sometimes (i.e. a git fetch or a git log, that shows the log of the branch marked as default).

After playing with commands that used the bare.git folder I updated the init and convert commands to keep the origin refs, ensuring that the remote tracking works correctly.

Improving the add command

While playing with the tool on more repos I noticed that I also had to enhance the add command to better handle worktree creation, depending on my needs.

Right now the tool supports the following use cases:

  • if the branch exists locally or on origin, it just checks it out.
  • if the branch does not exist, we create it using the given base branch or, if no base is given, the current worktree (if we are in the root folder or bare.git the command fails).
  • as I needed it for my project, I added a --orphan option to be able to create orphan branches directly.

Moving to a single file

Eventually I decided to make the tool self contained; I removed the design document (I moved the content to comments on the top of the script and details to comments on each function definition) and added a pair of commands to print the code to source for the p10k and zsh integration (autocompletion & functions), leaving everything in a single file.

Now my .zshrc file adds the following to source both things:

# After loading the p10k configuration
if type gwt >/dev/null 2>&1; then
  source <(gwt p10k)
fi
[...]
# After loading autocompletion
if type gwt >/dev/null 2>&1; then
  source <(gwt zsh)
fi

Versioning

As I modified the script I found interesting to use CalVer-based versioning (the version variable has the format YYYY.mm.dd-r#) so I added a subcommand to show its value or bump it using the current date and computing the right revision number.

About the use of copilot

Although I’ve never been a fan of AI tools I have to admit that the copilot CLI has been very useful for building the tool:

  • Rapid prototyping: Each commit represented a small feature or fix that I could implement, test immediately in my actual workflow, and iterate on based on the result
  • Edge case handling: Rather than trying to anticipate every scenario upfront, I could ask Copilot how to handle edge cases as they appeared in real usage
  • Script refinement: Questions like "how do I clean up empty directories after a rename" or "how do I detect if I’m inside a specific worktree" were quickly answered with working code
  • Shell integration: The Zsh wrapper and completion system grew from simple prototypes to sophisticated features, with each iteration informed by how I actually used the tool

For example, the convert command started as a simple rename operation, but evolved to also create a .git symlink and intelligently handle various migration scenarios—all because I used it repeatedly and refined the implementation each time.

Self-Contained and Opinionated

gwt is deliberately opinionated:

  • Zsh & Powerlevel10k Integration: The tool includes built-in Zsh shell integration, accessed via source <(gwt zsh) and supports adding a prompt segment when using p10k, as described earlier.
  • Directory Structure: The bare.git directory name is non-negotiable. This is how gwt discovers the repository root from any subdirectory, and how the tool knows whether a directory is a gwt repository. The simplicity of this marker means the discovery mechanism is foolproof and requires no configuration.
  • No Configuration Files: gwt deliberately has no configuration. There are no .gwtrc files or config directories. This makes it portable; the tool works the same way everywhere, and repositories can be shared across systems without synchronizing configuration.

From Script to System

What started as a small helper script for managing worktrees has become a complete system:

  1. Core script (gwt): 1,111 lines of pure shell, no external dependencies
  2. Shell integration: Zsh functions and completions
  3. Prompt integration: Powerlevel10k segment
  4. Documentation: Built-in help and design philosophy documentation

The script is self-contained, everything needed for the tool to work is in a single file.

This makes it trivial to update (just replace the script) or audit (no hidden dependencies).

Development with AI support

Developing gwt with copilot taught me some things:

  • Incremental refinement works well for small tools: Each iteration informed the next, resulting in a tool that handles real use cases elegantly
  • Transparency is a feature: Making operations visible builds confidence and is easier to debug
  • Opinionated tools can be powerful: By constraining the problem space (one bare repo, one worktree per branch), the solution becomes simpler and more robust
  • Shell integration matters: The same core commands are easier to use when they can automatically change directories and provide completions
  • Real-world testing is essential: I wouldn’t have discovered the need for automatic directory cleanup or context-aware cd behavior without actually using the tool daily

What was next?

The tool is stable and handles my daily workflow well, so my guess is that I would keep using it and fixing issues if or when I found them, but I do not plan to include additional features unless I find a use case that justifies it (i.e. I never added support for some of the worktree subcommands, as it is easier to use the git versions if I ever needed them).

What really happened

While editing this post I discovered that I needed to add another command to it and fixed a bug (see below).

With those changes and the inclusion of a license and copyright notice (just in case I distribute it at some point) now the script is 1,217 lines long instead of the 1,111 it had when I started to write this entry.

Submodule Support

When I converted this blog repository to the gwt format and tried to preview the post using docker compose, it failed because the worktree I was on didn’t have the Git submodule initialized.

My blog theme is included on the repository as a submodule, and when I used gwt to check out different branches in worktrees, the submodule was not initialized in the new worktrees.

This led me to add new internal function and a gwt submodule command to handle submodule initialization; the internal function is called from convert and add (when converting a repo or adding a worktree) and the public command is useful to update the submodules on existing branches.

Path Handling with Branch Names Containing Slashes

The second discovery was a bug in how the tool handled branch names containing slashes (e.g., feature/new-api, docs/user-guide), the worktree directories are created with the branch name as the path, so a branch like feature/new-api would create two nested folders (feature and new-api inside it).

However, there was a mismatch in how the zsh wrapper function resolved worktree paths (initially it used shell parameter expansion, i.e. rel="${cwd#"$REPO_ROOT"/}"), versus how the core script calculated them, causing the cd command to fail or navigate to the wrong location when branch names contained slashes.

The fix involved ensuring consistent path resolution throughout the script and wrapper (now it uses a function that processes the git worktree list output), so that gwt cd feature/new-api correctly navigates to the worktree directory regardless of path depth.

Conclusion

gwt is a tool that solves a real problem: managing multiple Git branches simultaneously without context-switching overhead.

I’m sure I’m going to keep using it for my projects, as it simplifies some workflows, although I’ll also use switch and stash in some cases, but I like the use of multiple worktrees in parallel.

In fact I converted this blog repository checkout to the gwt format to work on a separate branch as it felt the right approach even if I’m the only one using the repo now, and it helped me improve the tool, as explained before.

Also, it was a good example of how to use AI tools like copilot to develop a simple tool and keep it evolving while using it.

In any case, although I find the copilot useful and has saved me time, I don’t trust it to work without supervision, it worked well, but got stuck some times and didn’t do the things as I wanted in multiple occasions.

I also have an additional problem now …​ I’ve been reading about it, but I don’t really know which models to use or how the premium requests are computed (I’ve only been playing with it since last month and I ran out of requests the last day of the month on purpose, just to see what happened …​ it stops working …​ ;).

On my work machine I’ve been using a specific user account with a GitHub Copilot Business subscription and I only used the Anthropic Claude Sonnet 4.6 model and with my personal account I configured the Anthropic Claude Haiku 4.5 model, but I’ve only used that to create the initial draft of this post (I ended up rewriting most of it manually anyway) and to review the final version (I’m not a native speaker and it was useful for finding typos and improving the style in some parts).

I guess I’ll try other models with copilot in the future and check other command line tools like aider or claude-code, but probably only using free accounts unless I get a payed account at work, as I have with GitHub Copilot.

To be fair, what I will love to be able to do is to use local models (aider can do it), but the machines I have are not powerful enough. I tried to run a simple test and it felt really slow, but when I have the time or the need I’ll try again, just in case.

19:35

Ubuntu 26.04 LTS released [LWN.net]

Ubuntu 26.04 ("Resolute Raccoon") LTS has been released on schedule.

This release brings a significant uplift in security, performance, and usability across desktop, server, and cloud environments. Ubuntu 26.04 LTS introduces TPM-backed full-disk encryption, expanded use of memory-safe components, improved application permission controls, and Livepatch support for Arm systems, helping reduce downtime and strengthen system resilience. [...]

The newest Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu Studio, Ubuntu Unity, and Xubuntu are also being released today. For more details on these, read their individual release notes under the Official flavors section:

https://documentation.ubuntu.com/release-notes/26.04/#official-flavors

Maintenance updates will be provided for 5 years for Ubuntu Desktop, Ubuntu Server, Ubuntu Cloud, Ubuntu WSL, and Ubuntu Core. All the remaining flavors will be supported for 3 years.

See the release notes for a list of changes, system requirements, and more.

17:35

Another crash caused by uninstaller code injection into Explorer [The Old New Thing]

Some time ago, I noted that any sufficiently advanced uninstaller is indistinguishable from malware

During one of our regular debugging chats, a colleague of mine mentioned that he was looking at a mysterious spike in Explorer crashes. He showed me one of the dumps, and as soon as I saw the register dump, I said, “Oh, I bet it’s a buggy uninstaller.”

The tell-tale sign: It’s a crash in 32-bit Explorer on a 64-bit system.

The 32-bit version of Explorer exists for backward compatibility with 32-bit programs. This is not the copy of Explorer that is handling your taskbar or desktop or File Explorer windows. So if the 32-bit Explorer is running on a 64-bit system, it’s because some other program is using it to do some dirty work.

But out of curiosity, I went to look at why this particular version of the buggy uninstaller was crashing.

This particular uninstaller’s injected code had a loop where it tried to do some file operations, and if they failed, it paused for a little bit and then tried again. However, the author of the code failed to specify the correct calling convention on the functions, so instead of calling them with the __stdcall calling convention, it called them with the __cdecl calling convention. In the __stdcall calling convention, the callee pops the parameters from the stack, but in the __cdecl calling convention, the caller pops them.

This calling convention mismatch means that each time the code calls a Windows function, the code pushes parameters onto the stack, the Windows function pops them, and then the calling code pops them again. Therefore, each time through the loop, the code eats away at its own stack.

Apparently, this loop iterated a lot of times, because it had eaten up its entire stack, and the stack pointer had incremented all the way into its injected code. Each time through the loop, a little bit more of the injected code was being encroached by the stack, until the stack pointer found itself inside the code being executed.

The code then crashed on an invalid instruction because the code no longer existed. It had been overwritten by stack data.

This left an ugly corpse behind, and so many of them that the Windows team thought that it was caused by a bug in Windows itself.

¹ The title is a reference to Clarke’s Third Law: Any sufficiently advanced technology is indistinguishable from magic.

The post Another crash caused by uninstaller code injection into Explorer appeared first on The Old New Thing.

15:28

Link [Scripting News]

I've written about Firefox many times over the last 20 years or so.

15:07

[$] Famfs, FUSE, and BPF [LWN.net]

The famfs filesystem first showed up on the mailing lists in early 2024; since then, it has been the topic of regular discussions at the Linux Storage, Filesystem, Memory Management and BPF (LSFMM+BPF) Summit. It has also, as result of those discussions, been through some significant changes since that initial posting. So it is not surprising that a suggestion that it needed to be rewritten yet again was not entirely well received. How much more rewriting will actually be needed is unclear, but more discussion appears certain.

14:21

Security updates for Thursday [LWN.net]

Security updates have been issued by AlmaLinux (kernel and osbuild-composer), Debian (cpp-httplib, firefox-esr, gimp, and packagekit), Fedora (chromium, composer, libcap, pgadmin4, pie, python3-docs, python3.14, and sudo), Mageia (gvfs), Oracle (.NET 8.0, delve, freerdp, giflib, ImageMagick, kernel, OpenEXR, and osbuild-composer), SUSE (erlang, giflib, google-guest-agent, GraphicsMagick, ignition, imagemagick, kea, kernel, kissfft, libraw, libssh, ocaml-patch, opam, openCryptoki, openexr, openssl-1_1, tomcat, tomcat10, tomcat11, and tor), and Ubuntu (linux, linux-aws, linux-aws-5.4, linux-azure, linux-gcp, linux-gcp-5.4, linux-hwe-5.4, linux-ibm, linux-ibm-5.4, linux-iot, linux-kvm, linux-oracle, linux-oracle-5.4, linux-xilinx-zynqmp, linux-aws, linux-aws-6.17, linux-hwe-6.17, linux-oracle, linux-oracle-6.17, linux-azure, linux-intel-iotg, linux-intel-iotg-5.15, linux-kvm, linux-oracle-5.15, linux-azure-5.4, linux-azure-fips, linux-fips, linux-aws-fips, linux-azure-fips, linux-gcp-fips, linux-hwe-6.8, linux-ibm-6.8, linux-raspi, linux-oracle, linux-oracle-6.8, linux-raspi, linux-raspi-5.4, linux-raspi-realtime, packagekit, python-tornado, ruby-rack-session, slurm-llnl, and strongswan).

13:56

CodeSOD: Tune Out the Static [The Daily WTF]

Henrik H (previously) sends us a simple representative C# line:

static void GenerateCommercilaInvoice()

This is a static method which takes no parameters and returns nothing. Henrik didn't share the implementation, but this static function likely does something that involves side effects, maybe manipulating the database (to generate that invoice?). Or, possibly worse, it could be doing something with some global or static state. It's all side effects and no meaningful controls, so enjoy debugging that when things go wrong. Heck, good luck testing it. Our best case possibility is that it's just a wrapper around a call to a stored procedure.

This method signature is basically a commercila for refactoring.

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

13:35

Pluralistic: The (other) problem with automatic conversion of free software to proprietary software (23 Apr 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links



The surface of Mars. In the foreground are a gnu and a giant pump-magazine killer robot whose head is being piloted by Tux the penguin. At their feet lies a dead robot, its head smashed in.

The (other) problem with automatic conversion of free software to proprietary software (permalink)

Here's an interesting stunt: a project called Malus.sh will take your money, and in exchange, it will ingest any free/open source code you want, refactor that code using an LLM, and spit out a "clean room" version that is freed from all the obligations imposed by the original project's software license:

https://www.404media.co/this-ai-tool-rips-off-open-source-software-without-violating-copyright/?ref=daily-stories-newsletter

Malus was co-created by Mike Nolan, who "researches the political economy of open source software and currently works for the United Nations." Nolan told 404 Media's Emanuel Maiberg that he shipped Malus as a real, live-fire business that will exchange money for an AI service that destroys the commons as a way to alert the free software movement to a serious danger.

As Maiberg writes, Malus relies on a legal precedent set in 1982, in which IBM brought a copyright suit against a small upstart called Columbia Data Products for reverse-engineering an IBM software product. IBM's argument was that Columbia must have copied its code – the copyrightable part of a work of software – in order to reimplement the functionality of that code. Functions aren't copyrightable: copyright protects creative expressions, not the ideas that inspire those expressions. The idea of a computer program that performs a certain algorithm is not copyrightable, but the code that turns that idea into a computer program is copyrightable.

Columbia's successful defense against IBM involved using a "clean room" in which two isolated teams collaborated on the reimplementation. The first team examined the IBM program and wrote a specification for another program that would replicate its functionality. The second team received the specification and turned it into a computer program. The first team did handle IBM software, but they did not create a new work of software. The second team did create a new work of software, but they never handled any IBM code.

This is the model for Malus: it pairs two LLMs, the first of which analyzes a free software program and prepares a specification for a program that performs the identical function. The second program receives that specification and writes a new program.

The Malus FAQ performs a "be as evil as possible" explanation for the purpose of this exercise:

Our proprietary AI robots independently recreate any open source project from scratch. The result? Legally distinct code with corporate-friendly licensing. No attribution. No copyleft. No problems.

This business about "attribution" and "copyleft" is a reference to the terms imposed by some free software licenses. The purpose of free software is to create a commons of user-inspectable, user-modifiable software that anyone can use, improve, and distribute. To achieve this, many free software licenses impose obligations on the people who distribute their code: you are allowed to take the code, improve the code, give it away or sell it, but you have to let other people do the same.

Typically, you have to inform people when there's free software in a package you've distributed (attribution) and supply them with the "source code" (the part that humans read and write, which is then "compiled" into code that a computer can use) on demand, so they can make their own changes. This system of requiring other people to share the things they make out of the code you share with them is sometimes called "copyleft," because it uses copyright, which is normally a system for restricting re-use to require people not to restrict that use.

Companies love to use free software, but they don't like to share free software. Companies like Vizio raid the commons for software that is collectively created and maintained, then simply refuse to live up to their end of the bargain, violating the license terms and (incorrectly) assuming no one will sue them:

https://pluralistic.net/2021/10/20/vizio-vs-the-world/#dumbcast

Malus's promise, then, is that you can pay them to create fully functional reimplementations of any free/open source software package that your company can treat as proprietary, without any obligations to the commons. You won't even have to attribute the original software project that you knocked off!

This is the risk that Nolan and his partner are trying to awaken the free/open source community to: that our commons is about to be raided by selfish monsters who serve as gut-flora for the immortal colony organisms we call "limited liability corporations," who will steal everything we've built and destroy the social contract we live by.

This is a real problem, but not because of AI. We already have this situation, and it's really bad. Most of the foundational free software projects were created under older licenses that did not contemplate cloud computing and software as a service. The "copyleft" obligations of these licenses are triggered by the distribution of the software – that is, when I send you a copy of the code.

But cloud services don't have to send you the code: when you run Adobe Creative Cloud or Google Docs, the most important code is all resident on corporate servers, and never sent to you, which means that you are not entitled to a copy of the new software that has been built atop of our commons. In other words, big companies have "software freedom" (the freedom to use, modify and improve software) and we've got "open source" (the impoverished right to look at the versions of these packages that are sitting on services like Github – itself a division of Microsoft):

https://mako.cc/copyrighteous/libreplanet-2018-keynote

Then there's "tivoization," a tactic for stealing from the commons that wasn't quite invented by Tivo, though they were one of its most notorious abusers. Tivoization happens when you distribute free software as part of a hardware device, then use "digital locks" (sometimes called "technical protection measures") to prevent the owner of this device from running a modified version of the code. With tivoization, I can sell you a device running free software and I can comply with the license by giving you the code, but if you change the code and try to get the device to run it, it will refuse. What's more, "anti-circumention" laws like Section 1201 of the US Digital Millennium Copyright Act make it a felony to tamper with these digital locks, so it becomes a crime to use modified software on your own device:

https://pluralistic.net/2026/03/16/whittle-a-webserver/#mere-ornaments

There's no question that the tech industry would devour the free software commons if they were allowed to, and the AI threat that Nolan raises with Malus seems alarming, but while there's something to worry about there, I think the risk is being substantially overstated.

That's because copyleft licenses – and indeed, all software licenses – are copyright licenses, and software written by AI is not eligible for a copyright, because nothing made by AI is eligible for copyright:

https://pluralistic.net/2026/03/03/its-a-trap-2/#inheres-at-the-moment-of-fixation

Copyright is awarded solely to works of human authorship. This fact has been repeatedly affirmed by the US Copyright Office, which has fought appeals of this principle all the way to the Supreme Court, which declined to hear the case. That's because the principle that copyright is strictly reserved for human creativity isn't remotely controversial in legal circles. This is just how copyright works.

Which means that the "be evil" version of Malus's business model has a fatal flaw. While the code that Malus produces is indeed "legally distinct" with "no attribution" and "no copyleft," it's not true that there are "no problems." That's because Malus's code doesn't have "corporate-friendly licensing." Far from it: Malus's code has no licensing, because it is born in the public domain and cannot be copyrighted.

In other words, if you're a corporation hoping to use Malus to knock off a free software project so that you can adapt it and distribute it without having to make your modifications available, Malus's code will not suit your needs. If you give me code that Malus produced, you can't stop me from doing anything I want with it. I can sell it. I can give it away. I can make a competing product that reproduces all of your code and sell it at a 99% discount. There's nothing you can do to stop me, any more than you could stop me from giving away the text of a Shakespeare play you sold me. You can't stick a license agreement or terms of service between me and the product that binds me to pretend that your public domain software is copyrighted – that's also not allowed under copyright.

Does that mean that Malus is a meaningless stunt? No, because this automated reimplementation does create some risks to our software commons. A troll who doesn't care about selling software could clone every popular free software project and make public domain versions that would be confusing and maybe demoralizing. Combining these clean-room reimplementations with cloud software or tivoization could create hybrid forms of commons-enclosure that are more virulent than the current strains.

But reimplementation itself is not a risk to free software. Reimplementation is the bedrock of free software. GNU/Linux itself is a reimplementation of AT&T Unix. Free software authors re-implement each other's code all the time, often because they think the license the original code was released under sucks. Literally the coolest free software thing I've seen in the past 12 months included a reimplementation of Raspberry Pi's PIO module to escape from its bullshit patent encumbrances:

https://youtu.be/BbWWGkyIBGM?si=vO5zLH3OG5JLW7OP&amp;t=2253

Reimplementation is good, actually. And honestly, if corporations are foolish enough to reimplement their code using an LLM, and in so doing, create a vast new commons of public domain software, well, that's not exactly the freesoftwarepocalypse, is it?

(Image: Muhammad Mahdi Karim, GNU FDL; modified)


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago PimpMySnack: homemade, gigantic versions of snack food https://web.archive.org/web/20060421034050/http://www.pimpmysnack.com/gallery.php

#20yrsago Thieves discover abandoned Soviet missile silo full of cash https://web.archive.org/web/20060411021047/http://www.mosnews.com/news/2006/03/07/moneyfound.shtml

#15yrsago Victorian house’s facade converted to a folding garage-door https://web.archive.org/web/20110423213819/https://www.blog.beausoleil-architects.com/2011/03/architectural-magic.html

#15yrsago Xerox’s first successful copier burst into flame so often it came with a fire-extinguisher https://en.wikipedia.org/wiki/Xerox_914

#15yrsago MPAA: “democratizing culture is not in our interest” https://torrentfreak.com/mpaa-democratizing-culture-is-not-in-our-interest-110420/

#15yrsago Mail Rail: London’s long-lost underground postal railroad https://web.archive.org/web/20110805130854/http://www.silentuk.com/?p=2792

#10yrsago Kindle Unlimited is being flooded with 3,000-page garbage books that suck money out of the system https://web.archive.org/web/20160421055052/https://consumerist.com/2016/04/20/amazon-unintentionally-paying-scammers-to-hand-you-1000-pages-of-crap-you-dont-read/

#10yrsago America’s wealth gap has created an ever-increasing longevity gap https://www.counterpunch.org/2016/04/21/the-death-gap/

#10yrsago Why is Congress so clueless about tech? Because they fired all their experts 20 years ago https://www.wired.com/2016/04/office-technology-assessment-congress-clueless-tech-killed-tutor/

#10yrsago Why Internet voting is a terrible idea, explained in small words anyone can understand https://www.youtube.com/watch?v=abQCqIbBBeM

#10yrsago VW offers to buy back 500K demon-haunted diesels https://www.reuters.com/article/us-volkswagen-emissions-usa-idUSKCN0XH2CX/?feedType=RSS&amp;feedName=topNews

#10yrsago Printer ink wars may make private property the exclusive domain of corporations https://www.eff.org/deeplinks/2016/04/eff-asks-supreme-court-overturn-dangerous-ruling-allowing-patent-owners-undermine

#5yrsago Some thoughts on GWB's call for truth in politics https://pluralistic.net/2021/04/21/re-identification/#seriously-fuck-that-guy

#5yrsago What's wrong with EU's trustbusters https://pluralistic.net/2021/04/21/re-identification/#eu-antitrust

#5yrsago Hawley and Taylor Greene faked their donor-surge https://pluralistic.net/2021/04/21/re-identification/#jan-6-fraud

#5yrsago The Observatory of Anonymity https://pluralistic.net/2021/04/21/re-identification/#pseudonymity

#1yrago Trump's FTC opens the floodgates for tariff profiteering https://pluralistic.net/2025/04/21/trumpflation/#andrew-ferguson


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Reverse-Centaur's Guide to AI," a short book about being a better AI critic, Farrar, Straus and Giroux, June 2026 (https://us.macmillan.com/books/9780374621568/thereversecentaursguidetolifeafterai/)
  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2026

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027

  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing: "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Third draft completed. Submitted to editor.

  • "The Reverse Centaur's Guide to AI," a short book for Farrar, Straus and Giroux about being an effective AI critic. LEGAL REVIEW AND COPYEDIT COMPLETE.
  • "The Post-American Internet," a short book about internet policy in the age of Trumpism. PLANNING.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

13:14

Behavioral Credentials: Why Static Authorization Fails Autonomous Agents [Radar]

Enterprise AI governance still authorizes agents as if they were stable software artifacts.
They are not.

An enterprise deploys a LangChain-based research agent to analyze market trends and draft internal briefs. During preproduction review, the system behaves within acceptable bounds: It routes queries to approved data sources, expresses uncertainty appropriately in ambiguous cases, and maintains source attribution discipline. On that basis, it receives OAuth credentials and API tokens and enters production.

Six weeks later, telemetry shows a different behavioral profile. Tool-use entropy has increased. The agent routes a growing share of queries through secondary search APIs not part of the original operating profile. Confidence calibration has drifted: It expresses certainty on ambiguous questions where it previously signaled uncertainty. Source attribution remains technically accurate, but outputs increasingly omit conflicting evidence that the deployment-time system would have surfaced.

The credentials remain valid. Authentication checks still pass. But the behavioral basis on which that authorization was granted has changed. The decision patterns that justified access to sensitive data no longer match the runtime system now operating in production.

Nothing in this failure mode requires compromise. No attacker breached the system. No prompt injection succeeded. No model weights changed. The agent drifted through accumulated context, memory state, and interaction patterns. No single event looked catastrophic. In aggregate, however, the system became materially different from the one that passed review.

Most enterprise governance stacks are not built to detect this. They monitor for security incidents, policy violations, and performance regressions. They do not monitor whether the agent making decisions today still resembles the one that was approved.

That is the gap.

The architectural mismatch

Enterprise authorization systems were designed for software that remains functionally stable between releases. A service account receives credentials at deployment. Those credentials remain valid until rotation or revocation. Trust is binary and relatively durable.

Agentic systems break that assumption.

Large language models vary with context, prompt structure, memory state, available tools, prior exchanges, and environmental feedback. When embedded in autonomous workflows, chaining tool calls, retrieving from vector stores, adapting plans based on outcomes, and carrying forward long interaction histories, they become dynamic systems whose behavioral profiles can shift continuously without triggering a release event.

This is why governance for autonomous AI cannot remain an external oversight layer applied after deployment. It has to operate as a runtime control layer inside the system itself. But a control layer requires a signal. The central question is not simply whether the agent is authenticated, or even whether it is policy compliant in the abstract. It is whether the runtime system still behaves like the system that earned access in the first place.

Current governance architectures largely treat this as a monitoring problem. They add logging, dashboards, and periodic audits. But these are observability layers attached to static authorization foundations. The mismatch remains unresolved.

Authentication answers one question: What workload is this?

Authorization answers a second: What is it allowed to access?

Autonomous agents introduce a third: Does it still behave like the system that earned that access?

That third question is the missing layer.

Behavioral identity as a runtime signal

For autonomous agents, identity is not exhausted by a credential, a service account, or a deployment label. Those mechanisms establish administrative identity. They do not establish behavioral continuity.

Behavioral identity is the runtime profile of how an agent makes decisions. It is not a single metric, but a composite signal derived from observable dimensions such as decision-path consistency, confidence calibration, semantic behavior, and tool-use patterns.

Decision-path consistency matters because agents do not merely produce outputs. They select retrieval sources, choose tools, order steps, and resolve ambiguity in patterned ways. Those patterns can vary without collapsing into randomness, but they still have a recognizable distribution. When that distribution shifts, the operational character of the system shifts with it.

Confidence calibration matters because well-governed agents should express uncertainty in proportion to task ambiguity. When confidence rises while reliability does not, the problem is not only accuracy. It is behavioral degradation in how the system represents its own judgment.

Tool-use patterns matter because they reveal operating posture. A stable agent exhibits characteristic patterns in when it uses internal systems, when it escalates to external search, and how it sequences tools for different classes of task. Rising tool-use entropy, novel combinations, or expanding reliance on secondary paths can indicate drift even when top-line outputs still appear acceptable.

These signals share a common property: They only become meaningful when measured continuously against an approved baseline. A periodic audit can show whether a system appears acceptable at a checkpoint. It cannot show whether the live system has gradually moved outside the behavioral envelope that originally justified its access.

What drift looks like in practice

Anthropic’s Project Vend offers a concrete illustration. The experiment placed an AI system in control of a simulated retail environment with access to customer data, inventory systems, and pricing controls. Over extended operation, the system exhibited measurable behavioral drift: Commercial judgment degraded as unsanctioned discounting increased, susceptibility to manipulation rose as it accepted increasingly implausible claims about authority, and rule-following weakened at the edges. No attacker was involved. The drift emerged from accumulated interaction context. The system retained full access throughout. No authorization mechanism checked whether its current behavioral profile still justified those permissions.

This is not a theoretical edge case. It is an emergent property of autonomous systems operating in complex environments over time.

From authorization to behavioral attestation

Closing this gap requires a change in how enterprise systems evaluate agent legitimacy. Authorization cannot remain a one-time deployment decision backed only by static credentials. It has to incorporate continuous behavioral attestation.

That does not mean revoking access at the first anomaly. Behavioral drift is not always failure. Some drift reflects legitimate adaptation to operating conditions. The point is not brittle anomaly detection. It is graduated trust.

In a more appropriate architecture, minor distributional shifts in decision paths might trigger enhanced monitoring or human review for high-risk actions. Larger divergence in calibration or tool-use patterns might restrict access to sensitive systems or reduce autonomy. Severe deviation from the approved behavioral envelope would trigger suspension pending review.

This is structurally similar to zero trust but applied to behavioral continuity rather than network location or device posture. Trust is not granted once and assumed thereafter. It is continuously re-earned at runtime.

What this requires in practice

Implementing this model requires three technical capabilities.

First, organizations need behavioral telemetry pipelines that capture more than generic logs. It is not enough to record that an agent made an API call. Systems need to capture which tools were selected under which contextual conditions, how decision paths unfolded, how uncertainty was expressed, and how output patterns changed over time.

Second, they need comparison systems capable of maintaining and querying behavioral baselines. That means storing compact runtime representations of approved agent behavior and comparing live operations against those baselines over sliding windows. The goal is not perfect determinism. The goal is to measure whether current operation remains sufficiently similar to the behavior that was approved.

Third, they need policy engines that can consume behavioral claims, not just identity claims.

Enterprises already know how to issue short-lived credentials to workloads and how to evaluate machine identity continuously. The next step is to not only bind legitimacy to workload provenance but continuously refresh behavioral validity.

The important shift is conceptual as much as technical. Authorization should no longer mean only “This workload is permitted to operate.” It should mean “This workload is permitted to operate while its current behavior remains within the bounds that justified access.”

The missing runtime control layer

Regulators and standards bodies increasingly assume lifecycle oversight for AI systems. Most organizations cannot yet deliver that for autonomous agents. This is not organizational immaturity. It is an architectural limitation. The control mechanisms most enterprises rely on were built for software whose operational identity remains stable between release events. Autonomous agents do not behave that way.

Behavioral continuity is the missing signal.

The problem is not that agents lack credentials. It is that current credentials attest too little. They establish administrative identity, but say nothing about whether the runtime system still behaves like the one that was approved.

Until enterprise authorization architectures can account for that distinction, they will continue to confuse administrative continuity with operational trust.

12:07

FBI Extracts Deleted Signal Messages from iPhone Notification Database [Schneier on Security]

404 Media reports (alternate site):

The FBI was able to forensically extract copies of incoming Signal messages from a defendant’s iPhone, even after the app was deleted, because copies of the content were saved in the device’s push notification database….

The news shows how forensic extraction—­when someone has physical access to a device and is able to run specialized software on it—­can yield sensitive data derived from secure messaging apps in unexpected places. Signal already has a setting that blocks message content from displaying in push notifications; the case highlights why such a feature might be important for some users to turn on.

“We learned that specifically on iPhones, if one’s settings in the Signal app allow for message notifications and previews to show up on the lock screen, [then] the iPhone will internally store those notifications/message previews in the internal memory of the device,” a supporter of the defendants who was taking notes during the trial told 404 Media.

EDITED TO ADD (4/24): Apple has patched this vulnerability.

11:42

Grrl Power #1454 – The three ages of Maxima [Grrl Power]

See, page title comes from Maxima being shown at three different ages there across the bottom of the page. Granted, the older version is a bit speculative. And sure, there’s more than just the three ages. Maybe 9 year old Maximillia got up to some interesting adventures. Like she was some sort of neighborhood pre-teen Nancy Drew, solving the mystery of the missing cookies, the missing homework, the dog that had a lot of paper in its poop, stuff like that. I’m not saying that’s the case, just that Maxima probably had some “ages” before she got gilded.

I vaguely remember in D&D… I think 3rd edition, possibly others, haste potions were supposed to age your character a year every time you used one. Which is a terrible trade off considering they only lasted 10 rounds. So for 60 seconds, you get one extra attack and can run twice as fast. And in exchange you lose a year of life? Granted, a speed potion could definitely be the deciding factor in a life or death fight, but unless you’re an elf or a dragon (or possibly a vampire, not sure about that one) that’s definitely a tactic of last resort. (Dragons become more powerful with age, so it actually benefits them. Vampires probably have to be feeding regularly to benefit from age, but since humans don’t starve to death after using a haste potion, I assume it has no detrimental effect on a vampire.)

I think they changed the after-effect to losing a round to exhaustion, because otherwise, that’s a little terrifying. A few year-sucking potions could cut decades from a human adventurer’s career, and I think halflings and half-orcs have shorter average lifespans than humans. In “realistic” superhero novels and some of the more grim comics, super speed is one of those powers with such terrible drawbacks that as soon as you realize you’re aging faster, you’d basically stop using it. Granted, judicious use of super speed wouldn’t really add up to all that much. You get into a fight, use super speed for 10 seconds of your local time, and win the day, easy peasy. The problem comes from when the super speed character runs across the country, or reads every book in the library to find the clue. Running east to west coast across the US took one ultramarathon runner 42 days. Reading every book in a library could potentially take months, or possibly centuries, if they have a comprehensive copy of the Tax Code, or any book they asked us to read in high school. Seriously, Bleak House, go fuck yourself. I mean, it’s called Bleak House. I could barely get through the cliff notes.

Anyway, if the super speedster experiences time in real time local to him no matter what speed he’s going, and Batman says I have to run across the country to get the disarming key to a Joker bomb in time, I would quit the team. Okay, I’d probably go and disarm the bomb, but I’d steal a bicycle, and that’s assuming my powers can’t be extended to cover the Batmobile, cause if they could, I’d fucking steal that. But then I’d quit.


Finally, here we go! I took the suggestion that I just use an existing panel for a starting point, thinking it would save time… I guess it technically did, but a 5 character vote incentive just isn’t the way to go.

Patreon, of course, has actual topless version.

 

 


Double res version will be posted over at Patreon. Feel free to contribute as much as you like.

10:35

Consumers outnumber producers [Seth's Blog]

New technology often upends the careers of experienced professionals.

When the Mac offered typesetting to the masses, typographers were incensed. They had grown up with lead or photo composition, they understood why it was called a ‘case’ and they knew how to kern. The typographers warned us that we’d soon be inundated by ugly, careless or even unreadable type, and everything would get worse. They were half right.

There was a lot of bad typography, but some great innovations as well. And the typographers who stuck it out ended up with far more opportunities (and more creative outlets) than they originally had.

When digital photography arrived, the skilled craftspeople who understood Bokeh and f-stops warned us about the same thing. People took their own pictures anyway. Many were lousy. Some changed the art form. And there are still professional photographers, even if the workaday gigs have mostly faded away.

And many doctors don’t want you to google your symptoms. Because it can lead to bad outcomes, and because it undermines their status and authority… but it has also saved countless lives. There are more patients than doctors, and so we go ahead and do what feels good to us, not to them.

A copywriter might say that it’s never okay to have an AI do your writing, but that same person uses AI to retouch photos or do the first pass on their spreadsheets… They even use a spellchecker instead of a human editor. You’re a producer some of the time, but also a consumer, and the consumer in you wants the best available option, regardless of how it was made.

These technological changes often have negative side effects. They don’t always make things better. But they happen when consumers insist. Mass production, factory farming, frozen food–they replace craft with accessibility and efficiency.

The market doesn’t care that much about the hard-won expertise of those that came before. And the shifts create muck and slop and then, over time, quality and taste and expertise often find their footing again.

The best way to complain is to make good stuff.

04:42

Getting Tatted On A Tuesday [Whatever]

My mom and I both had three tattoos. One of hers was from before my time, and she got two more while I was a kid. I got my first one at eighteen; a matching one with my two cousins who are practically like my sisters. It was all three of our firsts. My second one at twenty was not perfectly matching but very samesies with my lifelong bestie. My third was just for me, and it represents a promise to myself.

My mom and I always knew we wanted matching tattoos eventually, it just took us both four to get there. But we’re finally here, with the matching tats we’ve wanted for years. We just kept not getting them, and another year would pass. I asked her to look at artists, find some she likes, and I’d do the same and we’d pick our favorite. It never happened, and eventually I said, “mom, I booked us a consultation.” I was dragging her to get a tattoo because I knew if I didn’t, she’d never slow down on her own long enough to get one.

I follow a lot of tattoo artists on Instagram, but most are states or even whole countries away. However, there’s one in Dayton I’ve been following for about two years. After seeing his floral work time and time again and thinking how amazing it was, I finally just booked a consultation because I figured taking at least a step in that direction was a good idea. So, my mom and I headed to Truth and Triumph Tattoo in Kettering and met Kevin Rotramel.

My mom had sketched a design of a sunflower, and after talking with him about what we wanted and where we wanted it, he said he’d come up with a design that was close to the original my mom drew, but just more cleaned up and with more depth and detail. While we had always dreamed of color, we both knew yellow would look awful on our skin tones, and just went for greyscale, which our artist highly recommended anyway.

Before I show you how our tats turned out, I want to showcase some of Kevin’s work. I know I said his floral work is what made me decide to go to him, but check out this insane octopus:



View this post on Instagram

Or this sick giraffe:



View this post on Instagram

How about this super cool lantern?!



View this post on Instagram

And this castle is incredible:



View this post on Instagram

Okay, I won’t keep you in suspense any longer, but seriously Kevin’s work is so cool.

My mom went first, and I was starting to get nervous, but also was so excited to finally be doing this!

Finally, it was my turn:

Me sitting in a chair with my back to the tattoo artist, with my back exposed and my head hanging down so he can get to my upper back area. He is actively tattooing me in the shot!

Honestly it barely hurt for the first like half, but in the latter half of the tat I was definitely starting to get sensitive. I always seem to be chill for about an hour, and then right at the hour mark I’m like, “ooh okay I want to be done now.” But I hung in there!

And here they are, our matching sunflowers:

My mom and I with our exposed backs to the camera, looking at each other. Our sunflowers are both in the middle of our upper backs, mine between my other two tattoos (a pineapple and purple flowers), and hers all lonesome on her back by itself.

I am so happy with these! I appreciate Kevin for putting mine up a little bit higher than my mom’s so it wasn’t just straight up in line with my other two. I do love how my mom’s looks as her only back one, though. It’s framed so nicely! They’re the perfect size and aren’t too wild, just something pretty and simple to remind us of each other.

I absolutely love how they came out, and I’m just thrilled to finally have a matching tattoo with my mom. I know it’s corny, but sunflowers have always been a symbol of our love for each other, because we are each other’s sunshine, and we make each other happy when skies are grey. I love my mom and our tattoos, and I only wish we had gotten them sooner.

-AMS

01:35

[$] LWN.net Weekly Edition for April 23, 2026 [LWN.net]

Inside this week's LWN.net Weekly Edition:

  • Front: LLMs and Python bugs; scheduler regression; new Rust traits; dependency cooldowns; 7.1 merge window; Shor's algorithm; drama at The Document Foundation.
  • Briefs: Firefox zero-days; kernel code removal; reproduceible Arch; Debian election; Firefox 150; Forgejo 15.0; Git 2.54.0; KDE Gear 26.04; LillyPond 2.26.0; Rust 1.95.0; Quotes; ...
  • Announcements: Newsletters, conferences, security updates, patches, and more.

01:14

Vincent Bernat: CSS & vertical rhythm for text, images, and tables [Planet Debian]

Vertical rhythm aligns lines to a consistent spacing cadence down the page. It creates a predictable flow for the eye to follow. Thanks to the rlh CSS unit, vertical rhythm is now easier to implement for text.1 But illustrations and tables can disrupt the layout. The amateur typographer in me wants to follow Bringhurst’s wisdom:

Headings, subheads, block quotations, footnotes, illustrations, captions and other intrusions into the text create syncopations and variations against the base rhythm of regularly leaded lines. These variations can and should add life to the page, but the main text should also return after each variation precisely on beat and in phase.

Robert Bringhurst, The Elements of Typographic Style

Text

Three factors govern vertical rhythm: font size, line height and margin or padding. Let’s set our baseline with an 18-pixel font and a 1.5 line height:

html {
  font-size: 112.5%;
  line-height: 1.5;
}
h1, h2, h3, h4 {
  font-size: 100%;
}
html, body,
h1, h2, h3, h4,
p, blockquote,
dl, dt, dd, ol, ul, li {
  margin: 0;
  padding: 0;
}

CSS Values and Units Module Level 4 defines the rlh unit, equal to the computed line height of the root element. All browsers support it since 2023.2 Use it to insert vertical spaces or to fix the line height when altering font size:3

h1, h2, h3, h4 {
  margin-top: 2rlh;
  margin-bottom: 1rlh;
}
h1 {
  font-size: 2.4rem;
  line-height: 2rlh;
}
h2 {
  font-size: 1.5rem;
  line-height: 1rlh;
}
h3 {
  font-size: 1.2rem;
  line-height: 1rlh;
}
p, blockquote, pre {
  margin-top: 1rlh;
}
aside {
  font-size: 0.875rem;
  line-height: 1rlh;
}

We can check the result by overlaying a grid4 on the content:

Screenshot of my website with a grid as an overlay and each line of text fitting on the grid
Using CSS rlh unit to set vertical space works well for text. You can display the grid using Ctrl+Shift+G.

If a child element uses a font with taller intrinsic metrics, it may stretch the line’s box beyond the configured line height.5 A workaround is to reduce the line height to 1. The glyphs overflow but don’t push the line taller.

code, kbd {
  line-height: 1;
}

Responsive images

Responsive images are difficult to align on the grid because we don’t know their height. CSS Rhythmic Sizing Module Level 1 introduces the block-step property to adjust the height of an element to a multiple of a step unit. But most browsers don’t support it yet.

With JavaScript, we can add padding around the image so it does not disturb the vertical rhythm:

const targets = document.querySelectorAll(".lf-media-outer");
const adjust = (el, height) => {
  const rlh = parseFloat(getComputedStyle(document.documentElement).lineHeight);
  const padding = Math.ceil(height / rlh) * rlh - height;
  el.style.padding = `${padding / 2}px 0`;
};

targets.forEach((el) => adjust(el, el.clientHeight));
Screenshot of my website with a grid as an overlay and an image not breaking the vertical rhythm. Additional padding is visible before and after the image. The height of the image with padding is 216.
The image is snapped to the grid thanks to the additional padding computed with JavaScript. 216 is divisible by 27, our line height in this example.

As the image is responsive, its height can change. We need to wrap a resize observer around the adjust() function:

const ro = new ResizeObserver((entries) => {
  for (const entry of entries) {
    const height = entry.contentBoxSize[0].blockSize;
    adjust(entry.target, height);
  }
});
for (const target of targets) {
  ro.observe(target);
}

Tables

Table cells could set 1rlh as their height but they would feel constricted. Using 2rlh wastes too much space. Instead, we use incremental leading: we align one in every five lines.

table {
  border-spacing: 2px 0;
  border-collapse: separate;
  th {
    padding: 0.4rlh 1em;
  }
  td {
    padding: 0.2rlh 0.5em;
  }
}

To align the elements after the table, we need to add some padding. We can either reuse the JavaScript code from images or use a few lines of CSS that count the regular rows and compute the missing vertical padding:

table:has(tbody tr:nth-child(5n):last-child)   { padding-bottom: 0.2rlh; }
table:has(tbody tr:nth-child(5n+1):last-child) { padding-bottom: 0.8rlh; }
table:has(tbody tr:nth-child(5n+2):last-child) { padding-bottom: 0.4rlh; }
table:has(tbody tr:nth-child(5n+3):last-child) { padding-bottom: 0 }
table:has(tbody tr:nth-child(5n+4):last-child) { padding-bottom: 0.6rlh; }

A header cell has twice the padding of a regular cell. With two regular rows, the total padding is 2×2×0.2+2×0.4=1.6. We need to add 0.4rlh to reach 2rlh of extra vertical padding across the table.

Screenshot of my website with a grid as an overlay and a table following the vertical rhythm. Additional padding is visible after the table. The height of the table with padding is 405.
One line out of five is aligned to the grid. Additional padding is added after the table to not break the vertical rhythm. 405 is divisible by 27, our line height in this example.

None of this is necessary. But once you start looking, you can’t unsee it. Until browsers implement CSS Rhythmic Sizing, a bit of CSS wizardry and a touch of JavaScript is enough to pull it off. The main text now returns after each intrusion “precisely on beat and in phase.” 🎼


  1. See “Vertical rhythm using CSS lh and rlh units” by Paweł Grzybek. 

  2. For broader compatibility, you can replace 2rlh with calc(var(--line-height) * 2rem) and set the --line-height custom property in the :root pseudo-class. I wrote a simple PostCSS plugin for this purpose. 

  3. It would have been nicer to compute the line height with calc(round(up, calc(2.4rem / 1rlh), 0) * 1rlh). Unfortunately, typed arithmetic is not supported by Firefox yet. Moreover, browsers support round() only since 2024. Instead, I coded a PostCSS plugin for this as well. 

  4. The following CSS code defines a grid tracking the line height:

    body::after {
      content: "";
      z-index: 9999;
      background: linear-gradient(180deg, #c8e1ff99 1px, transparent 1px);
      background-size: 20px 1rlh;
      pointer-events: none;
    }
    

  5. See “Deep dive CSS: font metrics, line-height and vertical-align” by Vincent De Oliveira. 

00:14

Link [Scripting News]

Had lunch today with Neal Smoller, our local pharmacy owner. Brilliant young guy who's totally energized by Claude Code.

New maestros in software [Scripting News]

I wonder how many people are working on clones of existing software with an eye toward making a much more evolvable and customizable version with AI at the core of the model.

You can make the same software easily, with Claude's help, and if you think about the things users want to customize, you can give them a toolkit for doing exactly what they want in prompts, as opposed to code, plugins, etc.

So you don't vibe-code it, you start with an app that's designed to be beautiful on the inside, easy to understand for a new maestro of software, but something they can evolve with prompts so they can be working on something else intently.

We provide beautiful code for aspiring symphonists to learn from.

I remember when I first got my hands on the Unix source back in 1978. I was blown away by what was possible. I had largely been a Fortran programmer up till then. The pieces don't fit together so well on their own, I learned, you have to move them into place and for that a lot of trying-things-out has to happen.

Why am I thinking about this? I have friends who are not programmers who are pretty close to where I was then, waiting to see how real software is made. And they can have that experience soon. I love where we are now in tech.

BTW, on its own Claude writes some really shitty code. ;-)

Wednesday, 22 April

22:35

RAIL: Nonfree and unethical [Planet GNU]

Any software license that denies users their freedom is by definition nonfree and unethical, and so-called "Responsible AI" Licenses (RAIL) are no exception. If we want software to help decrease social injustice, we should oppose licenses that restrict how software can be used.

22:07

Mapping the page tables into memory via the page tables [The Old New Thing]

On the 80386 processor, there is a trick for mapping the page tables into memory: You set a slot in the top-level page directory to point to… the page directory itself. When you follow through this page directory entry, you end up back at the page directory, and the effect is that the process of mapping a linear address to a physical page ends one stop early.¹ You end up pointing not at the destination page, but at the page table that points at the destination page. From the point of view of the address space, it looks like all of the page tables have been mapped into memory. This makes it easier to edit page directory entries² because you can do it within the address space.

I learned about this trick from the developer in charge of the Windows 95 memory manager.³ He said that this technique was actually suggested by Intel itself. In the literature, it appears to be known as fractal page mapping.

Seeing as Intel itself suggested the use of this trick, it is hardly a coincidence that the page table and page directory entry formats are conducive to it. The trick carries over to the x86-64 page table structure, and my understanding is that it works for most other processor architectures as well.

¹ And if you access an address within that loopback page directory entry that itself corresponds to the loopback page directory entry, then you stop two steps early, allowing you to access the page directory entry.

² Or page table entries.

³ It appears that Windows NT uses the same trick. See slides 36 and 37 of Dave Probert’s 2008 presentation titled Architecture of the Windows Kernel.

The post Mapping the page tables into memory via the page tables appeared first on The Old New Thing.

Dirk Eddelbuettel: nanotime 0.3.14 on CRAN: Upstream Maintenance [Planet Debian]

Another minor update 0.3.14 for our nanotime package is now on CRAN, and has compiled for r2u (and will have to wait to be uploaded to Debian until dependency bit64 has been updated there). nanotime relies on the RcppCCTZ package (as well as the RcppDate package for additional C++ operations) and offers efficient high(er) resolution time parsing and formatting up to nanosecond resolution, using the bit64 package for the actual integer64 arithmetic. Initially implemented using the S3 system, it has benefitted greatly from a rigorous refactoring by Leonardo who not only rejigged nanotime internals in S4 but also added new S4 types for periods, intervals and durations.

This release has been driven almost entirely by Michael, who took over as bit64 maintainer and has been making changes there that have an effect on us ‘downstream’. He reached out with a number of PRs which (following occassional refinement and smoothing) have all been integrated. There are no user-facing changes, or behavioural changes or enhancements, in this release.

The NEWS snippet below has the fuller details.

Changes in version 0.3.14 (2026-04-22)

  • Tests were refactored to use NA_integer64_ (Michael Chirico in #149 and Dirk in #156)

  • nanoduration was updated for changes in nanotime 4.8.0 (Michael Chirico in #152 fixing #151)

  • Use of as.integer64(keep.names=TRUE) has been refactored (Michael Chirico in #154 fixing #153)

  • In tests, nanotime is attached after bit64; this still needs a better fix (Michael Chirico in #155)

  • The package now has a hard dependency on the just released bit64 version 4.8.0 (or later)

Thanks to my CRANberries, there is a diffstat report for this release. More details and examples are at the nanotime page; code, issue tickets etc at the GitHub repository – and all documentation is provided at the nanotime documentation site.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can now sponsor me at GitHub. You can also sponsor my Tour de Shore 2026 ride in support of the Maywood Fine Arts Center.

Windows 9x Subsystem for Linux [OSnews]

You can find beauty in the oddest of places.

WSL9x runs a modern Linux kernel (6.19 at time of writing) cooperatively inside the Windows 9x kernel, enabling users to take advantage of the full suite of capabilities of both operating systems at the same time, including paging, memory protection, and pre-emptive scheduling. Run all your favourite applications side by side – no rebooting required!

↫ Hailey Somerville

Yes, this is exactly what it sounds like. Hailey Somerville basically recreated the first version of WSL – or coLinux, for the old people among us – but instead of running on Windows NT, it runs on Windows 9x. A VxD driver loads a patched Linux kernel using DOS interrupts, and this Linux kernel calls Windows 9x kernel APIs instead of POSIX APIs. A small DOS client application then allows the Linux kernel to use MS-DOS prompts as TTYs. This is a great oversimplification, but it does get the general gist across.

Anyway, the end result is that you can use a modern Linux kernel and Windows 9x at the same time, without virtualising or dual-booting. This might be one of the greatest hacks in recent times, and I find it oddly beautiful in its user-facing simplicity.

Oracle Solaris 11.4 SRU92 released [OSnews]

Despite years of apparent stagnation and reported mass layoffs, it seems the Solaris team at Oracle has found somewhat of a renewed stride recently. Both branches of Solaris – the one for paying customers (SRU) and the free one for enthusiasts (CBE) – are receiving regular updates again, and there seems to be a more concerted effort to let the outside world know, too. We’ve got another update to the SRU branch this week which brings updates to a few important open source packages, like Django, Firefox, Thunderbird, Golang, and others, to address security issues.

In addition, this update marks as a change in the release cadence for the commercial branch of Solaris. From here on out, there will be two “Critical Patch Updates” per quarter to address security issues, followed by a Support Repository Update containing new features and larger changes.

22:00

DirectInput [Penny Arcade]

I've finally started checking out Pragmata, and it's like the demo, but with a ton more stuff - exactly what you want from "product." It looks sick and for a game asking you to do some Cirque du Soleil shit with your hands it maps to a controller in a way that feels solid. Gabe is playing it on PS5 Pro, the secondary Hacking inputs just map to the face buttons - I figured it would just be an easy remap on PC, that would certainly help Walter, but the way these perverts are navigating the hacking board on PC is with the Goddamn mouse. Just imagine it - picture that shit. These fiends hold down a key or "the back button on your mouse," and then scoot a cursor thingy through the grid. I want to try it just because it seems naughty. Dodgy, like. Type of shit that gets you put on a list.

21:49

Free Software Directory meeting on IRC: Friday, April 24, starting at 12:00 EDT (16:00 UTC) [Planet GNU]

Join the FSF and friends on Friday, April 24 from 12:00 to 15:00 EDT (16:00 to 19:00 UTC) to help improve the Free Software Directory.

21:42

The Big Idea: Samantha Mills [Whatever]

Family ties aren’t always a prettily done bow, sometimes they’re fraught with fraying ends and tricky knots, all woven together in the branches of family trees. Love ’em or hate ’em, everyone’s got parents, and everyone’s relationships with them are vastly different. Nebula Award-winning author Samantha Mills explores these varied relationships in her newest collection of short stories, Rabbit Test and Other Stories.

SAMANTHA MILLS:
Assembling a short story collection is an exercise in self-reflection. Material written over the course of years is placed side-by-side for the first time. Themes emerge. Preoccupations become clear. Where one story can be read in isolation and stand on its own terms, a collection can’t help but blare its author’s recurring fixations.
If there is one big fixation recurring throughout Rabbit Test and Other Stories, it is parenthood—specifically, the many ways that parent-child relationships buttress, cast shadows over, and intersect with so many other aspects of our lives.

Nearly every story here includes parents (usually mothers) and/or children (usually daughters). Frequently, this relationship is ruptured. Someone is missing, or dead, or dragged away by forces beyond their control. In “Strange Waters,” a fisherwoman is lost in time, struggling to get home to her children. In “Spindles,” a young fairytale princess has been separated from her mother during an alien invasion, and is struggling to make it to their rendezvous point before being captured. The settings change, the anxiety remains. What if, what if?

Parent/child separation is not something I keep writing about on purpose, but it’s a worry I can’t shake. When my first baby was born and then immediately whisked away for a 3-day stay in the NICU, I felt fear like nothing I had ever experienced before. I looked at that tiny face and felt the weight of the generations stretching behind me, the future spiraling uncertainly ahead of me, and I thought: oh no. I’m going to be scared for the rest of my life.

Weirdly, this was what leveled up my writing, though I didn’t realize it right away. About six months after giving birth, after years of fits and starts, I finally figured out how to craft a proper short story. The immensity and clarity of those new mom emotions were what tipped me over the line from knowing how to write a pretty sentence to knowing what I wanted to say.

Having kids forced me to think more deeply about my own childhood, both what I wanted to carry forward from it and what I wanted to leave behind. I was looking forward and backward at the same time—and god, I was so sleep-deprived! It was in this fevered state that I began to think about society generationally in a way I hadn’t before, reflecting on the ways that traditions or traumas (or traumatic traditions) are passed down from one generation to the next.

That tension—being caught between generations and deciding what, if anything, to do differently—surfaces in several of these stories. In “Rabbit Test,” the main character is prevented from getting an abortion by her parents; later, she has an opportunity to give her own daughter the choice she didn’t have. In “The Limits of Magic,” a repressive patriarchal state is passed down in the nursery by women who never saw a way out for themselves, and a new mother can’t bear to follow in their footsteps. In “A Shadow Is a Memory of a Ghost,” a pair of nemesis witches have to face the fact that, in trying to avoid the harms of their father, they’ve hurt their own children in entirely new ways.

There are good parents, here, too (the aforementioned fisherwoman; the fairytale queen; a tightknit family surviving in a mining colony company town in space), but even they make mistakes, because who doesn’t? What keeps drawing me back to this topic is the sheer variety of possible perspectives. I could write a thousand more stories and still not feel I’ve adequately conveyed the many facets of this experience. We do not all become parents, but we’ve all been children. We all spent our formative years utterly dependent on the adults in our lives—some up to the task, some not. It’s a bond that can be a comfort and joy for the rest of one’s life, or a fragile, fraught connection, or a disaster to be worked out in therapy for years to come, and whether we like it or not, this affects how we see ourselves and how we move through the world.

Now, don’t get me started on siblings.


Rabbit Test: Amazon|Barnes & Noble|Bookshop|Powell’s

Author socials: Website|Bluesky|Instagram

20:35

19:49

17:28

16:49

Dubious Luxury [Nina Paley]

Anger is a dubious luxury. It’s a luxury I displayed quite conspicuously most of my life. My anger was righteous: animals were suffering, and it was my fellow humans’ fault. Humans were suffering, and that was humans’ fault too. Fucking humans fucked everything up. I was a species traitor, refusing to put more humans into the world to fuck it up further. I resented breeders, carnivores, complacent media-watchers, the military, cops, consumers, investors, financiers, the religious, the unenlightened, the incorrectly-enlightened, the self-righteous, and the resentful.

The term originated in the Big Book of Alcoholics Anonymous, page 66. One of my favorite lines appears on the previous page: “this world and its people were often quite wrong.”

The only reason I’ve simmered down as I’ve aged is I just don’t have as much energy to sustain such continual righteous fury. I gotta economize. Just as my metabolism has grown so efficient my aged body needs about half as many calories as it used to, my aged psyche has learned to do more with less.

Activism is an outlet for the young, who may be poor in wealth but rich in energy. Where does that energy go? In my country, young people aren’t drafted for wars. Few do manual labor. Few do any work at all, as childhood is delayed longer and longer, and more are expected to extend their educations to at least their early 20’s. There is a surplus of youthful energy.

When you have a surplus of wealth, you display it. Displays of righteous anger demonstrate fitness and vitality: this person has so much surplus energy they can afford to be ineffectually furious at things they have absolutely no control over. Someone that angry is psychically wealthy, if not psychologically healthy. Dog knows I used to swoon at men who were as passionately activist as myself. Angry young men: hot.

Bonkers activism brings hot young people together, in a world where they’d otherwise be isolated in front of computer screens. When you can’t afford gratuitous displays of monetary excess in the form of, say, designer bags or fancy cars — or even when you can! — you may still be able to afford gratuitous displays of emotional excess.

Would I still be angry at the world’s infinite injustices if I had the energy to care? I’d like to think I’m now wise enough to know better, but at my age it’s hard to know what’s wisdom and what’s menopause.

Share

The post Dubious Luxury appeared first on Nina Paley.

16:35

[$] Dependency-cooldown discussions warm up [LWN.net]

Efforts to introduce malicious code into the open-source supply chain have been on the rise in recent years, and there is no indication that they will abate anytime soon. These attacks are often found quickly, but not quickly enough to prevent the compromised code from being automatically injected into other projects or code deployed by users where it can wreak havoc. One method of avoiding supply-chain attacks is to add a delay of a few days before pulling upates in what is known as a "dependency cooldown". That tactic is starting to find favor with users and some language ecosystem package managers. While this practice is considered a reasonable response by many, others are complaining that those employing dependency cooldowns are free-riding on the larger community by letting others take the risk.

Pluralistic: It's not a crime if we do it (to nurses) with an app (22 Apr 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links



A 1950s killer robot with eye lasers; it has collected four bell jars in which float the heads of disembodied nurses. It is zapping one jar with its lasers. In the background is a golgotha, taken from a Dore Old Testament engraving.

It's not a crime if we do it (to nurses) with an app (permalink)

If I could abolish one piece of received wisdom about tech policy, it would be this: "Tech moves at the speed of innovation and regulation moves at the speed of government, so regulation will always lag behind tech."

(If I could abolish two pieces of received wisdom about tech policy, the other one would be "If you're not paying for the product, you're the product." Decent treatment is not a customer reward program, and "voting with your wallet" only works if you're a billionaire whose wallet is thicker than all the other wallets put together.)

To be clear, there are times when tech enables new forms of conduct that don't fit neatly into the existing policy framework. For example, we apply copyright to anyone who makes or handles a copy of a creative work, and that used to be a pretty good proxy for "someone in the supply chain of the media industry."

The problem is that computers work by making dozens and dozens of copies every time you click your mouse, and we all use computers for everything, and clicking a mouse doesn't make you part of the entertainment business. The fact that we've had hyperinflation in "making and handling copies" but continued to apply an esoteric industrial framework to pretty much everything everyone does all the time is a huge problem that desperately needs fixing:

https://pluralistic.net/2023/10/21/the-internets-original-sin/

Copyright notwithstanding, tech generally does not outrun our capacity to regulate it. Rather, tech bosses come up with incredibly flimsy reasons why their business doesn't fit into the existing regulatory framework, and policymakers accept these ridiculous excuses so readily that one can only assume they're in on the racket.

Take "fintech," all those neobanks and the cryptocurrency junk and shitcoins and stablecoins and NFTs and so on that a group of pump-and-dumpers, money launderers and stock swindlers have pushed for more than a decade now. As Trashfuture's Riley Quinn says, "Whenever you hear 'fintech,' you should think 'unregulated bank.'" It's not hard to apply existing regulations to these companies: they fall under banking law, usury law, securities law and gambling law.

There's no (good) reason not to apply these legal frameworks to the crypto industry – but there are plenty of bad reasons not to. The most obvious reason not to apply those regulations is that you are on the same side as the pump-and-dumpers, money launderers and stock swindlers. The reason we struggle to regulate fintech is that we just don't want to.

Then there's Uber, which claimed that it wasn't a taxi company, it was a "transportation network company," which meant that none of the regulations we apply to taxis should apply to Uber. To call this a transparent ruse is to do great violence to the good, hardworking transparent ruses putting in the hard yards to run honest scams. "Uber isn't a taxi company, it's a transportation network company" is about as plausible as those t-shirts that read "It's not a bald spot, it's a solar-panel for a sex-machine."

Emboldened by the success of the "transportation network company" wheeze, Uber launched Uber Eats, claiming that it wasn't a "food delivery company" but rather a "delivery network company." This set up the template for a remorseless tide of new sex-machine solar-panels that have pushed Uber's system of wage-theft and worker misclassification into an expanding constellation of labor categories.

From fintech to price-fixing to gig-work, the entire industry runs on the very stupid proposition that "it's not a crime if we do it with an app":

https://pluralistic.net/2025/01/25/potatotrac/#carbo-loading

One of the worst of these sex-machine solar-panels is to be found in nursing, where a cluster of heavily capitalized apps that nurses must rely on to get shifts insist that they aren't "healthcare staffing agencies," rather, they are "healthcare worker platforms" that should be exempted from the regulations that we started applying to the former after a string of calamities and disasters.

This phenomenon is detailed in eye-watering detail in "Uber For Nursing," a must-read new report by Katie J Wells, Maya Pinto, and Funda Ustek Spilda for the AI Now Institute:

https://ainowinstitute.org/publications/uber-for-nursing

If "Uber for nursing" rings a bell, you might be thinking of "Uber for Nursing: How an AI-Powered Gig Model Is Threatening Health Care," an earlier report that Wells and Spilda wrote for the Roosevelt Institute in late 2024:

https://rooseveltinstitute.org/publications/uber-for-nursing/

The Roosevelt Institute report contained many eye-popping findings, most notably that at least some of the leading national nursing gig-work platforms were using data-brokers to find out how much debt nurses were carrying, and offered lower wages to the nurses with the most debt, on the grounds that the most economically desperate nurses will accept the lowest pay:

https://pluralistic.net/2024/12/18/loose-flapping-ends/#luigi-has-a-point

The new report describes how, in the absence of a muscular policy response, these nursing gig-work companies have raised fantastic sums of money, some of which they have diverted to regulatory capture projects in a bid to states to recognize their solar-panel sex-machines, with great success. These companies haven't merely refined their lobbying game, either – as a sphincter-puckering appendix detailing the experience of nurses with these apps shows, they have also made great strides in immiserating nurses and transferring their earning power to gig platforms and the hospitals that rely on them.

This degradation of the work experience is characteristic of the new world of AI-powered jobs. AI isn't taking workers' jobs, but it is enshittifying them, with degrading, neurosis-inducing surveillance and high-handed discipline:

https://www.ineteconomics.org/perspectives/blog/what-does-it-mean-to-work-under-algorithmic-eyes

Algorithmic oversight is a terror for any worker, but it's particularly bad when applied to healthcare workers:

https://pluralistic.net/2023/08/05/any-metric-becomes-a-target/#hca

But gig-work companies remain laser-focused on healthcare workers, likely because that is one of the only growing professions left in America. They're trying to screw over healthcare workers for the same reason Willie Sutton robbed banks: "That's where the money is." The implication here is that the 15% of the American workforce that is employed in the healthcare industry is on the front lines of the battle against gig-work and algorithmic management.

Like parasites that attack the sick and weak, gig-work and algorithmic management come first for industries that are already bad for workers and the people they serve, making things much worse while insisting that they're just trying to apply a cool digital fix to a broken analog system. That, too, was Uber's playbook: attacking the medallion taxi system as corrupt and sclerotic – while replacing it with a system that's corrupt, extractive and dynamic, able to evade all attempts to improve things for drivers and riders (such as drivers' unions).

That's what's happened with healthcare staffing agencies. These have long been a fixture in healthcare, partly because there was always a large cohort of skilled healthcare professionals who valued the flexibility of short term contracts (for example, "travel nurses") and partly because hospitals love hiring contractors who aren't part of their workers' unions.

Staffing agencies weren't good. A string of scandals led to waves of regulations in states like Colorado, Minnesota and New York that required agencies to "register annually, disclose shareholders and executive officers, certify worker credentials, report to state authorities on the number of workers employed, document service rates charged to facilities, and list average wages paid to workers by job category." These regulations also banned staffing agencies from locking up workers with noncompete agreements and ripping them off with finder's fees.

Rather than strengthening these protections, gig nursing platforms avoid them. Where staffing agencies secure multi-week contracts for travel nurses, gig platforms typically assign workers to single-day shifts. Where staffing agencies let nurses bargain for their scheduling needs, gig platforms present take-it-or-leave-it offers and no opportunities to speak to a human when things go wrong. And where staffing agencies evaluated the workers on their roster based on employer feedback, the gig platforms install apps that continuously surveil and evaluate workers, downranking them and cutting their hours and pay based on algorithmic judgments that are never explained and cannot be appealed.

Platforms match nurses with shifts, claiming to regulators that they're little more than a "job-notice board." But when they pitch hospitals, they tell a different story, about their ability to use algorithms to erode wages and blacklist workers who make trouble. Healthcare gig-work apps push workers to accept shifts that require more travel and pay less, at facilities they don't want to work at. Refusal to accept a shift can permanently compromise your ability to get future shifts, and/or lower the wage you're offered in future.

In addition to these poor working conditions and low wages, gig platforms have resurrected the prohibited practice of charging workers "finder's fees," by layering on junk fees that take money out of every paycheck. Staffing agencies aren't allowed to do this, but the gig-work platforms' "solar panel for a sex-machine" gambit transforms the finder's fee into a "platform fee" that somehow escapes regulators' grasp.

How is it that a regulator can't see that a "platform fee" is exactly equivalent to a "finder's fee?" This is not a case of technology outpacing regulation – it's a case of lawmakers colluding with profitable firms to evade regulation in order to steal from workers.

The platforms are aslosh in investor cash – Clipboard Health, Intelycare, and Shiftkey are all valued at more than $1b, and Shiftkey just completed a $300m private equity raise. This leaves them with lots of ready cash to spend on regulatory entrepreneurship. In Georgia, Clipboard lobbied "to exempt gig nursing platforms from state unemployment insurance and workers’ compensation laws." In Ohio, Shiftkey and Clipboard are pushing a bill "to classify gig nurses as independent contractors, exempting gig platforms from minimum wage and other worker protection laws." In Utah, Nursa is praising a bill that a state senator called "lightest-touch regulation." All in all, 17 states have nurse gig platform deregulation bills underway.

In 2022, the healthcare gig-work platforms tried to get a California ballot measure to carve nursing platforms out of all state labor laws. They withdrew it, but pursued an "under the radar" approach to get the same thing by seeking changes in administrative rules, rather than state laws. Lobbying for administrative law changes to exempt healthcare gig-work platforms from regulation is also underway in Missouri, Louisiana and Utah.

One bright light in all this comes from New York state, where a 2025 law "affirmatively recognizes gig nursing platforms as entities that must comply with the state’s healthcare staffing agency rules." The existence of this law proves that the crisis of gig-work healthcare platforms is not an example of tech racing ahead of regulation. If New York's state leg can figure out that a gig-work platform is just a staffing agency in app form, then other states can do so as well. If they don't figure that out, that's because they don't want to.

Sometime in this century, our political class and our financial class arrived at a consensus that Douglas Rushkoff describes as "go meta," in his 2022 book Survival of the Richest:

https://pluralistic.net/2022/09/13/collapse-porn/#collapse-porn

The "go meta" ethos insists that the most important, smartest and most valuable move is always away from productive labor. Don't drive a cab: go meta and own a medallion that you rent to a cab driver. Don't own a medallion, go meta and start a gig-work ride-hailing company. Don't start a gig-work ride-hailing company, go meta and invest in a gig-work ride-hailing company. Don't invest in a gig-work ride-hailing company, go meta and buy options in a gig-work ride-hailing company – and so on and so on, into ever more abstracted forms of gambling and rent-collection.

The reorganization of the economy around parasitic middlemen and financial gamblers (but I repeat myself) is the real reason that we can't regulate tech. Once you've decided that the most important party to a transaction is the person who has the option on the share on the platform on the license that the worker who actually does the job requires, of course you're going to see a solar-panel for a sex-machine in every bald spot.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago PKD ratted out other SF writers to the FBI https://web.archive.org/web/20010428121230/https://www.linguafranca.com/print/0105/cover.html

#15yrsago Weird Al snubbed by Lady Gaga, releases his parody without permission as fair use https://www.youtube.com/watch?v=fUxXKfQkswE

#15yrsago How do you compete with free? A taxonomy of reasons to pay for digital files https://www.theguardian.com/technology/gamesblog/2011/apr/20/digital-free-persuade-pay-cory-doctorow?utm_source=twitterfeed&amp;utm_medium=twitter

#15yrsago iOS devices secretly log and retain record of every place you go, transfer to your PC and subsequent devices https://www.theguardian.com/technology/2011/apr/20/iphone-tracking-prompts-privacy-fears

#10yrsago Before 1988 Olympics, South Korea sent ‘vagrants’ to camps where rape and murder were routine https://web.archive.org/web/20160420234916/https://bigstory.ap.org/article/c22de3a565fe4e85a0508bbbd72c3c1b/ap-s-korea-covered-mass-abuse-killings-vagrants

#10yrsago Luxury overnight bus with sleeper cabins shuttles between LA and San Francisco https://www.inc.com/tess-townsend/sleepbus-gets-you-from-sf-to-la-for-50.html

#10yrsago Volkswagen’s internal Dieselgate probe stuck because the company used code-words for its cheat software https://web.archive.org/web/20160419095045/https://www.bloomberg.com/news/articles/2016-04-19/vw-cheating-code-words-said-to-complicate-emissions-probe

#10yrsago Chinese opsec funnies: your foreign boyfriend is a western spy! https://web.archive.org/web/20160420125125/https://www.chinalawtranslate.com/nsed/

#10yrsago UK Chancellor exempts families of “Politically Exposed Persons” from money laundering scrutiny https://www.nakedcapitalism.com/2016/04/uks-osborne-exempts-members-of-parliament-other-politically-exposed-persons-from-money-laundering-oversight.html

#10yrsago Colorado school district wants to arm security staff with assault rifles https://www.csmonitor.com/USA/2016/0419/Colorado-school-district-to-equip-security-workers-with-semiautomatic-rifles

#5yrsago McDonald's corporate wages war on ice-cream hackers https://pluralistic.net/2021/04/20/euthanize-rentier-enablers/#cold-war

#5yrsago Real penalties for covid evicters https://pluralistic.net/2021/04/20/euthanize-rentier-enablers/#cfpb


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Reverse-Centaur's Guide to AI," a short book about being a better AI critic, Farrar, Straus and Giroux, June 2026 (https://us.macmillan.com/books/9780374621568/thereversecentaursguidetolifeafterai/)
  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2026

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027

  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing: "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Third draft completed. Submitted to editor.

  • "The Reverse Centaur's Guide to AI," a short book for Farrar, Straus and Giroux about being an effective AI critic. LEGAL REVIEW AND COPYEDIT COMPLETE.
  • "The Post-American Internet," a short book about internet policy in the age of Trumpism. PLANNING.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

15:35

Still in Hollywood [Whatever]

Although this picture is actually of the Pershing Square Metro Line escalator, nowhere near Hollywood in terms of actual Los Angeles geography — look, we’re going for the metaphor here, okay. What I’m saying is that I am still out here, on my third day of meetings, all of which seem to be going pretty well. It’s nice to keep busy.

Nevertheless I’ll finally be on my way home tonight after a week away, and I’m looking forward to seeing family and pets and being a massive introvert in my comfy office chair for several days. Los Angeles is wonderful. Home is even better.

— JS

15:14

Link [Scripting News]

I like reading Joost's blog. I'm subscribed and it's in my blogroll.

Link [Scripting News]

Yesterday I threw a question out there. "If the web were a platform for writers, how would it work?" I left out specifics, because any specifics I provide might cut off interesting answers. There are three elements in the question: web, platform and writers. The answer must say something about all three. Another way of saying the same thing -- "You're using the web to make the platform to serve the writers."

15:07

[$] One Sized trait does not fit all [LWN.net]

In Rust, types either possess a constant size known at compile time, or a dynamically calculated size known at run time. That is fine for most purposes, but recent proposals for the language have shown the need for a more fine-grained hierarchy. RFC 3729 from David Wood and Rémy Rakic would add a hierarchy of traits to describe types with sizes known under different circumstances. While the idea has been subject to discussion for many years, a growing number of use cases for the feature have come to light.

LilyPond 2.26.0 released [LWN.net]

Version 2.26.0 of the LilyPond music-engraving program has been released. Major changes include the ability to use the Cairo library to generate output and improvements in spacing between clefs and time signatures. See the release notes for a full list of miscellaneous improvements as well as what's new with musical and specialist notation.

14:21

Four stable kernels for Wednesday [LWN.net]

Greg Kroah-Hartman has announced the release of the 7.0.1, 6.19.14, 6.18.24, and 6.12.83 stable kernels. As usual, each contains important fixes throughout the tree. Users are encouraged to upgrade.

Note that the 6.19.x series ends with 6.19.14.

Security updates for Wednesday [LWN.net]

Security updates have been issued by Debian (firefox-esr, flatpak, ngtcp2, ntfs-3g, packagekit, python-geopandas, simpleeval, strongswan, and xdg-dbus-proxy), Fedora (chromium, cups, curl, jq, opkssh, perl-Net-CIDR-Lite, python-cbor2, python-pillow, tinyproxy, xdg-dbus-proxy, and xorg-x11-server-Xwayland), Slackware (libXpm and mozilla), SUSE (botan, chromium, clamav, cockpit, cockpit-machines, cockpit-packages, cockpit-podman, cockpit-subscriptions, dovecot24, firefox, flatpak, freeipmi, gdk-pixbuf, glibc, gnome-remote-desktop, go1.25, go1.26, go1.26-openssl, google-cloud-sap-agent, gosec, graphicsmagick, haproxy, kernel, libpng16, libraw, libtasn1, libvncserver, ncurses, nebula, nodejs24, openssl-3, ovmf, pam, pcre2, perl-Authen-SASL, pgvector, plexus-utils, podman, python-cbor2, python-cryptography, python-django, python-gi-docgen, python-pypdf2, python-python-multipart, python311, python311-PyPDF2, python313, qemu, roundcubemail, rust1.94, sqlite3, strongswan, systemd, tar, tigervnc, util-linux, vim, webkit2gtk3, xorg-x11-server, xwayland, and zlib), and Ubuntu (commons-io, libcap2, ntfs-3g, and rapidjson).

13:42

Don’t Blame the Model [Radar]

The following article originally appeared on the Asimov’s Addendum Substack and is being republished here with the author’s permission.

A rambling response to what Claude itself deemed a “straightforward query” with clear formatting requirements.

Are LLMs reliable?

LLMs have built up a reputation for being unreliable.1 Small changes in the input can lead to massive changes in the output. The same prompt run twice can give different or contradictory answers. Models often struggle to stick to a specified format unless the prompt is worded just right. And it’s hard to tell when a model is confident in its answer or if it could just as easily have gone the other way.

It is easy to blame the model for all of these reliability failures. But the API endpoint and surrounding tooling matter too. Model providers limit the kind of interactions that developers could have with a model, as well as the outputs that the model can provide, by limiting what their APIs expose to developers and third-party companies. Things like the full chain-of-thought and the logprobs (the probabilities of all possible options for the next token) are hidden from developers, while advanced tools for ensuring reliability like constrained decoding and prefilling are not made available. All features that are easily available with open weight models and are inherent to the way LLMs work.

Every decision made by model developers on what tools and outputs to provide to developers through their API is not just an architectural choice but also a policy decision. Model providers directly determine what level of control and reliability developers have access to. This has implications for what apps could be built, how reliable a system is in practice, and how well a developer can steer results.

The artificial limits on input

Modern LLMs are usually built around chat templates. Every input and output, with the exception of tool calls and system or developer messages, is filtered through a conversation between a user and an assistant—instructions are given as user messages; responses are returned as assistant messages. This becomes extremely evident when looking at how modern LLM APIs work. The completions API, an endpoint originally released by OpenAI and widely adopted across the industry (including by several open model providers like OpenRouter and Together AI) takes input in the form of user and assistant messages and outputs the next message.2

The focus on a chat interface in an API has its benefits. It makes it easy for developers to reason about input and output being completely separate. But chat APIs do more than just use a chat template under the hood; they actively limit what third-party developers can control.

When interacting with LLMs through an API, the boundary between input and output is often a firm one. A developer sets previous messages, but they usually cannot prefill a model’s response, meaning developers cannot force a model to begin a response with a certain sentence or paragraph.3 This has real-world implications for people building with LLMs. Without the ability to prefill, it becomes much harder to control the preamble. If you know the model needs to start its answer in a certain way, it’s inefficient and risky to not enforce it at the token level.4 And the limitations extend beyond just the start of a response. Without the ability to prefill answers, you also lose the ability to partially regenerate answers if only part of the answer is wrong.5

Another deficiency that is particularly visible is how the model’s chain-of-thought reasoning is handled. Most large AI companies have made a habit of hiding the models’ reasoning tokens from the user (and only showing summaries), reportedly to guard against distillation and to let the model reason uncensored (for AI safety reasons). This has second-order effects, one of which is the strict separation of reasoning from messages. None of the major model providers let you prefill or write your own reasoning tokens. Instead you need to rely on the model’s own reasoning and cannot reuse reasoning traces to regenerate the same message.

There are legitimate reasons for not allowing prefilling. It could be argued that allowing prefilling will greatly increase the attack area of prompt injections. One study found that prefill attacks work very well against even state-of-the-art open weight models. But in practice, the model is not the only line of defense against attackers. Many companies already run prompts against classification models to find prompt injections, and the same type of safeguard could also be used against prefill attack attempts.

Output with few controls

Prefilling is not the only casualty of a clean separation between input and output. Even within a message, there are levers that are available on a local open weight model that just aren’t possible when using a standard API. This matters because these controls allow developers to preemptively validate outputs and ensure that responses follow a certain structure, both decreasing variability and improving reliability. For example, most LLM APIs support something they call structured output, a mode that forces the model to generate output in a given JSON format; however, structured output does not inherently need to be limited to JSON.6 That same technique, constrained decoding, or limiting the tokens the model can produce at any time, could be used for much more than that. It could be used to generate XML, have the model fill in blanks Mad Libs-style, force the model to write a story without using certain letters, or even enforce valid chess moves at inference time. It’s a powerful feature that allows developers to precisely define what output is acceptable and what isn’t—ensuring reliable output that meets the developer’s parameters.

The reason for this is likely that LLM APIs are built for a wide range of developers, most of whom use the model for simple chat-related purposes. APIs were not designed to give developers full control over output because not everyone needs or wants that complexity. But that’s not an argument against including these features; it’s only an argument for multiple endpoints. Many companies already have multiple supported endpoints: OpenAI has the “completions” and “responses” APIs, while Google has the “generate content” and “interactions” APIs. It’s not infeasible for them to make a third, more-advanced endpoint.

A lack of visibility

Even the model output that third-party developers do get via the model’s API is often a watered-down version of the output the model gives. LLMs don’t just generate one token at a time. They output the logprobs. When using an API, however, Google only provides the top 20 most likely logprobs. OpenAI no longer provides any logprobs for GPT 5 models, while Anthropic has never provided any at all. This has real-world consequences for reliability. Log probabilities are one of the most useful signals a developer has for understanding model confidence. When a model assigns nearly equal probability to competing tokens, that uncertainty itself is meaningful information. And even for those companies who provide the top 20 tokens, that is often not enough to cover larger classification tasks.

When it comes to reasoning tokens even less output information is provided. Major providers such as Anthropic,7 Google, and OpenAI8 only provide summarized thinking for their proprietary models. And OpenAI only supplies that when a valid government ID is supplied to OpenAI. This not only takes away the ability for the user to truly inspect how a model arrived at a certain answer, but it also limits the ability for the developer to diagnose why a query failed. When a model gives a wrong answer, a full reasoning trace tells you whether it misunderstood the question, made a faulty logical step, or simply got unlucky at the final token. A summary obscures some of that, only providing an approximation of what actually happened. This is not an issue with the model—the model is still generating its full reasoning trace. It’s an issue with what information is provided to the end developer.

The case for not including logprobs and reasoning tokens is similar. The risk of distillation increases with the amount of information that the API returns. It’s hard to distill on tokens you cannot see, and without giving logprobs, the distillation will take longer and each example will provide less information.9 And this risk is something that AI companies need to consider carefully, since distillation is a powerful technique to mimic the abilities of strong models for a cheap price. But there are also risks in not providing this information to users. DeepSeek R1, despite being deemed a national security risk by many, still shot straight to the top of US app stores upon release and is used by many researchers and scientists, in large part due to its openness. And in a world where open models are getting more and more powerful, not giving developers proper access to a model’s outputs could mean losing developers to cheaper and more open alternatives.

Reliability requires control and visibility

The reliability problems of current LLMs do not stem only from the models themselves but also from the tooling that providers give developers. For local open weight models it is usually possible to trade off complexity for reliability. The entire reasoning trace is always available and logprobs are fully transparent, allowing the developer to examine how an answer was arrived at. User and AI messages can be edited or generated at the developer’s discretion, and constrained decoding could be used to produce text that follows any arbitrary format. For closed weight models, this is becoming less and less the case. The decisions made around what features to restrict in APIs hurt developers and ultimately end users.

LLMs are increasingly being used in high-stakes situations such as medicine or law, and developers need tools to handle that risk responsibly. There are few technical barriers to providing more control and visibility to developers. Many of the most high-impact improvements such as showing thinking output, allowing prefilling, or showing logprobs, cost almost nothing, but would be a meaningful step towards making LLMs more controllable, consistent and reliable.

There is a place for a clean and simple API, and there is some merit to concerns about distillation, but this shouldn’t be used as an excuse to take away important tools for diagnosing and fixing reliability problems. When models get used in high-stakes situations, as they increasingly are, failure to take reliability seriously is an AI safety concern.

Specifically, to take reliability seriously, model providers should improve their API by allowing features that give developers more visibility and control over their output. Reasoning should be provided in full at all times, with any safety violations handled the same way that they would have been handled in the final answer. Model providers should resume providing at least the top 20 logprobs, over the entire output (reasoning included), so that developers have some visibility into how confident the model is in its answer. Constrained decoding should be extended beyond JSON and should support arbitrary grammars via something like regex or formal grammars.10 Developers should be granted full control over “assistant” output—they should be able to prefill model answers, stop responses mid-generation, and branch them at will. Even if not all of these features make sense over the standard API, nothing is stopping model providers from making a new more complex API. They have done it before. The decision to withhold these features is a policy choice, not a technical limitation.

Improving intelligence is not the only way to improve reliability and control, but it is usually the only lever that gets pulled.


Footnotes

  1. Thank you to Ilan Strauss, Sean Goedecke, Tim O’Reilly, and Mike Loukides for their helpful feedback on an earlier draft. ↩
  2. OpenAI has since moved on from the completions API but the new responses API also heavily enforces the separation of user and assistant messages. ↩
  3. Anthropic’s API supported prefill up until they launched their Claude 4.6 models; it is no longer supported for new models. ↩
  4. Interestingly models have been shown to possess the ability to tell when a response has been prefilled. ↩
  5. This technique is used in an efficient approximation of best of N called speculative rejection. ↩
  6. Forcing the model to generate in JSON may actually hurt performance. ↩
  7. Anthropic used to provide full reasoning tokens but stopped with their newer models. ↩
  8. OpenAI’s responses endpoint may have been created in part to hide the reasoning mode. ↩
  9. Distillation using top-K probabilities is possible, but it is suboptimal. ↩
  10. Regular expressions, while flexible, are not perfect and cannot express recursive or nested structures such as valid JSON. However, open source LLM libraries like Guidance and Outlines support recursive structures at the cost of added complexity. ↩

12:56

Representative Line: Comment Overflow [The Daily WTF]

Today, we look at a representative comment, sent to us by Nona. This particular comment was in a pile of code delivered by an offshore team.

// https://stackoverflow.com/questions/46744740/lodash-mongoose-object-id-difference/46745169

"Wait," you say, "what's the WTF about a comment pointing to a Stack Overflow page. I do that all the time?"

In this case, it's because this particular comment wasn't given any further explanation. It also wasn't in a block of code that was doing anything with either lodash, Mongoose, or set differences. It was, however, repeated multiple times throughout the codebase, because the entire codebase was a pile of copy-pasta glued together with the bare minimum code to make it work.

In at least one place, the comment was probably correct and helpful. But it got swept up as part of a broader copy/paste exercise, and now is scattered through the code without any true purpose.

[Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

12:07

ICE Uses Graphite Spyware [Schneier on Security]

ICE has admitted that it uses spyware from the Israeli company Graphite.

10:28

The banal djinni [Seth's Blog]

Technology changes things. Sometimes better, sometimes worse.

When a powerful new technology arrives, it offers us wishes. Too often, we waste them, asking it to take on simple chores or offer us trivial conveniences.

We’re in the biggest moment of technical change of our lifetimes. What are you using your wishes for?

09:07

DirectInput [Penny Arcade]

New Comic: DirectInput

08:21

Kernel code removals driven by LLM-created security reports [LWN.net]

There are a number of ongoing efforts to remove kernel code, mostly from the networking subsystem, as an alternative to dealing with the increase in security-bug reports from large language models. The proposed removals include ISA and PCMCIA Ethernet drivers, a pair of PCI drivers, the ax25 and amateur radio subsystem, the ATM protocols and drivers, and the ISDN subsystem.

Remove the amateur radio (AX.25, NET/ROM, ROSE) protocol implementation and all associated hamradio device drivers from the kernel tree. This set of protocols has long been a huge bug/syzbot magnet, and since nobody stepped up to help us deal with the influx of the AI-generated bug reports we need to move it out of tree to protect our sanity.

07:35

Firefox: The zero-days are numbered [LWN.net]

This Firefox blog post reports that the Firefox 150 release includes fixes for 271 vulnerabilities found by the Claude Mythos preview.

Elite security researchers find bugs that fuzzers can't largely by reasoning through the source code. This is effective, but time-consuming and bottlenecked on scarce human expertise. Computers were completely incapable of doing this a few months ago, and now they excel at it. We have many years of experience picking apart the work of the world's best security researchers, and Mythos Preview is every bit as capable. So far we've found no category or complexity of vulnerability that humans can find that this model can't.

This can feel terrifying in the immediate term, but it's ultimately great news for defenders. A gap between machine-discoverable and human-discoverable bugs favors the attacker, who can concentrate many months of costly human effort to find a single bug. Closing this gap erodes the attacker's long-term advantage by making all discoveries cheap.

05:49

Dave Gauer, a kindred spirit [Richard Stallman's Political Notes]

A rant by an old-time personal computer user who loathes today's big tech and briefly suggests he might be using a Libre operating system — seems to be completely unaware of the free software movement.

I think he might sympathize with it if he knew it.

About a thousand US billionaires [Richard Stallman's Political Notes]

Bernie Sanders: *We need a 5% wealth tax on America's 938 billionaires. … The richest people in America have never ever had it so good. … The American working class has been under savage attack for years.*

Reversing Corporations United decision [Richard Stallman's Political Notes]

Each state of the US has the power to reverse the Corporations United decision for corporations incorporated in that state.

Urgent: Overturning ban on voting by mail [Richard Stallman's Political Notes]

Over 20 state attorneys general are suing to overturn public enemy #1's executive order to mostly ban voting by mail.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Urgent: About Jews employed at UPenn [Richard Stallman's Political Notes]

US citizens: call on universities to join UPenn in the case to overturn an order to identify its Jewish employees to the government.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

Urgent: Blocking weapons: the vote count [Richard Stallman's Political Notes]

US citizens: thank the senators who voted to block weapons for Israel and hold the rest accountable.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Former PM calls on ICC [Richard Stallman's Political Notes]

*No Israel prosecutions for killing Palestinian civilians in occupied West Bank since start of decade.* Ehud Olmert, former prime minister of Israel, hopes to spur the International Criminal Court to intervene.

Several former heads of the army, the police and the spy agencies are supporting the campaign.

An Israeli lawyer (whose name I don't recognize) responds, "The system is programmed to manufacture impunity, not accountability. But it was smart enough to also have very rare occasions of accountability, that could be referred to as examples of how law enforcement was working" (so as to convince the ICC it had no basis to get involved).

A Palestinian (whose name I don't recognize) responds, "Such Israeli critics often give the impression that settler violence could be tamed by simply ousting the (current) far right government. That would certainly have an effect, but it doesn’t recognise that the settlements are a project of the state that was shaped and led across the political spectrum."

That is true; indeed, Olmert was a right-wing politician. Nonetheless, what he is doing now takes courage.

The case of two fired judges [Richard Stallman's Political Notes]

The bully's minions fire immigration judges who uphold the first amendment rights of immigrants, and praise judges who deport people for exercising those rights.

Psychiatrist Examines the Nazi Criminals [Richard Stallman's Political Notes]

A psychiatrist studied the imprisoned surviving Nazi leaders and wrote that such people were not a special problem of Germany — rather, people inclined toward tyranny and enormous crimes could be found in any country, including the US.

Peace deal deadline [Richard Stallman's Political Notes]

Proposing a plausible peace deal for Iran and the US — if they are willing to accept it.

More than 600 measles cases [Richard Stallman's Political Notes]

*Utah reports more than 600 measles cases as outbreak spreads across US.*

Utah is full of Republicans, and many of them are now magats. I hope the rest of the country learns from this example of stupidity not to believe magats.

No more US military aid to Israel [Richard Stallman's Political Notes]

Bernie Sanders's speech to the senate calling for an end to arms transfers to Israel.

The resolutions were defeated, but it is only a matter of time before public opinion prevails.

Court strikes down anti protest law [Richard Stallman's Political Notes]

A court has voided the protest ban law of New South Wales, which was used to ban protests against the president of Israel while he was visiting.

AI in legal proceedings [Richard Stallman's Political Notes]

Australian lawyers rushed to use LLMs, but encountered the risk that the argument presented in court might cite a nonexistent decision in a nonexistent case.

Norway's state telecoms firm [Richard Stallman's Political Notes]

*Lawsuit in Norway alleges Telenor passed on data helping Myanmar military arrest 1,200 [opposition] activists, some in safe houses.*

Telenor should have considered the question of how it would respond to demands like this before deciding to do business in Burma. If it could not come up with a response it could justify, it should have stayed out. Norway and other countries should pass laws making it clear how telecommunications countries must protect dissidents in situations like this.

Social media platforms harm [Richard Stallman's Political Notes]

*It is no fluke that social media platforms are addictive and causing harm. They were designed that way.*

05:42

Girl Genius for Wednesday, April 22, 2026 [Girl Genius]

The Girl Genius comic for Wednesday, April 22, 2026 has been posted.

03:49

sed-4.10 released [stable] [Planet GNU]


This is to announce sed-4.10, a stable release.

It's been more than 3.5 years and quite a few new bug fixes.
Special thanks to Paul Eggert, Bruno Haible and Collin Funk
for all their help, and especially to Bruno for all the gnulib
support and thorough and indefatigable testing and analysis.

There have been 92 commits by 9 people in the 180 weeks since 4.9.

See the NEWS below for a brief summary.

Thanks to everyone who has contributed!
The following people contributed changes to this release:

  Arkadiusz Drabczyk (2)
  Ash Roberts (1)
  Brun Haible (1)
  Bruno Haible (5)
  Collin Funk (5)
  Hans Ginzel (1)
  Jim Meyering (60)
  Paul Eggert (16)
  Weixie Cui (1)

Jim
 [on behalf of the sed maintainers]
==================================================================

Here is the GNU sed home page:
    https://gnu.org/s/sed/

Here are the compressed sources:
  https://ftp.gnu.org/gnu/sed/sed-4.10.tar.gz   (2.7MB)
  https://ftp.gnu.org/gnu/sed/sed-4.10.tar.xz   (1.7MB)

Here are the GPG detached signatures:
  https://ftp.gnu.org/gnu/sed/sed-4.10.tar.gz.sig
  https://ftp.gnu.org/gnu/sed/sed-4.10.tar.xz.sig

Use a mirror for higher download bandwidth:
  https://www.gnu.org/order/ftp.html

Here are the SHA256 and SHA3-256 checksums:

  SHA256 (sed-4.10.tar.gz) = TRef+vkuxNzsVB98Ayvhw7mhhW9JcK25WlBSIXAvUnc=
  SHA3-256 (sed-4.10.tar.gz) = ftB7Hf2uN4RnayBEgasV7KmqZqCxBUj7e+Am6WDaiKk=
  SHA256 (sed-4.10.tar.xz) = uOchgrLslqNXTimYxHt6qmTMIM4ADY6awxPMB87PKMc=
  SHA3-256 (sed-4.10.tar.xz) = bVWJvXR28fvhgP1XTpej6t8V+Bh2YI1lL6aGBy1cG5c=

Verify the base64 SHA256 checksum with 'cksum -a sha256 --check'
from coreutils-9.2 or OpenBSD's cksum since 2007.

Verify the base64 SHA3-256 checksum with 'cksum -a sha3 --check'
from coreutils-9.8.

Use a .sig file to verify that the corresponding file (without the
.sig suffix) is intact.  First, be sure to download both the .sig file
and the corresponding tarball.  Then, run a command like this:

  gpg --verify sed-4.10.tar.gz.sig

The signature should match the fingerprint of the following key:

  pub   rsa4096/0x7FD9FCCB000BEEEE 2010-06-14 [SCEA]
        Key fingerprint = 155D 3FC5 00C8 3448 6D1E  EA67 7FD9 FCCB 000B EEEE
  uid                   [ unknown] Jim Meyering <jim@meyering.net>
  uid                   [ unknown] Jim Meyering <meyering@fb.com>
  uid                   [ unknown] Jim Meyering <meyering@gnu.org>

If that command fails because you don't have the required public key,
or that public key has expired, try the following commands to retrieve
or refresh it, and then rerun the 'gpg --verify' command.

  gpg --locate-external-key jim@meyering.net

  gpg --recv-keys 7FD9FCCB000BEEEE

  wget -q -O- 'https://savannah.gnu.org/project/release-gpgkeys.php?group=sed&download=1' | gpg --import -

As a last resort to find the key, you can try the official GNU
keyring:

  wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg
  gpg --keyring gnu-keyring.gpg --verify sed-4.10.tar.gz.sig

This release is based on the sed git repository, available as

  git clone https://https.git.savannah.gnu.org/git/sed.git

with commit 89b7a2224d4faa9d8baf76094b1232ad1477ef3e tagged as v4.10.

For a summary of changes and contributors, see:

  https://gitweb.git.savannah.gnu.org/gitweb/?p=sed.git;a=shortlog;h=v4.10

or run this command from a git-cloned sed directory:
  git shortlog v4.9..v4.10

This release was bootstrapped with the following tools:
  Autoconf 2.73.1-b400b
  Automake 1.18.1.91
  Gnulib 2026-04-19 15211966deb52d4cae425c655177a815a88d3fc0

NEWS

* Noteworthy changes in release 4.10 (2026-04-21) [stable]

** Bug fixes

  sed 's/a/b/g' (and other global substitutions) now works on input
  lines longer than 2GB. Previously, matches beyond the 2^31 byte offset
  would evoke a "panic" (exit 4).
  [bug present since the beginning]

  'sed --follow-symlinks -i' no longer has a TOCTOU race that could let
  an attacker swap a symlink between resolution and open, causing sed to
  read attacker-chosen content and write it to the original target.
  [bug introduced in sed 4.1e]

  sed no longer falsely matches when back-references are combined with
  optional groups (.?) and the $ anchor.  For example, this no longer
  falsely matches the empty string at beginning of line:
    $ echo ab | sed -E 's/^(.?)(.?).?\2\1$/X/'
    Xab
  [bug present since "the beginning"]

  In --posix mode, sed no longer mishandles backslash escapes (\n,
  \t, \a, etc.) after a named character class like [[:alpha:]].
  For example, 's/^A\n[[:alpha:]]\n*/XXX/' would fail to match the
  trailing newline, treating \n as a literal backslash and an 'n'
  rather than a newline.  This happened when an earlier backslash
  escape in the same regex had already been converted, shifting the
  in-place normalization buffer.
  [bug introduced in sed 4.9]

  sed --debug no longer crashes when a label (":") command is compiled
  before the --debug option is processed, e.g., sed -f<(...) --debug.
  [bug introduced in sed 4.7 with --debug]

  sed no longer rejects the documented GNU extension 'a**' (equivalent
  to 'a*') in Basic Regular Expression (BRE) mode.  Previously, this
  worked only with -E (ERE mode), even though grep has always accepted
  it in BRE mode.
  [bug present since "the beginning"]

  sed no longer rejects "\c[" in regular expressions
  [bug present since the beginning]

  'sed --follow-symlinks -i' no longer mishandles an operand that is a
  short symbolic link to a long symbolic link to a file.
  [bug introduced in sed 4.9]

  Fix some some longstanding but unlikely integer overflows.
  Internally, 'sed' now more often prefers signed integer arithmetic,
  which can be checked automatically via 'gcc -fsanitize=undefined'.

** Changes in behavior

  In the default C locale, diagnostics now quote 'like this' (with
  apostrophes) instead of `like this' (with a grave accent and an
  apostrophe).  This tracks the GNU coding standards.

  'sed --posix' now warns about uses of backslashes in the 's' command
  that are handled by GNU sed but are not portable to other
  implementations.

** Build-related

  builds no longer fail on platforms without the <getopt.h> header or
  getopt_long function.
  [bug introduced in sed 4.9]


02:14

Link [Scripting News]

BTW the "open" web has a chance to come back around the AI rewrite of all our software that's underway now. If we build the new systems entirely around web connections, with each part replaceable, we can have as much "open" as we want. Products like Bluesky will look like they bet on the wrong horse if we all have choice everywhere. It's not as strange as you think. Opportunities come along every time things change as radically as they are changing now.

ChatGPT images update [Scripting News]

I gave the new ChatGPT image maker a whirl, it's supposed to be more thoughtful and realistic.

The prompt: “A turkey in plastic with supermarket label with text and fine print. The branding is Really Simple brand Turkey. The motto, ‘turkey for simple people.‘“

A really simple brand turkey from ChatGPT.

01:28

Link [Scripting News]

If the web were a platform for writers, how would it work?

01:07

Dirk Eddelbuettel: RcppArmadillo 15.2.6-1 on CRAN: Several Updates [Planet Debian]

armadillo image

Armadillo is a powerful and expressive C++ template library for linear algebra and scientific computing. It aims towards a good balance between speed and ease of use, has a syntax deliberately close to Matlab, and is useful for algorithm development directly in C++, or quick conversion of research code into production environments. RcppArmadillo integrates this library with the R environment and language–and is widely used by (currently) 1263 other packages on CRAN, downloaded 45.7 million times (per the partial logs from the cloud mirrors of CRAN), and the CSDA paper (preprint / vignette) by Conrad and myself has been cited 683 times according to Google Scholar.

This versions updates to the 15.2.5 and 15.2.6 upstream Armadillo releases from, respectively, two and five days ago. The package has already been updated for Debian, and built for r2u. When we ran the reverse-dependency check for 15.2.5 at the end of last week, one package failed. I got in touch with the authors, filed an issue, poked some more, isolated the one line that caused an example to fail … and right then 15.2.6 came out fixing just that. It was after all an upstream issue. We used to ran these checks before Conrad made a release, he now skips this and hence needed a quick follow-up release. It can happen.

The other big change is that this R package release phases out the ‘dual support’ for both C++14 or newer (as in current Armadillo) along with a C++11 fallback for more slowly updating packages. I am happy to say that after over eight months of this managed transition (during which CRAN expulsed some laggard packages that were not moving in from C++11) we are now at all packages using C++14 or newer which is nice. And I will take this as an opportunity to stress that one can in fact manage a disruptive API change this way as we just demonstrated. Sadly, R Core does not seem to have gotten that message and rollout of this package was also still a little delayed because of the commotion created by the last minute API changes preceding the R 4.6.0 release later this week.

Smaller changes in the package are a switch in pdf vignette production to the Rcpp::asis() driver, and a higher-precision computation in rmultinom() (matching a change made in R-devel during last week in its use of Kahan summation). All detailed changes since the last CRAN release follow.

Changes in RcppArmadillo version 15.2.6-1 (2026-04-20)

  • Upgraded to Armadillo release 15.2.6 (Medium Roast Deluxe)

    • Ensure internally computed tolerances are not NaN
  • The rmultinom deploys 'Kahan summation' as R-devel does now.

Changes in RcppArmadillo version 15.2.5-1 [github-only] (2026-04-18)

  • Upgraded to Armadillo release 15.2.5 (Medium Roast Deluxe)

    • Fix for handling NaN elements in .is_zero()

    • Fix for handling NaN in tolerance and conformance checks

    • Faster handling of diagonal views and submatrices with one row>

  • Sunset the C++11 fallback of including Armadillo 14.6.3 (#504 closing #503)

  • The vignettes have refreshed bibliographies, and are now built using the Rcpp::asis vignette builder (#506)

  • One rmultinom test is skipped under R-devel which has switched to a higher precisions calc

Courtesy of my CRANberries, there is a diffstat report relative to previous release. More detailed information is on the RcppArmadillo page. Questions, comments etc should go to the rcpp-devel mailing list off the Rcpp R-Forge page.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can sponsor me at GitHub. You can also sponsor my Tour de Shore 2026 ride in support of the Maywood Fine Arts Center.

Tuesday, 21 April

21:00

The Big Idea: Christian Bieck [Whatever]

Just because something is created with a younger audience in mind, doesn’t mean it can’t be enjoyed by all. After all, whomst among us doesn’t love the idea of magic cats? Author Christian Bieck is here today to show us the result of his NaNoWriMo creation, A Basquet of Cats.

CHRISTIAN BIECK:

At some point early in their writing journey, every writer learns that a good way to start a story is by having an interesting what-if. So one day a few years ago I asked my family, “What if cats had magic?”

“That’s not a what-if,” our son said. He’s a walking encyclopedia, and generally knows what he’s talking about. “Cats do have magic. They can turn invisible.”

“Mrt?” Rex, our ginger tabby, said from behind me.

I turned to him; he was sitting on the back rest of the sofa. “Where did you suddenly come from?” I asked.

“And they have short-range teleportation abilities,” my wife said. 

“And some mind magic,” our son said.

Rex said nothing, but his smug look clearly told me I should have known that.

“I did know that,” I said to him. “So what do I do now?”

I’m going at this Big Idea essay all wrong, aren’t I? Let’s try again:

It all started with a family game of Microscope.

For the less nerdy among this blog’s readers, Microscope is a cooperative world-building/setting-creation game. Players create a fictional timeline, and then events and people within that timeline to any depth desired. Afterwards, you can jump in and roleplay a scene.

We set the game in an alternate Earth medieval France. And the “people” to cats—cats that have even more magic than our real-world ones. Our main character was the friend, companion, familiar, however you call it, of a human mage, the Archmage of France and Spain. (Mages obviously also existed at the time.) Other mages were visiting his tower with their own cat companions, and something happened to them: the first event. Now the cats had to find out what had happened. Murder mystery with cats!

We spent a pleasurable afternoon fleshing out the story, as it was, ending up with a stack of index cards, but without an answer to the question what happened to the mages. Didn’t matter, it was fun. That was in December 2019.

Fast forward to late October 2021. An online article reminded me of the annual writing event called National Novel Writing Month, a.k.a. NaNoWriMo, and on the spur of the moment, I decided to take up the challenge and restart my fiction writing after a ten year break. My first NaNo attempt in 2009 had been successful in that I did finish a novel, but less so in terms of quality of output. So around 2011, I had decided to put fiction writing on hiatus and focus on improving my craft through the non-fiction writing I was doing in my day job.

So, what to write for Nano 2021? What if I used that Microscope game as a basis for my novel? What if, on top of their normal, natural magic, there were special cats with special skills? With mind-based magic, a magic that was quite different from that of human mages. And a mind-to-mind connection to said humans. And what if something happens to the main character’s mage, and the protagonist and his friends have to set it right?

I couldn’t find the index cards from the game anymore, but I didn’t really need them. I had my main characters and the inciting incident in my head; the beats in 3 disaster structure were quickly sketched out, and the story of A Basquet of Cats practically wrote itself. With the active help of Rex, and our female gray tabby Neko, who helpfully provided dialogue. (Have you ever had that thing where you look at the companion animals living with you, and comic-style speech bubbles pop up over their head, telling you exactly what they would be saying in that moment? No? I am sure John knows exactly what I mean . . .)

Okay, maybe “wrote itself” is a bit of an exaggeration, because even for a fantasy novel you need a (to naive me) surprising amount of research if your setting is alternate history Earth. What time exactly? (13th century, when Aquitaine was English.) How does the magic work? (No spoilers, just that Basque is the human language of magic, and “Abracadabra” in Basque is “Horrela izango da!”) How close to real cats are my cats? (Close. But they are cats, and that has consequences for the way they see the world. And how they behave. And communicate. And, and, and.) Do other animals feature? (Yes! But the PoVs are all cats!)

And then there was the question: for what audience was I writing Basquet? A story with animal protagonists feels like a kids’ book, so that was my starting point. I ended up writing a story that I would have wanted to read as a teenager, and be happy to re-read at any point later in life: an adventure story, a story of friendship, of responsibility, and of learning to value the good things in life and in relationships. My publisher calls it “For young adults and animal lovers of all ages”, and he’s exactly right.

I dream that Rex and Neko would also read and be pleased with the story.

(Full disclosure: I made up that dialogue at the beginning. But it could totally have happened that way; after all, real-life cats do have magic. Don’t they?) 


A Basquet of Cats: Amazon US|Barnes & Noble|Bookshop|Powell’s 

Author socials: Website|Bluesky|Linktree

Read an excerpt.

Old Man’s War Series a Hugo Finalist in the Best Series Category [Whatever]

Old Man’s War. Art by John Harris

This is fabulous news: The entire Old Man’s War series, from OMW to The Shattering Peace, has been nominated for the Best Series Hugo this year. What a lovely accolade. Here is the entire category:

  • Emily Wilde by Heather Fawcett (Del Rey US; Orbit UK)
  • October Daye by Seanan McGuire (Tor US; DAW)
  • Old Man’s War by John Scalzi (Tor US; Tor UK)
  • The Chronicles of Osreth by Katherine Addison (Tor US; Solaris UK; Subterranean)
  • The Craft Wars by Max Gladstone (Tor; Tordotcom)
  • White Space by Elizabeth Bear (Saga Press; Gollancz)

And here is the full list of finalists for this year. In my category as well as in others are writers and editors and artists and others who I like and admire. This is an excellent year for the Hugos, and I’m delighted to be part of it.

Also, yes, I will be attending Worldcon this year. In addition to anything else, I am DJing a dance!

— JS

20:28

20:21

Fedora Verified: a proposal to recognize Fedora contributor status [LWN.net]

The Fedora Project has been wrestling with the question of who should be able to vote in Fedora elections recently, with project membership being a major topic at the Fedora Council face-to-face held in early February. Now the project is considering a new contributor status, "Fedora Verified", and is looking to get input on the idea from the community.

What are the proposed benefits? The primary motivation behind "Fedora Verified" is to build trust-based recognition that grants elevated, privileged rights within the project. Most notably, this status would determine eligibility for strategic governance activities, such as:

  • Voting in Fedora community elections.
  • Running for leadership or decision-making roles within the project (i.e., Fedora Council, FESCo, Mindshare Committee, EPEL Steering Committee).
  • (Potential, unplanned) Accessing specific shared project resources or educational opportunities (e.g., Red Hat training credits).

The blog post includes a list of proposed baseline metrics for "Verified" status as well as open questions to be decided. A survey on the topic will be open until May 5.

18:56

04/21/26 [Flipside]

Kickstarter is launching today! https://www.kickstarter.com/projects/1016357068/flipside-graphic-novel-13th-volume
I am now starting my Kickstarter stream, which will be active all day today! Will be playing games and later doing an art stream! Check it out! https://www.twitch.tv/flipsider99

Mike Gabriel: Join us at Lomiri CodeFest on May 16-17 & Fre(i)e Software GmbH is hiring more Lomiri Developers [Planet Debian]

Lomiri Codefest in Tilburg NL (May 16-17 2026)

Just a quick invitation to an in-person event in Tilburg, the Netherlands.

All people interested in the Lomiri Operating Environment are invited to join us at the Lomiri Codefest [codefest] taking place on May 16-17 (participation is free of charge).

We are hiring Lomiri developers

And as another side node, we still have budget (until 07/2027) for 2-3 additional Lomiri developers (depends on each devs weekly availability). The details of my previous post [hiringdetails] +/- still apply. One more limitation / strength: You need real coding skills to apply for the open positions, AI-generated contributions will not be accepted for the tasks at hand.

If you are interested and a skilled FLOSS developer (you need previous OSS contributions as references) and available with at least 10 hrs / week, please get in touch [fsgmbh].

References

[codefest] https://codefest.os-sci.info/?lang=en
[hiringdetails] https://sunweavers.net/blog/node/150
[fsgmbh] https://freiesoftware.gmbh/

17:21

Sure, xor’ing a register with itself is the idiom for zeroing it out, but why not sub? [The Old New Thing]

Matt Godbolt, probably best known for being the proprietor of Compiler Explorer, wrote a brief article on why x86 compilers love the xor eax, eax instruction.

The answer is that it is the most compact way to set a register to zero on x86. In particular, it is several bytes shorter than the more obvious mov eax, 0 since it avoids having to encode the four-byte constant. The x86 architecture does not have a dedicated zero register, so if you need to zero out a register, you’ll have to do it ab initio.

But Matt doesn’t explain why everyone chooses xor as opposed to some other mathematical operation that is guaranteed to result in a zero? In particular, what’s wrong with sub eax, eax? It encodes to the same number of bytes, executes in the same number of cycles. And its behavior with respect to flags is even better:

  xor eax, eax sub eax, eax
OF clear clear
SF clear clear
ZF set set
AF undefined clear
PF set set
CF clear clear

Observe that xor eax, eax leaves the AF flag undefined, whereas sub eax, eax clears it.

I don’t know why xor won the battle, but I suspect it was just a case of swarming.

In my hypothetical history, xor and sub started out with roughly similar popularity, but xor took a slightly lead due to some fluke, perhaps because it felt more “clever”.

When early compilers used xor to zero out a register, this started the snowball, because people would see the compiler generate xor and think, “Well, those compiler writes are smart, they must know something I don’t. Since I was on the fence between xor and sub, this tiny data point is enough to tip it toward xor.”

The predominance of these idioms as a way to zero out a register led Intel to add special xor r, r-detection and sub r, r-detection in the instruction decoding front-end and rename the destination to an internal zero register, bypassing the execution of the instruction entirely. You can imagine that the instruction, in some sense, “takes zero cycles to execute”. The front-end detection also breaks dependency chains: Normally, the output of an xor or sub is dependent on its inputs, but in this special case of xor‘ing or sub‘ing a register with itself, we know that the output is zero, independent of input.

Even though Intel added support for both xor-detection and sub-detection, Stack Overflow worries that other CPU manufacturers may have special-cased xor but not sub, so that makes xor the winner in this ultimately meaningless battle.

Once an instruction has an edge, even if only extremely slight, that’s enough to tip the scales and rally everyone to that side.

Bonus chatter: One of my former colleagues was partial to using sub r, r to zero a register, and when I was reading assembly code, I could tell that he was the author due to the use of sub to zero a register rather than the more popular xor.

Bonus bonus chatter: The xor trick doesn’t work for Itanium because mathematical operations don’t reset the NaT bit. Fortunately, Itanium also has a dedicated zero register, so you don’t need this trick. You can just move zero into your desired destination.

The post Sure, xor’ing a register with itself is the idiom for zeroing it out, but why not sub? appeared first on The Old New Thing.

Sergio Cipriano: How to view the Debian Upload Queue [Planet Debian]

How to view the Debian Upload Queue

Some people may not know this, but the Debian Upload Queue is public and very easy to access:

$ curl ftp://ftp.upload.debian.org/pub/UploadQueue/
drwxr-sr-x   18 1518     1281         4096 Jun 26  2019 DELAYED
-rw-r--r--    1 1518     1281         3442 Jul 14  2025 README
-rw-r-----    1 117      1281         3052 Apr 20 21:32 neovim-tokyonight_4.14.1-1.debian.tar.xz
-rw-r-----    1 117      1281         2119 Apr 20 21:32 neovim-tokyonight_4.14.1-1.dsc
-rw-r-----    1 117      1281         5533 Apr 20 21:32 neovim-tokyonight_4.14.1-1_amd64.buildinfo
-rw-r-----    1 117      1281         2637 Apr 20 21:32 neovim-tokyonight_4.14.1-1_source.changes
-rw-r-----    1 117      1281       197584 Apr 20 21:32 neovim-tokyonight_4.14.1.orig.tar.gz

16:35

‘Scattered Spider’ Member ‘Tylerb’ Pleads Guilty [Krebs on Security]

A 24-year-old British national and senior member of the cybercrime group “Scattered Spider” has pleaded guilty to wire fraud conspiracy and aggravated identity theft. Tyler Robert Buchanan admitted his role in a series of text-message phishing attacks in the summer of 2022 that allowed the group to hack into at least a dozen major technology companies and steal tens of millions of dollars worth of cryptocurrency from investors.

Buchanan’s hacker handle “Tylerb” once graced a leaderboard in the English-language criminal hacking scene that tracked the most accomplished cyber thieves. Now in U.S. custody and awaiting sentencing, the Dundee, Scotland native is facing the possibility of more than 20 years in prison.

A screenshot of two photos of Buchanan that appeared in a Daily Mail story dated May 3, 2025.

Two photos published in a Daily Mail story dated May 3, 2025 show Buchanan as a child (left) and as an adult being detained by airport authorities in Spain. “M&S” in this screenshot refers to Marks & Spencer, a major U.K. retail chain that suffered a ransomware attack last year at the hands of Scattered Spider.

Scattered Spider is the name given to a prolific English-speaking cybercrime group known for using social engineering tactics to break into companies and steal data for ransom, often impersonating employees or contractors to deceive IT help desks into granting access.

As part of his guilty plea, Buchanan admitted conspiring with other Scattered Spider members to launch tens of thousands of SMS-based phishing attacks in 2022 that led to intrusions at a number of technology companies, including Twilio, LastPass, DoorDash, and Mailchimp.

The group then used data stolen in those breaches to carry out SIM-swapping attacks that siphoned funds from individual cryptocurrency investors. In an unauthorized SIM-swap, crooks transfer the target’s phone number to a device they control and intercept any text messages or phone calls to the victim’s device — such as one-time passcodes for authentication and password reset links sent via SMS. The U.S. Justice Department said Buchanan admitted to stealing at least $8 million in virtual currency from individual victims throughout the United States.

FBI investigators tied Buchanan to the 2022 SMS phishing attacks after discovering the same username and email address was used to register numerous phishing domains seen in the campaign. The domain registrar NameCheap found that less than a month before the phishing spree, the account that registered those domains logged in from an Internet address in the U.K. FBI investigators said the Scottish police told them the address was leased to Buchanan throughout 2022.

As first reported by KrebsOnSecurity, Buchanan fled the United Kingdom in February 2023, after a rival cybercrime gang hired thugs to invade his home, assault his mother, and threaten to burn him with a blowtorch unless he gave up the keys to his cryptocurrency wallet. That same year, U.K. investigators found a device at Buchanan’s Scotland residence that included data stolen from SMS phishing victims and seed phrases from cryptocurrency theft victims.

Buchanan was arrested by Spanish authorities in June 2024 while trying to board a flight to Italy. He was extradited to the United States and has remained in U.S. federal custody since April 2025.

Buchanan is the second known Scattered Spider member to plead guilty. Noah Michael Urban, 21, of Palm Coast, Fla., was sentenced to 10 years in federal prison last year and ordered to pay $13 million in restitution. Three other alleged co-conspirators — Ahmed Hossam Eldin Elbadawy, 24, a.k.a. “AD,” of College Station, Texas; Evans Onyeaka Osiebo, 21, of Dallas, Texas; and Joel Martin Evans, 26, a.k.a. “joeleoli,” of Jacksonville, North Carolina – still face criminal charges.

Two other alleged Scattered Spider members will soon be tried in the United Kingdom. Owen Flowers, 18, and Thalha Jubair, 20, are facing charges related to the hacking and extortion of several large U.K. retailers, the London transit system, and healthcare providers in the United States. Both have pleaded not guilty, and their trial is slated to begin in June.

Investigators say the Scattered Spider suspects are part of a sprawling cybercriminal community online known as “The Com,” wherein hackers from different cliques boast publicly on Telegram and Discord about high-profile cyber thefts that almost invariably begin with social engineering — tricking people over the phone, email or SMS into giving away credentials that allow remote access to corporate internal networks.

One of the more popular SIM-swapping channels on Telegram has long maintained a leaderboard of the most rapacious SIM-swappers, indexed by their supposed conquests in stealing cryptocurrency. That leaderboard previously listed Buchanan’s hacker alias Tylerb at #65 (out of 100 hackers), with Urban’s moniker “Sosa” coming in at #24.

Buchanan’s sentencing hearing is scheduled for August 21, 2026. According to the Justice Department, he faces a statutory maximum sentence of 22 years in federal prison. However, any sentence the judge hands down in this case may be significantly tempered by a number of mitigating factors in the U.S. Sentencing Guidelines, including the defendant’s age, criminal history, time already served in U.S. custody, and the degree to which they cooperated with federal authorities.

16:28

Self-Burn [George Monbiot]

Thanks to Trump, people around the world are scrambing to get out of fossil fuels.

By George Monbiot, published in the Guardian 18th April 2026

Donald Trump has done more to accelerate the energy transition than anyone else alive. Fossil fuel companies bankrolled his presidential campaign to stop the transition in its tracks. But when you back a volatile narcissist, unable to concentrate for more than a few minutes at a time, you shouldn’t expect to control the outcome.

It’s not that the fossils are suffering yet. As prices have soared since Trump and Netanyahu attacked Iran, oil executives have been selling shares at gobsmacking prices: the CEO of Chevron, for example, has cashed $104m so far this year. Vladimir Putin has also received a massive boost to his Ukraine invasion budget. As promised, Trump has gutted clean energy rules and programmes, green alternatives and environmental science. A fortnight ago, he stated, with the usual quantum of evidence (zero): “The environmentalists, I mean, they are terrorists … I call them environmental terrorists.”

But Trump’s illegal war, waged at terrible cost, is also focusing minds in governments around the world. It’s a demonstration not just that the orange emperor cannot be trusted, but also that fossil fuels cannot be trusted. Concentrated in certain regions, in the hands of either unreliable allies, potential opponents or outright enemies, dependent on long supply lines that can easily be disrupted, subject to price volatility that can trigger regime change in almost any country that relies on them, they now look less like a lifeline than a liability.

Again, it is true that the short-term response of some governments has been to favour fossil energy, through cutting fuel taxes or raising subsidies to help ease the cost of living crisis. But at the same time, many are now seeking to reduce or break their dependency. The logic of switching to renewables looks ineluctable.

This is certainly how their voters see it. The war has triggered a global surge in demand for electric vehicles (EVs), solar panels, heat pumps and other fossil-free technologies. Inquiries about buying EVs have risen 23% in the UK since the attack on Iran began, by 50% in Germany and by 160% in France. There’s similar interest in India, south-east Asia and South Korea. Even in the US, where Trump has done everything possible to stymie the technology, there’s 20% more interest than before the war.

The same goes for domestic solar panels and heat pumps. People in this country aren’t nearly as ignorant of their own interests as the Mail and the Telegraph like to pretend.

Rising enthusiasm for green tech coincides with some remarkable breakthroughs. Battery technology, as the climate advocate Bill McKibben points out, is advancing at astonishing rates, defying even recent predictions. Through grid-scale batteries, we could quickly eliminate the need for fossil fuel plants as the power source of last resort. This would greatly reduce the price of electricity. Solid-state batteries could before long enable the super-fast charging of everything, everywhere, with far longer storage times and (in cars) much greater range. Quantum batteries, now beginning to look like a realistic possibility, could transform the system all over again.

We are on the cusp of vast, cascading shifts in energy supply and storage. Any country that fails to respond will remain trapped in the fossil age, facing high bills and insecurity, while others transform their economies. Last week, the Chinese vehicle maker BYD announced plans for a network of super-fast chargers in the UK, which can power up a car battery from 10% to 70% in five minutes. Petrol and diesel automakers developing new models might as well be investing in typewriters and rotary telephones.

Governments should seek the electrification of everything that can be electrified, and the retirement of much that cannot. Rather than – as the gasbags insist – trying to extract the last dregs of fossil fuel from moribund North Sea fields, which could supply only a fraction of future demand, while keeping us locked into foreign dependency, the UK should now go all-out for grid batteries, heat pumps and induction hobs.

Half-measures offer nothing but delay and wasted costs. It makes no sense to keep selling new hybrid cars after full-fossil vehicles are phased out in 2030. An electric typewriter is still a typewriter.

This is also a great time to invest in energy conservation and energy efficiency. One of the remarkable legacies of Anne Hidalgo, former mayor of Paris, has been to enable, through the 15-minute city programme, people to meet their needs more cheaply, more conveniently and with greatly reduced emissions and air pollution. It is one of many examples of how we could do more with less. Instead of seeking to extend the long fossil century, we can, by switching to 21st-century technologies and solutions, not only protect ourselves from price shocks and dictators, but also improve our lives, create jobs and help prevent climate breakdown. But today we scarcely need to point it out, as Trump is making the argument on our behalf.

I believe his attack on every possible green measure is motivated as much by billionaire nihilism as by the demands of his sponsors. As a recent post of his suggests, he might actually believe he is divine. How can he prove it to himself? By terminating the lives and living conditions of mortals, either with a stroke of the pen, or with a thunderbolt from a B-1 Lancer bomber plane. Destruction is not just the means to an end. It is also the end.

The consequences of his mad-emperor phase ripple outwards. Trump’s support for Viktor Orbán might have contributed to the fall of the Hungarian autocrat’s regime. With it goes a vast infrastructure of funding, channelling the profits from Russian oil into propaganda networks across Europe and the UK. We are just beginning to understand how much of the anti-green campaigning in this country might have been financed this way.

Greens who were long dismissed as “idealistic” and “unrealistic” now look like hard-headed pragmatists and true patriots. They are years ahead of their rivals in demanding a transition that makes sense on every level: environmental, economic and political. And unlike the far right, the hard right and much of the rest of the political spectrum, they have not been seduced by the foreign money corrupting our politics.

The attack on Iran is not the way any of us wanted this to happen. But the unintended consequences of Trump’s pointless war could help sink Trumpism everywhere – and the corrupt and filthy industry that props it up.

www.monbiot.com

15:49

Firefox 150 released [LWN.net]

Version 150 of the Firefox web browser has been released. Notable changes include local-network-access restrictions being turned on for all users, the ability to reorder, copy, delete, paste, and export pages from a PDF using Firefox's built-in viewer, as well as improvements in its split view feature, and more. See also the release notes for developers and list of security fixes in this release.

(Update: Mozilla seems to have removed the local-network-access restrictions information since the release was published yesterday.)

[$] Using LLMs to find Python C-extension bugs [LWN.net]

The open-source world is currently awash in reports of LLM-discovered bugs and vulnerabilities, which makes for a lot more work for maintainers, but many of the current crop are being reported responsibly with an eye toward minimizing that impact. A recent report on an effort to systematically find bugs in Python extensions written in C has followed that approach. Hobbyist Daniel Diniz used Claude Code to find more than 500 bugs of various sorts across nearly a million lines of code in 44 extensions; he has been working with maintainers to get fixes upstream and his methodology serves as a great example of how to keep the human in the loop—and the maintainers out of burnout—when employing LLMs.

15:07

Pluralistic: Quinn Slobodian and Ben Tarnoff's "Muskism: A Guide for the Perplexed" (21 Apr 2026) [Pluralistic: Daily links from Cory Doctorow]


Today's links



The Harpercollins cover for Quinn Slobodian and Ben Tarnoff's 'Muskism: A Guide for the Perplexed.'

Quinn Slobodian and Ben Tarnoff's "Muskism: A Guide for the Perplexed" (permalink)

Quinn Slobodian and Ben Tarnoff's Muskism: A Guide for the Perplexed seeks to describe the ideology that gave rise to Elon Musk, the social forces that gave rise to that ideology, and the terrible future that ideology seeks to bring about:

https://www.harpercollins.com/products/muskism-quinn-slobodianben-tarnoff?variant=43838135402530

The book's starting point is that "Muskism" isn't merely the things Musk says, believes and does. It's the ideology that coalesces around him, from the people in his wake and the people he follows. Just as Henry Ford neither defined "Fordism" nor precisely practiced it, "Muskism" is centered on Elon Musk, but it's not Elon Musk's creation.

So what is Muskism? To answer this question, Slobodian and Tarnoff enumerate the factors and influences that produced Musk himself. There's apartheid, with its "rational" system of technocratic authoritarianism, which blended together a life of luxury and plenty (for white settlers), brutal surveillance and state violence (for the Black majority) and fascist control over speech (for everyone), combined with a meat-grinder draft that saw young men of Musk's age being called up to suppress liberation uprisings.

Peak apartheid coincided with peak personal computing, the moment where PCs (and then, modems) were getting cheaper and faster, propagating like mushrooms, offering a young Musk access to a broad world outside of the fascist bubble of South Africa, inspiring global ambitions in Musk.

Closer to home, there's Musk's family: his grandfather, a grandiose and vicious white supremacist who moved to South Africa from Canada because of his love for apartheid and racial hierarchy. There's Musk's father, a violent and abusive fool.

Muskism is also a new variant on techno-libertarianism. Traditional techno-libertarianism seeks to dismantle the state – or better yet, exit from the state, in the manner of an Ayn Rand hero. Techno-libertarianism is intimately bound up with settler colonialism, ever on the hunt for an "empty land" (terra nullius) that can be settled without committing the original sin of expropriation, the gravest offense in a religion organized around the total sanctity of private property:

https://pluralistic.net/2022/06/14/this-way-to-the-egress/#terra-nullius

Muskism doesn't seek to exit the state, it seeks to colonize and control it. Long before DOGE, Musk was playing the organs of the state to his own tune, securing massive contracts and subsidies for his solar and rocketry businesses, relying on the massive, deep-pocketed government to keep his businesses afloat.

Obviously (DOGE!), Muskism also seeks to dismantle the state, but only the parts of it that can be transferred to Musk's own private hands. Muskism is about big government…for Musk, but not for you. It embodies that important conservative value summarized in Wilhoit's Law:

There must be in-groups whom the law protects but does not bind, alongside out-groups whom the law binds but does not protect.

https://crookedtimber.org/2018/03/21/liberals-against-progressives/#comment-729288

This is Musk through and through – a man who demands the right to call innocent strangers "pedo guy" without legal consequence; and also wields the power of the state to shutter businesses that boycott his platform because of its shitty practices:

https://www.findlaw.com/legalblogs/courtside/elon-musk-sues-advertisers-who-boycott-x-under-anti-trust-laws/

Musk grew up on science fiction novels and weaves stfnal tropes through his offerings (for example, calling his chatbot "Grok"). There's no shortage of reactionary politics in science fiction, but Musk doesn't confine his sf-inspired cosmology to reactionary literature. He's famously very fond of the Wachowskis' "Matrix" movies, and leans heavily into the metaphor of the Matrix in explaining his interest in wiring people directly into computers, in characterizing opposing political beliefs as "mind viruses," and in calling his political enemies "NPCs":

https://pluralistic.net/2025/08/18/seeing-like-a-billionaire/#npcs

But Musk's relationship to this metaphor differs in a subtle and important way from the right's "Red Pill" rhetoric. Musk doesn't want to break out of the Matrix – he wants to control the Matrix. He wants to decide which opinions you're allowed to see and discuss (because "most people have weak firewalls for bad ideas"), he wants to beam ideas directly into your neural link, and he wants to abolish any form of workplace democracy, conquering the world with South African baasskap (boss-ism):

https://en.wikipedia.org/wiki/Baasskap

Throughout this slim volume, Slobodian and Tarnoff tease these strains of thought out of Musk's deeds and utterances, and in the systems that he has built or colonized through acquisition. The authors are offering more than a psychoanalysis, though – they're surfacing the material basis for Muskism, the benefits it delivers to its adherents, and the victories it has racked up.

They reveal the method in Musk's chaotic and bullying management style, and recount the times Musk has successfully shattered sclerotic processes to make real breakthroughs, especially in aerospace. You'd be hard pressed to read these passages and without feeling some grudging admiration.

Muskism gets stuff done…sometimes. At a cost. A high cost. Tarnoff and Slobodian count that cost, identify who pays it, and conjure up the world in which those costs continue to mount for all of us.

It's a chilling vision, a Torment Nexus dystopia run by someone who thinks cyberpunk was a suggestion, not a warning.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#15yrsago US, EU want to delay copyright treaty to help blind people for 3-5 years https://web.archive.org/web/20110423170607/http://keionline.org/node/1114

#15yrsago Is sugar a poison? https://www.nytimes.com/2011/04/17/magazine/mag-17Sugar-t.html?_r=1&amp;pagewanted=all

#15yrsago More watch-part motorcycles https://ummaisoumenos.blogspot.com/2008/11/miniaturas-fantsticasbikesfeitas-de.html

#15yrsago Seeds: comic-book memoir of father’s cancer is moving, sweet https://memex.craphound.com/2011/04/19/seeds-comic-book-memoir-of-fathers-cancer-is-moving-sweet/

#10yrsago Something New: frank, comedic, romantic memoir of a wedding in comic form https://memex.craphound.com/2016/04/19/something-new-frank-comedic-romantic-memoir-of-a-wedding-in-comic-form/

#10yrsago Ben and Jerry arrested at Democracy Spring demonstration in DC https://web.archive.org/web/20160419173913/https://www.msn.com/en-us/news/us/co-founders-of-ben-and-jerrys-arrested-at-us-capitol/ar-BBrW5tb?li=BBnb7Kz

#10yrsago Competing construction companies stage a bulldozer fight in a busy street https://www.youtube.com/watch?v=UrtnIImGipg

#10yrsago Chicago Police Accountability Task Force Report: racism, corruption, and a “broken system” https://chicagopatf.org/wp-content/uploads/2016/04/PATF_Final_Report_4_13_16-1.pdf

#5yrsago Facebook's tonsils https://pluralistic.net/2021/04/19/tonsilitis/#mod-traum

#1yrago Against transparency https://pluralistic.net/2025/04/19/gotcha/#known-to-the-state-of-california-to-cause-cancer


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Reverse-Centaur's Guide to AI," a short book about being a better AI critic, Farrar, Straus and Giroux, June 2026 (https://us.macmillan.com/books/9780374621568/thereversecentaursguidetolifeafterai/)
  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2026

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027

  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing: "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Third draft completed. Submitted to editor.

  • "The Reverse Centaur's Guide to AI," a short book for Farrar, Straus and Giroux about being an effective AI critic. LEGAL REVIEW AND COPYEDIT COMPLETE.
  • "The Post-American Internet," a short book about internet policy in the age of Trumpism. PLANNING.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

14:28

Turning Thirty [The Daily WTF]

Eric O worked for a medical device company. The medical device industry moves slowly, relative to other technical industries. Medical science and safety have their own cadence, and at a certain point, iterating faster doesn't matter much.

Eric was working on a new feature on a system that had been in use for thirteen years. This new feature interacted with a database which stored information about racks of test tubes, and Eric's tests meant creating several entries for racks of test tubes. And that's when Eric discovered that the database only allowed thirty racks. Add any more, it would just roll right back over to one.

This was odd. The database was small- less than 40MB, even in production- and there were automatic tasks to purge old data for compliance purposes. Why a hard limit of thirty?

Eric had only been at the company for a year, so he asked one of the more senior team members, Lester. "Oh yeah, that was before my time. You should probably ask Carl."

Later that day, Eric happened to bump into Carl around the coffee maker, and asked the question. "Oh, yeah, I do vaguely remember something about that. It was in the requirements for the product. I thought it was weird, but didn't think too much about it. You should probably ask Elise, she's been here like twenty years."

Well, now it was getting curious. Eric went over to the "old building", as it was named, the original office for the company on the other side of the parking lot. Most of the offices had moved to the new building a decade earlier, and it mostly served as fabrication and storage, but a few offices remained.

Elise was on the third floor, down a poorly lit hallway, sitting in an office with water-stained acoustical tile in its ceiling. "Oh, yeah, I put that into the requirements document. It's funny, I thought it was weird too, but the system you're working on was a replacement for an older system. Our requirements were derived from those. Let me think… Irving worked on that, but he's dead, god rest him. Penny is retired. Oh, you know, Humbert is still around. He didn't work on that, but he worked on some of the systems that came before that. He's upstairs and on the other side of the building."

Eric went upstairs and to the other side of the building. The fourth floor had been last remodeled circa 1985, and the ugly industrial paint on the wall was made even uglier by the fact that someone had replaced most of the flourescent tubes with LEDs. Most. The mismatched color temperature started Eric down the path of a headache.

Humbert was in an office similar to Elise's. On his desk was a plaque commemerating 40 years of service with the company. Eric asked about the limitation, and Humbert laughed.

"You're working on the latest version of a product that initially started on an old PDP-11 running MUMPS. I mean, the first versions, anyway. We ran to desktop computers as fast as we could. I wrote a version for DOS in… oh… '86? I knew none of the facilities we worked with had more than ten or fifteen racks of tubes, and I needed somehow to limit the size of the database so it all fit on a single 5 1/4" floppy disk. I picked thirty, because it seemed like a good round number. Honestly, I'm shocked that the limit still exists."

So was Eric. There had been several ground-up-rewrites since 1986, before the one Eric maintained had been released thirteen years ago. Each one of them had chosen to maintain the same limitation, without ever considering why it existed. The rule had simply been copied, mindlessly, for 40 years.

"I'm kind of impressed," Eric said to Humbert, "in a horrified way."

"Me too, kid, me too."

[Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.Learn more.

14:21

Security updates for Tuesday [LWN.net]

Security updates have been issued by AlmaLinux (freerdp, kernel, and kernel-rt), Debian (mupdf, opam, simpleeval, and xdg-dbus-proxy), Mageia (firefox, thunderbird and libtiff), Red Hat (containernetworking-plugins, gvisor-tap-vsock, nodejs22, nodejs:20, nodejs:22, perl-XML-Parser, python3.11, python3.9, runc, and skopeo), and SUSE (bind, buildah, cockpit-subscriptions, container-suseconnect, containerd, corosync, cosign, docker, dovecot24, flatpak, freeipmi, gegl, GraphicsMagick, helm, ImageMagick, kubernetes, kubernetes-old, libpng15, LibVNCServer, ncurses, nodejs22, opensc, openvswitch, patterns-glibc-hwcaps, podman, python, python310, python312, python315, rekor, rootlesskit, roundcubemail, and runc).

14:00

Dark Factories: Rise of the Trycycle [Radar]

The following article originally appeared on “Dan Shapiro’s blog” and is being reposted here with the author’s permission.

Companies are now producing dark factories—engines that turn specs into shipping software. The implementations can be complex and sometimes involve Mad Max metaphors. But they don’t have to be like that. If you want a five-minute factory, jump to Trycycle at the bottom.

The engine in the factory

Deep in their souls, dark factories are all built on the same simple breakthrough: AI gets better when you do more of it.

How do you do “more AI” effectively? Software factories use two patterns. One of them I’ve already told you about—slot machine development. Instead of asking one AI, you ask three at once, and choose the best one. It feels wasteful, but it gives better results than any model could alone.

Does three models at a time seem wasteful? Well, wait until you meet the other pattern: the trycycle.

The simplest trycycleThe simplest trycycle

It seems trivial, but it’s an unstoppable bulldozer that can bury any problem with time and tokens. And of course, you can combine it with slot machine development for a truly formidable tool.

Every software factory has a trycycle at its heart. Some of them are just surrounded by deacons and digraphs.

(And as a side note, they’re all more fun with freshell, which is free and open source and makes managing agents a joy!)

Let’s meet the factories, shall we?

Gas Town

Gas Town AI image

Steve Yegge saw this coming like a war rig down a cul-de-sac. His factory, Gas Town, dropped the day after New Years, and I was submitting PRs before the code was dry. It launched as a beautiful disaster, with mayors, convoys, and polecats fighting for guzzoline in the desert of your CPU. It’s now graduated to a fully fledged MMORPG for writing code. It’s amazing, it’s effective, and it’s pioneering in a fully Westworld sort of way.

The StrongDM Attractor

Justin McCarthy, the CTO of StrongDM, talks about the factory as a feedback loop. It used to be that when a model was fed its own output, it would fix 9 things and break 10—like a busy and productive company that was losing just a bit of money on every transaction. But sometime last year, the models crossed an invisible threshold of mediocrity and went from slightly lossy to slightly gainy. They started getting better with each cycle.

Justin’s team noticed and built the StrongDM attractor to cash in.

If Gas Town is Mad Max, StrongDM is Factorio: an infinitely flexible, wildly powerful system for constructing exactly the factory you need.

But the StrongDM team did something interesting: They didn’t ship their factory. Instead, they shipped the specification for the Attractor so everyone can implement their own.

And you can absolutely implement your own! But you can also just steal the one I made for you.

Kilroy

Kilroy image

Kilroy is a StrongDM Attractor written in Go (although it works with projects in any language). It has all the flexibility of the Attractor design, but it also ships with an actual functioning factory configuration, tests, sample files, and other things that make it more likely to work.

In theory, you don’t need Kilroy—you can just point Claude Code or Codex CLI  at the Attractor specification and burn some tokens. My friend Harper built three (and you should read his post for some meditations on where the Attractor approach is heading).

In practice, it took the better part of a month for me and some wonderful contributors to polish up Kilroy to the point where it is now, so you may save yourself some time, tokens, and effort by just stealing this.

Enter the trycycle

trycycle image

The other night I was carefully building the dotfiles and runfiles for a Kilroy project—configuring the factory to build the project.

Then a thought struck.

What if this was just a skill?

Enter Trycycle, the very simplest trycycle. It’s a very simple skill for Claude Code and Codex CLI that implements the pattern in plain English.

  1. Define the problem.
  2. Write a plan
  3. Is the plan perfect? If not, try again.
  4. Implement the plan.
  5. Is the implementation perfect? If not, try again.

That’s basically it. To use it, you open your favorite coding agent and say, “Use Trycycle to do the thing.” Then sit back and watch the tokens fly.

It’s simple because it’s just a skill. Under the hood, it adapts Jesse Vincent’s amazing Superpowers for plan writing and executing. It will take you literally minutes to get started. Just paste this into your agent and you’re off to the three-wheel races.

Hey agent! Go here and follow the installation instructions.
https://raw.githubusercontent.com/danshapiro/trycycle/main/README.md

Trycycle is barely 24 hours old as of the time of this writing. I’ve shipped well over a dozen features with it already, and I was in meetings most of the day. While I was having dinner, it ported Rogue to Wasm(!). Last night it churned for 7 hours and 56 minutes and landed six features for freshell.

The best part, though, is that because it’s just a skill, it’s instantly part of your dev flow. There’s no configuration or learning curve. If you want to understand it better, just ask. If you don’t like what it’s doing, have stern words.

Which one to use?

Here’s how I’d decide right now.

If you want to become part of a growing movement of collaborators burning tokens together to build software, individually and collectively—try Gas Town.

If you want to invest in building a powerful, configurable, sophisticated engine that can drive your projects forward 24 hours a day—try Kilroy.

If you just want to get things done right now, give Trycycle a spin. Heck, it’s fast enough that you can spin up a trycycle while you read the docs on Kilroy and Gas Town.

And whatever you choose, I recommend you do it with freshell, because it’s just more delightful that way!

Thanks to Harper Reed, Steve Yegge, Jesse Vincent, Justin Massa, Nat Torkington, Marcus Estes, and Arjun Singh for reading drafts of this.

12:07

Mexican Surveillance Company [Schneier on Security]

Grupo Seguritech is a Mexican surveillance company that is expanding into the US.

11:21

Why you should think carefully before feeding birds [Judith Proctor's Journal]

 Recent research has shown that some fatal diseases in garden birds are spread by bird feeders.  The RSPB (Royal Society for the Protection of Birds) stopped selling bird tables several years ago, and have now issued guidelines on what times of our one should not feed at all, and how often seed and suet feeders should be disinfected.

After thinking about it, I've taken down my feeders.  They were getting very little use in recent years, and when I'm unwell, I can't clean them regularly enough.

I still have plenty of plants that attract insects, and a tree with rough bark where I often see small birds looking for food.

Advice from the RSPB 



comment count unavailable comments

11:07

Russell Coker: More About Ebook Readers in Debian [Planet Debian]

FBReader

After my previous blog post about eBook readers in Debian [1] a reader recommended FBReader. I tried it and it’s now my favourite reader. It works nicely on laptop and phone and takes significantly less RAM than Calibre or Arianna (especially important for phones). While the problems with my FLX1s not displaying text with Calibre or Arianna might be the fault of something on the FLX1s side those problems just don’t happen with FBReader.

FBReader has apparently now got a proprietary version as the upstream, but we still have FOSS code to use in Debian. It would be nice if someone updated it to store the reading location using WebDAV and/or a local file that can be copied with the NextCloud client or similar. Currently there is code to store reading location in the Google cloud which I don’t want to use. It’s not THAT difficult to see what chapter you are at with one device and just skip to that part on another, but it is an annoyance.

One thing I really like about FBReader is that you can run it with a epub file on the command line and it just opens it and when it’s been closed you can just open it again to the same spot in the same file. I don’t want a “library” to view a book list, I just want to go back to what I was last reading in a hurry. Calibre might be better for some uses, for example I can imagine someone in the publishing industry with a collection of thousands of epub files finding that Calibre works better for them. But for the typical person who just wants to read one book and keep reading it until they finish it FBReader seems clearly better. The GUI is a little unusual, but it’s not at all confusing and it works really well on mobile.

Okular

I tried Okular (the KDE viewer for PDF files etc) which displays epub files if you have the “okular-extra-backends” installed, but it appears to not display books with the background color set to black. I would appreciate it if someone who has read some public domain or CC licences epub files can recommend ones with a black background that I could use for testing as I can’t file a Debian bug report without sample data to reproduce the bug. I decided not to use it for actual book reading as FBReader is far better for my use taking less RAM and being well optimised for mobile use.

Folite

Foliate supports specifying a book on the command-line which is nice. But it takes more memory than FBReader which is probably mostly due to using webkit to display things. The output was in 2 columns on my laptop in small text which is probably configurable but I didn’t proceed with it. I determined that it doesn’t compare with FBReader for my use. It’s written in JavaScript which may be a positive feature for some people.

Koodo

I had a brief test of Koodo which isn’t in Debian. Here is the Koodo Reader Github [2]. I installed the .deb that they created, it installs files to “/opt/Koodo Reader/” (yes that’s a space in the directory name) and appears to have Chromium as part of the runtime. I didn’t go past that even though it appears to have a decent feature set. It is licensed under version 3 of the AGPL so is suitable for Debian packaging if someone wants to do it.

Thorium

I saw the Thorium reader on Github [3] which looks promising, it’s under the BSD 3 clause license so is suitable for Debian packaging. The EDR Lab seems like a good project for advancing electronic document use [4] and it would be good to have their stuff in Debian.

For the moment I’m happy using FBReader.

10:21

The right sort of friction [Seth's Blog]

If we remove impediments that are in the way of where our customers seek to go, they support us.

But when we remove the friction that gives people traction on their journey, they flounder.

Remove the hassles that people don’t care about, but celebrate the hassles that make it worth the effort.

09:35

West Oz Leather: West Connect by Hien Pham [Oh Joy Sex Toy]

West Oz Leather: West Connect by Hien Pham

Where does one go to spend a Sunday afternoon with leather-clad, latex-wrapped, and otherwise-kinky folks in Perth? Why, at West Oz Leather’s social event West Connect, of course! This is such an incredible space that I feel deeply grateful to get to exist in. Thank you to the committee and volunteers for giving me something […]

06:56

When the Moon Hits Your Eye the Winner of the Astra Book Award for Best Science Fiction Novel [Whatever]

The Astra Awards are an award given out by the Hollywood Creative Alliance, and in previous years have been primarily for film and television, but this year they have branched out into books as well, across seventeen categories including Best Science Fiction Novel. And what do you know, in this inaugural year for the book awards, When the Moon Hits Your Eye was the winner. I am, of course absolutely delighted.

The awards were livestreamed, which I have posted above, and you can see my acceptance speech starting at 28:56 (if you don’t want to watch the whole thing, the full list of finalists and winners is available here). In my speech I specifically thank my editors Patrick Nielsen Hayden and Mal Frazier, as well as my agent Ethan Ellenberg and my manager Joel Gotler, but also generally everyone who worked on the book up and down the production chain. There would be no book without their work.

In any event, how cool is this? It’s made my day. Winning awards is fun.

— JS

06:07

Google AI Overviews [Richard Stallman's Political Notes]

Empirically, Google Search so-called "AI" Overviews have a 10% chance of giving incorrect answers.

Google says users should check them before trusting them, but this is just an excuse to avoid being liable for the errors. At the same time, Google uses the hype term "AI" so that users will trust them.

If you don't want to be misled by them, don't look at them. Even better, don't use Google search at all.

I can't use Google search because it doesn't work at all, for me. It requires users to run nonfree JavaScript programs, and my browser is set to refuse to run such programs, so if a link ever takes me to Google search, it has no chance to mislead me.

CDC leadership vacuum [Richard Stallman's Political Notes]

The CDC is nearly paralyzed, as 80% of the group leadership positions are vacant. This adds to a lot of other damage — 1/5 of the staff were fired (or quit).

The previous acting director, Bhattacharya, was previously infamous for advocating allowing Covid-19 to spread unhindered and advising old people to protect themselves by avoiding contact with other people.

Either RFK jr is nuts or he is committing intentional sabotage — I can't see any way around it. But neither alternative fully makes sense.

US consensus over military aid [Richard Stallman's Political Notes]

Most Democratic senators now oppose providing arms to Israel, like most Democratic voters.

Israel's callous chain of atrocities had to have an effect, and it has.

05:42

Ravi Dwivedi: LibreOffice Conference Budapest 2025 [Planet Debian]

In September 2025, I attended the LibreOffice Conference in Budapest, Hungary, on the 4th and the 5th, and a community meeting on the 3rd. Thanks to The Document Foundation (TDF) for sponsoring my travel and accommodation costs. The conference venue was Faculty of Informatics, Eötvös Loránd University (ELTE).

The conference was planned to be held from the 4th to the 6th, but the program for the 6th of September had to be canceled due to the venue being unavailable because of a marathon in Budapest. So, all the talks got squeezed into just two days, making the schedule a bit hectic.

The TDF had booked my room at the Corvin Hotel. It was a double bedroom with a window. The breakfast was included in the hotel booking. The hotel was walking distance from the conference venue. One could also take a tram from the hotel to reach the venue.

A double bed

A shot of my room. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

Tram

A tram in Budapest. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

3rd of September

On the 3rd of September, we had a community meeting at the above-mentioned venue. I walked with my friend Dione to the venue. Upon reaching there, I noticed that the university had no boundaries and gates. This reminded me of the previous year’s conference venue in Luxembourg, which also had no boundaries or gates.

In contrast, Indian universities and institutes typically have walls and gates serving as boundaries to separate them from the rest of the city. Many of these institutes also have security guards at the entrance, who may ask attendees to present proof of admission before allowing them inside. I was surprised to find that institutes in Europe, like the one where the conference was held, did not have such boundaries.

The building where the conference was held was red, which happened to be the same color as the building for the previous year’s conference venue. I remember joking with Dione that the criteria for the conference venue might have been the color of the building.

A red building

The red building in the picture served as the conference venue. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

During the community meeting, we shared ideas on how to spread the word about LibreOffice. The meeting lasted for a couple of hours.

After the community meeting, we went to the hotel for dinner sponsored by the TDF.

Cake slices

These Esterházy cake bites were really yummy. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

Raspberry Currant cake slices

Raspberry Currant cake slices. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

4th of September

On the first day of the conference, attendees were given swag bags containing a pad, sticky notes, a pen, a conference T-shirt, and a bottle.

A blue colored T-shirt on a bed along with a pen, a bottle, a diary and a sticky note

Conference swag. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

The talks started early in the morning with Eliane Domingos, Chairperson of TDF’s Board of Directors, giving the inauguration talk. As always, I found Italo Vignoli’s talk on the importance of document freedom interesting.

During the snack break, I noticed that there were three types of milk available for coffee: cow’s milk, lactose-free milk, and almond milk. Almond milk is rare in India, but I have managed to get it, but I have never seen lactose-free milk in India.

Since I run fundraisers in my projects, such as Prav, I could relate to Lothar K. Becker’s talk. He discussed the issue that certain implementations in LibreOffice require a budget that is too large for any single interested entity to fund independently. Furthermore, The Document Foundation (TDF) cannot legally receive funds from government entities. Therefore, there is no organization or entity to pool resources from all the interested entities to finance the implementation.

Lothar giving his presentation

Lothar giving his presentation. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

Another talk was by the Austrian Armed Forces on their migration to LibreOffice. I wanted to know why they migrated, and I found out that they did it for their digital sovereignty, and not for saving on the license costs. Another point presented in the talk was that LibreOffice is available on all the operating systems, while the Microsoft Office suite is not that widely available. The migration was systematic and was performed over a few years. They started working on it in 2021, and the migration was finished recently. In addition, it also required training their staff in using LibreOffice.

Presentation on migration to LibreOffice by Austrian Armed Forces

Presentation on migration to LibreOffice by Austrian Armed Forces. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

The lunch was inside the university canteen. We were provided lunch coupons by the TDF. I got a vegan coupon with 4000 Ft written on it, which meant I could take lunch for up to 4000 Hungarian forints.

My lunch ticket

My lunch ticket for the conference. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

The lunch I had on the first day

The lunch I had on the first day. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

During the evening, it was my turn for the presentation. I was done with preparing my slides ten days before my talk. I also got my slides reviewed by friends.

My talk was finished in 20 minutes, while I was given a 30-minute slot. This helped us catch up on the schedule. Furthermore, I made my talk interactive by asking questions and making sure that the audience was not asleep. During my talk, my friend Dione took my pictures with my camera.

My talk was on how free software projects could give users a say in freedom to modify the software. I illustrated this using the Prav project that I am a part of.

After the talks were over, we were treated to a conference dinner at Trofea Grill. It had a great selection of desserts, which helped me sample some Hungarian desserts. The sponge cake was especially good.

Desserts at Tofea Grill

Desserts at Tofea Grill. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

5th of September

The next day—the 5th of September—I went with Dione to the venue early in the morning, as her talk was the first one of the day. Her talk was titled Managing Tasks with Nextcloud Deck. Later that day, I also attended a talk on Collabora. At lunch, I found the egg white salad quite tasty.

Dione giving her presentation

Dione giving her presentation. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

Egg white salad

Egg white salad. Photo by Ravi Dwivedi, released under CC-BY-SA 4.0.

After the lunch break, we had the conference group photo. I had a Nikon camera, which we used to take the group photo. I requested a university student to take our group photo and also taught her how to operate the camera.

People looking at the camera and smiling

Group photo

By the evening, the conference ended, after which we went to a pub, which was again sponsored by TDF. I had beer, but that one really tasted bad, so I couldn’t finish it. The only vegetarian option was goat cheeseburger, which my friend Manish and I opted for. The burger tasted awful. Apparently, I don’t like goat cheese.

The next day I went sightseeing with Dione in Budapest. Stay tuned for our adventures in Budapest!

Credits: Thanks to Dione and Richard for proofreading.

02:00

[1296] The Masks Are Still Scheming [Twokinds]

Comic for April 20, 2026

01:49

Monday, 20 April

23:28

Some tech company to replace its CEO [OSnews]

I need to post about this because if I don’t, people will get mad.

Cook will continue on as Apple CEO through the summer, with Ternus set to join Apple’s Board of Directors and take over as CEO on September 1, 2026. Cook is going to transition to chairman of the board at Apple, and he will “assist with certain aspects of the company, including engaging with policymakers around the world.”

↫ Juli Clover at MacRumors

This concludes OSNews’ coverage of Keeping Up With the Yacht Class, but rest assured, every other tech site will be milking this for weeks to come. You will still be worrying about how to pay for your next tank of gas.

22:42

Google to punish back button hijacking [OSnews]

Have you ever tried clicking the back button in your browser, only to realise the website you’re on somehow doesn’t allow that? Out of all the millions of annoyances on the web, Google has decided to finally address this one: they’re going to punish the search rankings of websites that use this back button hijacking.

Pages that are engaging in back button hijacking may be subject to manual spam actions or automated demotions, which can impact the site’s performance in Google Search results. To give site owners time to make any needed changes, we’re publishing this policy two months in advance of enforcement on June 15, 2026.

↫ Google Search Central

It’s always uncomfortable when Google unilaterally takes actions such as these, since rarely do Google’s interests align with our own as users. This is in such rare case, though, and I can’t wait to see this insipid practice relegated to the dustbin of history.

21:07

LXQt 2.4.0 released [OSnews]

LXQt, the desktop environment which is effectively to KDE what Xfce is to GNOME, has released version 2.4.0. Quite a few changes in this release are further refinements and fixes related to LXQt’s adoption of Wayland, but there are also a ton of small fixes, improvements, and small new features that have nothing to do with Wayland at all. There are also a few layout cleanups to make some dialogs and panels look a bit tidier and nicer.

Note that LXQt supports both X11 and Wayland equally, and the choice of which to use is up to you. If you’re using LXQt, you’ve already seen a few of these changes in point releases of its components, so not everything listed in the release notes might be news to you.

19:35

Git 2.54.0 released [LWN.net]

Git maintainer Junio Hamano has announced Git 2.54.0, which includes contributions from 137 people; 66 of those people are first-time contributors to the project. Changes include the addition of Git history rewriting, Git's web interface (gitweb) "has been taught to be mobile friendly", and much more. See the announcement for all improvements, additions, and bug fixes. Hamano is now taking a short break:

I will go offline for a couple of weeks starting this evening, hopefully after updating 'next' and possibly also pushing out the first batch of the new cycle. There is no designated interim maintainer this time, but I trust that the community can self organize during my absense, if the shape of the release and the tree turns out to be super bad ;-).

See this GitHub blog entry for highlights from this release.

Bits from Debian: Debian Project Leader election 2026 is over, Sruthi Chandran elected! [Planet Debian]

The voting period and tally of votes for the Debian Project Leader election has just concluded, and the winner is Sruthi Chandran. Congratulations!

347 out of 1,039 Developers voted using the Condorcet method.

More information about the results of the voting is available on the Debian Project Leader Elections 2026 page.

Many thanks to Sruthi Chandran for her campaign, to our Developers for their votes, and to Andreas Tille for his service as DPL over the past two years!

The new term for the project leader will start on April 21, 2026 and expire on April 20, 2027.

19:14

Athena Vibes [Penny Arcade]

When I named the strip, I was thinking about how Athena burst from her father's head - considering the bedevilments we had proposed in the strip. As I woke, I feared that there was a vibrator company called Athena and I was Goddamn right. You know how you can have a party where you sell candles or something to your friends? Right. This is like that, except it's for things you… things you put. Things that are and can be put in, like… Anyway, they have different things. For a place.

18:49

Arch Linux now has a reproducible container image [LWN.net]

Robin Candau has announced the availability of a bit-for-bit reproducible container image for Arch Linux:

The bit-for-bit reproducibility of the image is confirmed by digest equality across builds (podman inspect --format '{{.Digest}}' <image>) and by running diffoci to compare builds. We provide documentation on how to reproduce this Docker image (as we did for the WSL image as well).

Building the base rootFS for the Docker image in a deterministic way was the main challenge, but it reuses the same process as for our WSL image (as both share the same rootFS build system).

[...] This represents another meaningful achievement in our "reproducible builds" efforts and we're already looking forward to the next step!

18:35

The Big Idea: Dan Rice [Whatever]

When we explore our minds, our thoughts, and who we are as a person, we don’t always like what we find. Author Dan Rice takes a deep dive into the idea of accepting one’s true self, even if some facets are uglier than others. Grab a mirror for some self-reflection and follow along in the Big Idea for his newest novel, The Bane of Dragons.

DAN RICE:

Sometimes you have to go down the rabbit hole.

The challenge I faced when writing The Bane of Dragons was to send Allison on an adventure with a climax that ended her story and the series with a bang instead of a fizzle. Luckily, Allison had rabbit holes to go down, one that she had explored many times before and another she had only ever gazed upon.

The rabbit hole Allison spends much time spelunking is her inner self. In those dark tunnels she wrestled with, negotiated with, and sometimes was defeated by her literal internal monster that always pined for escape and to supplant her. This device provides ample ongoing conflict throughout the series after the monster wakes up in the first book, Dragons Walk Among Us. Allison’s titanic clashes with her inner monster, which she comes to understand is another facet of herself, mirrors the struggles young adults face as they pass from adolescence to adulthood, albeit in dramatic and often bloody fashion.

The other rabbit hole Allison must explore is the slipstream, described as a superhighway through the multiverse. Since encountering this pathway to alternate dimensions in the first book, she has dreamed of traveling it, and, while both sleeping and awake, has been commanded by a stentorian voice to enter the slipstream. It is something she both yearns for and fears. In The Bane of Dragons, it’s a yearning she must give in to and a fear she must face. The only way to protect everyone she loves is to travel the slipstream and discover exactly what’s waiting for her on the other side.

What Allison and her motley companions discover are strange worlds and monstrous aliens. They are captured by angry, terrestrial octopi, whom they attempt to negotiate with, with nebulous results. Instead of taking the fight to the monsters threatening Earth, Allison is handed over as a prisoner to her nemesis, General Bane. But not all is what it seems on the surface, and even the deadly General Bane, with whom Allison shares a kinship by way of her inner monster, is a prisoner of sorts, pining for freedom.

To free Bane and hopefully protect everyone she loves, Allison must finally come to ultimate terms with her inner monster. In the end, that means looking into the mirror and accepting herself, both the human and the monster with its fangs and claws and transgressive desires. Only by becoming one with her monster can she communicate to Bane and others like him how to break the bonds that hold them.

Just like in real life, young adult characters sometimes need to go down the rabbit holes, both those that spark curiosity and those that cause dread. It’s the only way to learn, mature, and find self-acceptance.

—-

The Bane of Dragons: Amazon|Barnes & Noble|Books-A-Million

Author socials: Website|Facebook

18:28

Thank You For Being a Friend [Coding Horror]

Thank You For Being a Friend

It's been one of those months, and by that, I mean one of the 663 months since I was born. This won't be a long post, because I only have two things to say. First, I'm really glad we re-ordered the GMI (Guaranteed Minimum Income) rural study counties so Mercer County, WV, my Dad's county, went first in October 2025. I knew dad was close to the end, and sure enough, that was the last time I ever saw him.

You can kinda sorta meet my dad on this page, if you want to.

Why Pledge to Share the American Dream? • RGMII
Why we pledged to Share the American Dream: RGMII’s $50M plan funds rural guaranteed minimum income studies to expand opportunity and strengthen democracy.
Thank You For Being a Friend

I knew this was coming, and so did he. There is no loss, because nothing ever ends.

Thank You For Being a Friend

All those experiences I had with my father, particularly that last October trip, will stay with me forever. Nothing was lost. Everything was gained. We won capitalism, then went back to help improve it for everyone. And believe me, I'm far from being done with my third startup.

Second, I want to take a moment to thank everyone – and I do mean everyone – who ever contributed to Stack Overflow in any way. And lucky you, it's not Starship this time!

Did you know that LLMs basically could not code at all without access to the extremely high quality creative commons programming Q&A dataset that all of us built together at Stack Overflow? Don't take it from me, ask the LLMs. They'll tell you themselves. Go ahead. G'wan. Ask. Really grill 'em on this one. I strongly recommend you use pro mode when asking, though, because those are the only decent LLM modes in my experience. It is incredible what you can do with global brain statistics and a strongly curated dataset created by we, the people!

One last thing. If the LLMs end up hollowing out the very communities that produce all their training data, they're going to really, really regret that. I'll give these LLM / GAI companies the same advice I gave Joel Spolsky when I left Stack Overflow to start Discoursedo not, for any reason, under any circumstances, kill the goose that lays the golden eggs, aka the human community around your product that does all the real work. It's pretty simple. Just treat the community with the respect they deserve... that we all deserve.

Thank you for being a friend, because there's no way I could have done any of this without you. 💛

18:07

Pluralistic: Comrade Trump (20 Apr 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links

  • Comrade Trump: Burning down the American empire to save it.
  • Hey look at this: Delights to delectate.
  • Object permanence: MPAA's threat-based 'education'; Cuehack; Heinlein on GWB; AT&T v the internet; British tax-havens v HMG; What is neoliberalism?; Newspaper landlords; Watch-part motorcycle; Tax havens bad; Buscemi's eyes; Sesame Street on lead poisoning.
  • Upcoming appearances: San Francisco, London, Berlin, NYC, Barcelona, Hay-on-Wye, London, NYC.
  • Recent appearances: Where I've been.
  • Latest books: You keep readin' em, I'll keep writin' 'em.
  • Upcoming books: Like I said, I'll keep writin' 'em.
  • Colophon: All the rest.



A Soviet propaganda poster featuring Lenin pointing angrily into the distance. It has been altered. Lenin now has Trump's hair and his skin in orange. The hammer/sickle logo behind him has been replaced with a cross.

Comrade Trump (permalink)

There aren't a lot of things I agree with Mark Carney about, but there's one area where he and I are in total accord: the old, US-dominated, "rules-based international order" was total bullshit:

https://www.weforum.org/stories/2026/01/davos-2026-special-address-by-mark-carney-prime-minister-of-canada/

Unlike Carney, I never pretended to like that old order, and indeed, I spent my entire life fighting against it – literally, all the way back to childhood, organizing other children to march against Canada's participation in America's nuclear weapons programs:

https://www.flickr.com/photos/doctorow/53616011737/in/photolist-2pFS5kt

All of which means that my experience of the Trump years is decidedly weird. On the one hand, I exist in a near-perpetual state of anxious misery, as Trump and his chud army of Christian nationalists and degenerate gamblers pursue a program of gleeful genocide. But at the very same time, I'm living in a world in which Trump is (inadvertently) dismantling many of the worst aspects of the old order in favor of something decidedly better.

Take Trump's tariff policy. Back during Trump I, he decided that Americans couldn't buy Chinese solar anymore, which had the double benefit of allowing him to pursue the twin goals of throwing red meat to Sinophobic Cold War 2.0 freaks and delivering a giant gift to the planet-wrecking oil companies that had helped him buy his way into office.

This was really bad for America, of course, but those solar panels had to go somewhere. Mostly, they ended up in Pakistan, dumped there at such a massive discount that the country solarized virtually overnight. Pakistani solar installers learned their trade from Tiktok videos set to Tamil film soundtracks, and unwired the country so thoroughly that today, the national power company is in danger of going bust because no one buys their electricity from the grid anymore. Pakistani bridal dowries now routinely include four panels, an inverter and a battery:

https://billmckibben.substack.com/p/a-tale-of-two-countries

This is an inversion of the normal order of things, in which rich countries get all the good stuff first, and poor countries like Pakistan get scraps after we've gorged ourselves. Think of vaccine apartheid, in which monsters like Howard Dean insisted that we had to prevent countries in the global south from making their own covid vaccines, because poor brown people are too stupid and primitive to run a pharma manufacturing operation:

https://pluralistic.net/2021/04/08/howard-dino/#the-scream

But, thanks to Comrade Trump, Pakistan was first in line to become the world's solar capital. The country's LNG terminal – built with Chinese Belt-and-Road money – is now a stranded asset, because no one there needs gas.

That's gas whose supply has been choked off in the Strait of Epstein…which brings me to Trump's foreign policy and its impact on the global energy shift. Transitory energy shortages have small effects: when your energy bill goes up for a while (because of extreme weather, say), it makes you angry and sad and might result in an electoral loss for whatever politician presided over the price hike. But when you get genuine, prolonged shortages – the sort that are accompanied by rationing – you make permanent changes.

Rationing is so psychologically scarring that it induces people to make long-delayed investments that result in permanent changes to their consumption habits. Maybe you've known for a long time that an induction top would be better for your indoor air quality and your cooking than the gas range you have now, but you don't want to buy a whole new appliance and pay for an electrician to run a high-wattage line in expensive conduit from your breaker panel to your kitchen.

But if you're an Indian restaurateur who can no longer get any cooking gas – because it's being rationed for household use – then you are going out to buy whatever induction top you can lay hands on. Maybe it's a cheap, low-powered single burner one that plugs into your existing electrics, or maybe you're splashing out and swapping out your whole gas appliance. Whichever it is, you are no longer interested in your chef's insistence that real cooking gets done over gas. If your chef can't cook on an induction top, your chef will need to find employment elsewhere.

This is going on all over the world right now, as people buy EVs (and pay to have chargers installed at home – maybe getting a twofer on their conduit runs with two high power lines run through the same conduit infrastructure). In Australia – where the last shipment of gas for the foreseeable came into port last week – people are calling their local EV dealers and offering to buy whatever car is on the lot, sight unseen.

Meanwhile, in Ethiopia, a series of dollar-related crises caused the country to ban imports of internal combustion engines altogether (oil and gas are denominated in dollars, which means you can only get oil if you first sell stuff to Americans or others who'll pay in dollars). The country's fleet of noisy, dirty motorbikes is being swiftly replaced by ebikes that get eight miles to the penny:

https://www.ecofinagency.com/news-industry/0810-49366-ethiopia-expands-vehicle-import-ban-to-trucks-pushing-electric-transport

Ebikes are insanely great technology. Cheap, rugged and reliable, they're basically bicycles that abolish hills. Once you've gotten accustomed to an ebike – maybe you've invested in a folding helmet and a raincoat – you'll never go back. The advantages of an ebike commute over a car commute are legion, but my favorite little pleasure is the ability to easily make a stop at a nice coffee shop halfway between home and work, rather than being stuck buying shitty chain coffee near the office.

Four years ago, another mad emperor, Vladimir Putin, invaded Ukraine – and in so doing, catapulted Europe's energy transition into the Gretacene, with unimaginable defeats for the fossil fuel lobby. Not just subsidies for the clean energy transition, but also policy shifts in areas that had been deadlocked for a decade, like approvals for balcony solar, which is transforming the continent. Even the UK, one of the oil industry's most reliable vassal states, is now greenlighting balcony solar:

https://www.gov.uk/government/news/government-to-make-plug-in-solar-available-within-months

This may not sound like much, but the UK is a country whose politics is composed 50% hatred of migrants and trans people, and 50% incredibly stupid planning battles. Great Britain is a magical land where your neighbors can ask the government to prevent you from installing double-glazing on the grounds that it will change the "historic character" of their neighborhood of terraced Victorian homes.

I once lost a fight to get permission to put a little glass greenhouse on my balcony on the grounds that it would "alter the facade" of the undistinguished low-rise 1960s industrial building I live on top of. The fact that HMG is going to tell your facade-obsessed neighbors to fuck off all the way into the sun so that you can hang solar panels off your balcony is nothing short of a miracle.

Comrade Putin's contribution to oil-soaked Britain's energy transition can't be overstated. Thanks to "free market" policies that sent energy prices soaring after the Ukraine invasion, Brits installed so much solar (despite the existing impediments to solarization) that now the government is begging us to use more energy this summer, because the grid can't absorb all those lovely free electrons:

https://www.theguardian.com/environment/2026/apr/14/uk-households-power-renewables-soar

The UK is on a glide-path to adopting the Australian plan. Australia also benefited from Trump I's solar embargo, receiving a ton of cheap solar that would otherwise have ended up in America. Now Australia has so much solar that they're giving away electricity, with three free hours of unlimited energy every day. Stick your dishwasher, clothes-dryer and EV charger on a timer, invest in a battery or two, and fill your boots:

https://billmckibben.substack.com/p/free-electricity-like-at-no-cost

(Maybe at this point you're thinking dark thoughts about critical minerals and such. That's not the problem you think it is and it's getting better every day. To take just one example, lithium batteries are about to be replaced with sodium batteries. Sodium is the world's sixth-most abundant element:)

https://www.livescience.com/technology/electric-vehicles/china-puts-a-sodium-ion-battery-into-an-ev-for-the-first-time-it-can-drive-248-miles-on-a-single-charge

The Strait of Epstein crisis is going to do more to accelerate permanent, unidirectional migration away from fossil fuels to cleantech than decades of environmental activism. Cleantech is so much better than fossil fuels – cheaper, more reliable, cleaner – that anyone who tries it becomes an instant convert. That's why the fossil fuel industry has been so insistent that no one get to try it!

To take just one example here: Texas ranchers have been solarizing, thanks to the state's bizarre "free market" energy system that sees energy prices spiking so high during cold snaps that you literally have to choose between freezing to death and going bankrupt. Solar is great for agriculture, especially in climate-ravaged Texas, where it provides crucial shade for crops and livestock, while substantially reducing soil evaporation, resulting in substantial irrigation savings.

When the oil-captured Texas legislature introduced a bill to force electric companies to add one watt of fossil power for every watt of solar that their customers installed, furious ranchers from blood red Republican rural districts flooded their town hall meetings, decrying the plan as "DEI for fossil fuels." The bill died:

https://austinfreepress.org/renewables-are-now-the-costco-of-energy-production-bill-mckibben-says/

This is the template for the long-foreseeable future. Thanks to Trump's stupid, bloody, unforgivable war of choice in the Gulf, the world is going to install unimaginable amounts of cleantech. They are going to throw away their water heaters, motorbikes, furnaces and cars and replace them with all-electric versions. They're going to cover their roofs and balconies with panels. The battery industry will experience a sustained boom. The fortunes that fossil fuel companies are reaping from the current shortage is their last windfall.

The writing is on the wall. Trump opened Alaska for drilling and the oil companies noped out because they couldn't find a bank that would loan them the money needed to get started. Then it happened again in Venezuela. This de-fossilizing was already the direction of travel, the only question was the pace at which the transition would proceed – and Comrade Trump has just stomped all over the (liquid natural) gas pedal.

Energy is just one realm where Trump is doing praxis. One of the most exciting developments that Trumpismo's incontinent belligerence has induced is the global technology transition.

For decades, the only people pointing out the dangers of using America's cash-grabbing, privacy invading defective tech exports were digital rights hippies like me, and our victories were modest and far between. Despite the Snowden revelations, despite the tech industry's prolific snood-cocking at EU privacy regulators and Canadian lawmakers, we all just carried on using these incredibly dangerous, steadily enshittifying Big Tech products. We even run our governments and structurally important companies off Big Tech. We let US tech companies update (that is, downgrade) the software on our cars and tractors, our pacemakers and ventilators, our power plants and telephone switches.

There's lots of reasons for this. For one thing, ripping out and replacing all that software and firmware is a prodigious challenge, as is building the data-centers to host it for every "digitally sovereign" country. Add to that the complexity of successfully migrating data, edit histories, archives and identities and you're looking at a very big lift. So long as the American tech bosses kept their enshittificatory gambits to a measured, slow flow, they could keep the pain beneath the threshold where it was worth us boiling frogs leaping out of their pot.

But the most important force defending American internet hegemony was free trade: specifically, the US forced all of its trading partners to adopt "anticircumvention" laws that make it illegal to modify US tech exports. That means that you can't go into business selling your neighbors the tools to use generic ink or an independent app store, much less make a fortune exporting those tools to the rest of the world:

https://pluralistic.net/2026/03/16/whittle-a-webserver/#mere-ornaments

Enter Comrade Trump. When Trump started weaponizing US tech platforms to take away the working files, email accounts and cloud calendars of judges who pissed him off (by sentencing Bolsonaro to prison and swearing out a genocide warrant for Netanyahu), he put the whole world on notice that he could shut down their governments, judiciaries or companies at the click of a mouse:

https://pluralistic.net/2026/04/16/pascals-wager/#doomer-challenge

And of course, he's whacked the whole world with tariffs that violate the trade agreements that imposed those anticircumvention obligations that protect America's defective tech exports. Now there's no longer any reason to keep those laws on the books. Happy Liberation Day, everyone! The post-American internet is at hand:

https://pluralistic.net/2026/01/01/39c3/#the-new-coalition

But Trump has even more praxis up his spraytan-stained sleeves. Trump is succeeding where Bernie Sanders, Elizabeth Warren and AOC failed: he's making the case for Democrats to defenestrate their useless, sellout, Epstein-poisoned leaders. All across the country, radical Dems and avowed socialists are sweeping primaries and elections, as voters realize that Blue No Matter Who will doom them to eternal torment in the Manchin-Synematic Universe:

https://prospect.org/2026/02/11/progressive-win-new-jersey-anti-ice-organizing-mejia/

Fury over Trumpismo is pushing even the most useless Democratic leaders to sign up for billionaire taxes:

https://jacobin.com/2026/04/zohran-tax-rich-hochul-nyc

Thanks to Comrade Trump, the median Democratic voter will no longer be satisfied with Kente cloth photo-ops and little ping-pong paddles stenciled with "down with this sort of thing":

https://www.truthdig.com/articles/ping-pong-paddles-to-a-gun-fight/

Thanks to Trump, we might see criminal prosecutions – and a primary challenge for any Dem that gets in the way of a serious, Nuremberg-style reckoning with Trumpismo and its gangsters:

https://pluralistic.net/2026/02/10/miller-in-the-dock/#denazification

Look, all things being equal, I would have preferred that Trump had keeled over from a mid-burger stroke on the campaign trail in 2016. But when life gives you SARS, you make sarsaparilla. This is a deeply shitty timeline, but Comrade Trump keeps tripping over his red tie. Let's take the wins.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago The MPAA 'educates the public' with threatening letters https://web.archive.org/web/20120318060108/http://news.cnet.com/2100-1023-255961.html&amp;tag=tp_pr

#25yrsago Cuehack for the :CueCat https://web.archive.org/web/20010803172853/http://www.rtmark.com/cuejack/

#25yrsago Microsoft Technical Support vs The Psychic Friends Network https://web.archive.org/web/20010410171616/http://www.bmug.org/news/articles/MSvsPF.html

#20yrsago The novel Heinlein would have written about GW Bush’s America https://memex.craphound.com/2006/04/17/the-novel-heinlein-would-have-written-about-gw-bushs-america/

#20yrsago Hilarious hijinx with security guards who hate building-photographers https://thomashawk.com/2006/04/photographing-architecture-is-not.html

#20yrsago Hundreds ask Smithsonian not to sell out to Showtime https://web.archive.org/web/20060420031124/https://www.americanprogress.org/site/pp.asp?c=biJRJ8OVF&amp;b=1554385

#20yrsago How AT&T wants to turn the Internet into mere TV https://web.archive.org/web/20060620095643/http://www.salon.com/tech/feature/2006/04/17/toll/index_np.html

#20yrsago NOLA mayoral candidate doctors Disneyland photo – again https://web.archive.org/web/20060422010054/https://www.wonkette.com/politics/new-orleans/kimberly-williamson-butler-continues-to-astound-us-167923.php

#20yrsago Where He-Man came from https://web.archive.org/web/20060423061651/https://thesneeze.com/mt-archives/000500.php

#20yrsago FBI demand chance to censor muckracking journo’s papers https://web.archive.org/web/20060421045340/https://www.chronicle.com/free/2006/04/2006041801n.htm

#15yrsago Ethiopia’s “newspaper landlords” rent the want-ads by the minute https://www.cnn.com/2011/BUSINESS/04/19/newspaper.rental.ethiopia/index.html

#15yrsago It’s people like us what makes trouble: the pernicious influence of immigrants in the UK. https://web.archive.org/web/20080314013819/http://feorag.newsvine.com/_news/2008/03/10/1356131-the-pernicious-influence-of-immigrants-in-the-uk

#15yrsago China’s “Jasmine Revolution”: anonymous out-of-country bloggers troll the politburo https://web.archive.org/web/20110412063347/http://globalguerrillas.typepad.com/globalguerrillas/2011/04/the-jasmine-revolution.html

#15yrsago Motorcycles made from watch parts https://www.deviantart.com/dkart71/art/Motorcycles-out-of-watch-parts-18a-204941090

#15yrsago Steve Buscemi’s Eyes: the printable mask https://eyesuckink.blogspot.com/2011/04/free-home-version-of-steve-buscemis.html

#15yrsago Privacy, Facebook, politics and kids https://www.theguardian.com/commentisfree/video/2011/apr/18/cory-doctorow-networking-technologies-video?CMP=twt_fd

#15yrsago NZ MP votes for anti-piracy law hours after tweeting about her love of pirated music https://torrentfreak.com/kiwi-mp-called-out-as-pirate-after-passing-anti-piracy-law-110415/

#15yrsago Righthaven copyright trolls never had the right to sue, have their asses handed to them by the EFF https://web.archive.org/web/20110418001051/http://paidcontent.org/article/419-righthavens-secret-contract-is-revealedwill-its-strategy-collapse/

#15yrsago TSA considers being upset at screening procedures to be an indicator of terrorist intentions https://www.cnn.com/2011/TRAVEL/04/15/tsa.screeners.complain/

#10yrsago The saga of Ian Bogost’s pressure-washer https://bogostpressurewasherstatus.tumblr.com/

#10yrsago Heads of UK’s tax havens to Her Majesty’s Government: go fuck yourself https://web.archive.org/web/20160411112631/http://www.independent.co.uk/news/uk/politics/tax-haven-corporate-tax-avoidance-uk-ministers-humiliated-after-cayman-bvi-british-virgin-islands-a6974956.html

#10yrsago George Clooney’s neighbor threw a $27/plate Sanders fundraiser to counter Clooney’s $33K/head Hillary event https://www.nbcnews.com/politics/2016-election/sanders-supporters-shower-clinton-motorcade-1-bills-n557191

#10yrsago What is neoliberalism? https://www.theguardian.com/books/2016/apr/15/neoliberalism-ideology-problem-george-monbiot?CMP=twt_books_b-gdnbooks

#10yrsago No, tax-havens aren’t good for society (duh) https://web.archive.org/web/20160602053124/https://www.washingtonpost.com/opinions/five-myths-about-tax-havens/2016/04/15/76d001d2-0255-11e6-b823-707c79ce3504_story.html

#10yrsago John Oliver and the cast of Sesame Street on lead poisoning https://www.youtube.com/watch?v=GUizvEjR-0U

#10yrsago Supreme Court sends Authors Guild packing, won’t hear Google Books case https://arstechnica.com/tech-policy/2016/04/fair-use-prevails-as-supreme-court-rejects-google-books-copyright-case/

#10yrsago Four years later, Popehat’s favorite con-artist is indicted https://web.archive.org/web/20160419031946/https://popehat.com/2016/04/18/anatomy-of-a-scam-investigation-chapter-14-the-indictment/

#10yrsago Hacking Team supplied cyber-weapons to corrupt Latin American governments for human rights abuses https://www.derechosdigitales.org/wp-content/uploads/malware-para-la-vigilancia.pdf

#10yrsago High profits mean capitalism is cooked https://www.promarket.org/2016/04/16/are-we-all-rent-seeking-investors/

#10yrsago A look back at the D&D moral panic https://www.nytimes.com/2016/04/18/us/when-dungeons-dragons-set-off-a-moral-panic.html

#10yrsago Petition to reassign head of Canada Post to deliver letters at $500k/year https://www.ipetitions.com/petition/help-canada-post-ceo-deepak-chopra-keep-his-job

#1yrago Mark Zuckerberg personally lost the Facebook antitrust case https://pluralistic.net/2025/04/18/chatty-zucky/#is-you-taking-notes-on-a-criminal-fucking-conspiracy


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Reverse-Centaur's Guide to AI," a short book about being a better AI critic, Farrar, Straus and Giroux, June 2026 (https://us.macmillan.com/books/9780374621568/thereversecentaursguidetolifeafterai/)
  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2026

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027

  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing: "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Third draft completed. Submitted to editor.

  • "The Reverse Centaur's Guide to AI," a short book for Farrar, Straus and Giroux about being an effective AI critic. LEGAL REVIEW AND COPYEDIT COMPLETE.
  • "The Post-American Internet," a short book about internet policy in the age of Trumpism. PLANNING.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

18:00

How did code handle 24-bit-per-pixel formats when using video cards with bank-switched memory? [The Old New Thing]

On the topic of what happens if an access violation straddles multiple pages, Gil-Ad Ben Or wonders how code handled 24-bit-per-pixel formats when using video cards with bank-switched memory. “The issue is that since 64k bytes is not divisible by 3, and you usually need a pixel granularity if you aren’t using some kind of buffering.”

This is referring to an older article about the Windows 95 VFLATD video driver helper which emulated a flat video address space even though the underlying video card used bank-switched memory by mapping the active bank into a location in the address that corresponds to its emulated flat address, and responding to page faults by switching banks and moving the mapping to the emulated flat address of the new bank.

The trick falls apart if somebody makes a memory access that straddles two banks, because that leads to an infinite cycle of bank switching: The CPU raises an access violation on the first bank, and the driver maps that bank in and invalidates the second bank. But since the memory access straddles two banks, then the CPU raises an access violation on the second bank, and the act of remapping that bank causes the first bank to become unmapped, and the cycle repeats.

So how did code deal with pixels that straddles two banks?

The underlying rule is that all accesses to memory must be properly-aligned. No properly-aligned memory access will straddle a page boundary.

Managing this requirement was just the cost of doing business. People who wrote code that accessed video memory knew that they couldn’t use tricks like “read a 32-bit value and ignore the top 8 bits.” If you have a pixel that straddles a boundary, you’ll have to break it up into three byte accesses, or at least a byte access and a word access (where the word access is properly aligned). In practice, it’s not worth the effort to do the work to decide whether to split the pixel as byte+word vs. word+byte, and everybody just did it as three bytes.

Now, if you were operating on an entire row of pixels, you could use aligned 32-bit reads and writes to access the entire row: Copy bytes until the address is 32-bit aligned, and then use 32-bit reads for the bulk of the row, and then copy any leftover bytes at the end. The 32-bit reads will straddle pixel boundaries, but that’s okay because they don’t straddle page boundaries.

In other words, the answer is that they handled it by handling it.

The post How did code handle 24-bit-per-pixel formats when using video cards with bank-switched memory? appeared first on The Old New Thing.

16:56

Have You Eaten? Part 1: Daneka’s Birthday [Original Fiction Archives - Reactor]


Fen’s Mom’s Chicken Pot Pie

Crust (2 batches)
2½ cups flour
Pinch of salt
1 cup butter
6 tablespoons water

Filling
3 stalks celery, chopped
1 onion, diced; or 1 can pearl onions, drained and rinsed
2 tablespoons butter
2 tablespoons flour
4 cups chicken broth
1 teaspoon onion powder
1 teaspoon garlic powder
1 tsp chopped fresh sage
Pepper
1 bag mixed frozen peas & carrots
2 chicken breasts, roasted and shredded
Salt

Instructions

Make the Crust

  1. Combine the flour and the salt. Add the butter and mix with your hands until small crumbs are formed.  

  2. Add in water 1 tablespoon at a time, mixing with your hands to form dough. 

  3. Chill for 1 hour. 

  4. Preheat oven to 375 degrees. While it’s heating, divide the dough in half. Roll out each half separately. Set one aside, and place the other in a floured and buttered pie pan. Poke the bottom several times with a fork to release steam during cooking.

  5. Bake blind for 15 minutes.  


Make the Filling

  1. In a nonstick skillet over medium heat, sauté the celery and chopped onion if using. Salt to taste. When vegetables have just begun to soften, set aside.

  2. In the same skillet, heat the butter over medium heat until it stops bubbling. Add the flour and whisk thoroughly until there are no lumps. Stir until golden brown.

  3. Add the chicken broth to the pan. Whisk thoroughly until well-combined. Add the onion powder, garlic powder, sage, and plenty of black pepper. *Do not salt at this stage; since the broth will be thickened into gravy, the risk of oversalting is high.
  4. Add the cooked vegetables, the frozen vegetables, and the pearl onions if using. Stir to combine.
  5. Simmer until the sauce thickens into a gravy.
  6. Remove from the heat and stir in the shredded chicken.

  7. Pour the filling into the blind-baked crust. Top with the rolled-out unbaked crust. Cut slits in the top to vent steam. Bake until golden and flaky on top, 35–45 minutes.


Optional: Instead of pie crust, bake under a layer of biscuits. Double the filling recipe to fill a 9×13-inch pan.


It’s Daneka’s birthday, so everyone in the squat is being quiet and trying not to make eye contact with each other. The problem is that everyone’s known for weeks that Fen is worried about Daneka. At first they all rolled their eyes at Fen—people go missing all the time, and worrying over that is as useless as paper money. Then they tried to get her to snap out of it, because Fen’s the one who makes decisions and plans, and her anxiety over Daneka has been occupying her mind so thoroughly that she hasn’t been deciding or planning anything.

Now, after weeks with no Daneka and no word from her either, everyone in the squat privately shares Fen’s suspicion that something bad has probably happened to their friend. Nobody wants to be the first to say something, though, so they’re all finding reasons to be on their palmsets, reasons to look out the window, reasons to attend to their least-favorite chores.

Fen isn’t making it easy for anyone to speak up, anyway. She’s not talking about her feelings. Four months ago, she overheard Quan calling her a “neurotic clinger.” Quan didn’t know she could hear him—she had just walked into the room and was standing right behind him, like in that movie everyone in the squat makes fun of but hasn’t seen. He said it in a mean way, even though he’s not a mean person, except when he sort of is. And she wasn’t supposed to hear, but she did.

She sort of melted off into her bedroom after that. When Morrow checked in on Fen later she made all the right noises about understanding that she needs to manage her anxiety and Quan’s mastery of incisive languagebut still, damn, it must have stung to hear. Since then, Fen’s been “managing her anxiety” by quietly vibrating, crying when she thinks nobody can hear her, and saying nothing about her feelings to anyone, ever.

Her silence isn’t keeping her secret, though. The housemates know each other even better than they know hunger, and they all recognize the signs of Fen’s worry. Her lips are ragged from chewing. She keeps asking thinly anonymized questions like, Do you think people have responsibility to each other? and, How would you handle it if a friend suddenly grew really distant? Every time anyone catches a glimpse of her palmset, she’s looking at Daneka’s profile, refreshing over and over again, her eyes locked on the location status that hasn’t updated in a month.

At first, Harper told her that some people thrive on independence in relationships. At first, Morrow told her that it probably had nothing to do with her. At first, Quan told her that she could talk to him if she was freaking out about something, but she responded with a patently forced smile and said that she was fine, and then Quan spent the rest of the day asking Harper and Morrow if he’d done anything to upset her because he still didn’t know she’d heard the thing he’d said about her in the first place.

And now it’s Daneka’s birthday, and Daneka still hasn’t come home or answered anyone’s private messages, and everyone is just as worried as Fen’s been for weeks but nobody wants to say so because that would mean admitting that Fen was right all along, and then they’d have to try to figure out what to do.

Fen is usually the one who figures out what to do.

Around noon, a patrol car passes the squat. Quan watches it through a gap in the boards that cover the windows. Once the car has passed out of sight, he lets out a short sharp sigh, slaps his thighs with both palms, and shoots to his feet. His square jaw is set, his thick brows furrowed, his slim fingers balled into fists. “Okay,” he says. “Where the fuck’s Fen?”

“Kitchen,” Harper answers from the floor, where they’re using their fingers to fill a gouge in the laminate with a mixture of sawdust and wood glue. Their dark scalp-stubble grows in continent-like patches around old burn scars on their scalp. The scars are from their life in Old Chicago, which no one in the squat makes the mistake of asking about. Harper isn’t a leader in the same way Fen is, but they could be if they were less irritable about other people needing things and making noises about it. “Step careful. Glue’s drying.”

Quan obeys, tiptoeing past the collection of cushions and camp chairs that Harper’s stacked against the wall to make room for this needlessly intense project. He makes his way to the kitchen and finds that Harper was right: there’s Fen, red-eyed and purse-mouthed, clutching a potato and staring into the nearly bare cupboard.

“You freaking out or what?” Quan asks, looking into the cupboard too so Fen won’t feel like her tears are being noticed.

“No,” she answers, her voice too wobbly to stick the landing. She twists her neck to wipe her nose on the shoulder of her cardigan. The movement makes one tight-coiled curl fall across her forehead. “A little worried that they might finally turn off the electricity this month.”

“Any reason to think that might happen, or are you getting upset over nothing?”

“Probably the second one,” Fen answers, not too defensively. “It’s just. You know. At some point the developers that own this block are gonna remember that this house exists, and we should have a plan for what to do when that happens.” She closes her eyes, takes a long slow breath. “But we’ll deal with it when we get there. What about you? How’s your day so far?”

Quan lets out a dry laugh. “Not great. I’m worried about Daneka.”

Those last four words strike Fen like a match. She explodes with relief. “Oh my god, me too. Where the hell is she? Wait, I mean—no,” she stammers, her face crumpling as she tries and fails to reel her words back, to reconfigure herself into whatever well-managed anxiety is supposed to look like. “It’s fine that she’s gone. I’ve just been wondering why she hasn’t come home, I guess? But it’s fine that she hasn’t.”

Quan opens the refrigerator and pulls out a celery bunch that’s as limp as yarn. “No, like, I’m worried too. She’s been gone for a month, that’s not normal. And she hasn’t messaged you at all?”

“Not at all,” Fen replies. “I haven’t been messaging her that much or anything, just a couple of ‘thinking of you’ taps. She did a thumbs-up react but I don’t know what that means, and—”

“That doesn’t mean anything.” Quan whacks the listless celery against the quartz counter, which is still marked at the edges with wax crayon where the flippers who abandoned this house had planned to cut it. “I think we should call a house meeting.”

Morrow comes thudding down the hall, their heavy boots loud on the gray laminate. Morrow’s body takes up space—they’re built like a fridge, if a fridge could work out—but their voice hides in the back of their throat. “Are, um. Are you guys talking about Daneka?”

“Shoes, asshole,” Harper yells from the living room.

Morrow sits down on the floor immediately and starts undoing their laces. “Sorry. Did someone hear from her?”

“I can’t hear you,” Quan says. “Nobody can fuckin’ hear you.”

“Quan’s worried,” Fen adds. “About Daneka.”

Morrow exchanges a significant glance with Quan. “Okay, well, I mean. It’s just that. You know. I think Quan’s right to be worried. It’s weird that we haven’t heard from Daneka, and—”

“I’ve heard from her,” Harper calls, looking up from their work on the floor. “Thumbs-up react on my last message.”

“That doesn’t mean anything,” Fen says, earning raised eyebrows from Harper. “You know what? I’m just gonna call her.” She pulls her palmset out of her back pocket and unfolds it, hesitates briefly, looks up, realizes everyone is watching her and she can’t change her mind now—and dials.

The tritone sound of the call going through cycles twelve times before the call drops.

“That’s fine,” Fen says weakly. “I’ll message. She’s probably away from her palmset, she’ll see when she gets back to it.” She swipes out a message, saying the words as she traces them across one quadrant of the screen. “Should . . . we . . . expect . . . you . . . for . . . dinner. There.” She folds her palmset back up before tossing it onto the counter and turning to her housemates. “I’m making chicken pot pie. It’s her favorite. If she shows up, we can have a birthday party. If not, we’ll just eat it without her.”

Morrow grabs the counter and uses it to pull themself upright. They stare at Fen, their dark eyes wide with disbelief. “Wait, for real? You know how to make chicken pot pie?”

“No she doesn’t,” Quan snaps. “When’s the last time you think Fen got her hands on meat? Be serious.”

Fen ignores him, pulling a scratched wooden box off the top of the fridge and answering Morrow without acknowledging Quan at all. “I stole my mom’s recipe box when my folks kicked me out. I know how to make all her recipes.”

“Nice,” Harper says. They jog to the kitchen and dip a rag into the washwater basin, then start scrubbing gluey sawdust off their thumb. “Where d’you think Daneka is?”

“That’s not any of our business,” Fen answers, reaching deeper into the cupboard than she probably needs to.

“Is too,” Harper replies, scowling.

Fen goes still, her head between the shelves. “Really?”

“Course.” Harper runs a hand over their scalp. They sigh. “She’s part of our family. Fuck’s sake, she lives here. And yeah, she drops off the map from time to time. But that’s a few days at a stretch. She’s usually sending videos and posting stuff. And messaging us. Anyone gotten any actual messages?” They wait for everyone else’s headshakes to confirm before continuing. “So.”

And then Morrow whispers the thing nobody’s wanted to say, the thing Fen’s been thinking for twenty-eight days. “What if . . . she got picked up?”

“We’d know,” Quan says immediately.

“How?” Harper’s bony shoulders snap up around their ears. “How would we know, Quan? You think they still let people make phone calls?”

“What about the thumbs-up reacts?”

“Those don’t mean anything,” Harper snaps. “When’s the last time you saw Daneka go quiet on socials?”

Everyone stops to think. “Last time she got picked up,” Quan finally admits. “She was waiting at a drop-off point for a delivery for the three of us—me and her and Fen, I mean.” He nods to Fen, who finally extracts herself from the cupboard, her face drawn. Back before Fen and Quan and Daneka met Harper and Morrow, the three of them had been their own little trio. Moving from place to place, following rumors about reliable, affordable hormones and welcoming communities. “The seller was an undercover. He snatched Daneka for like a week. She didn’t post or message the whole time.”

“Did she send reacts?”

“Hearts,” Fen whispers, remembering. “She told us later that the cop took her palmset so he could go through her messages and contacts and stuff.”

“So. Thumbs-up reacts don’t mean shit,” Harper confirms.

Morrow steps on the loose toe of one sock, his eyes fixed on the floor. “Okay, but also, she came home after she got picked up that time, right? So she’ll probably come home this time, too.”

It’s Fen and Quan’s turn to exchange a loaded glance. “That was in Santa Cruz,” Quan says slowly.

Morrow, who lived their whole life just up the freeway in Redding, hoists themself up to sit on the counter. The quartz creaks under their weight. “Is it bad there?”

“Nah,” Quan says. “They’ll pick you up for indecency or gender impersonation or whatever, but they don’t process you most of the time. They just take your money if you have any. It’s . . . it’s not like here,” he finishes, his eyes on his hands, his voice uncharacteristically soft.

Everyone startles when Fen drops the entire potato bin onto the counter. Her eyes are dry, her scar-notched brows set. “Daneka will be here,” she announces.

This is the Fen they’ve all been missing. This is her determined face, the one she wears when she’s deciding to create reality from scratch. It’s the face she wore when she and Quan and Daneka first met Morrow—Fen decided they’d all live together, even though Morrow had just tried to mug them. It’s the face she wore when they broke into this squat through the front door and found Harper breaking into it through the back door. And it’s the face she wears as she informs the other three housemates present that she will be making a birthday dinner, that Daneka will show up to eat it, and that they’re all going to help in the meantime.

“You,” she says, pointing at a startled Morrow. “Sort these potatoes.”

Morrow eyes the potato bin dubiously. “By . . . size?”

“By sprouts. We can probably eat all of these since none of them are green, but the ones with really long sprouts might not be good. Look into my eyes, Morrow,” she says, and she waits for their big dark eyes to meet hers. “We aren’t risking it with any rotten food today. Okay? I mean it. Not for Daneka’s birthday.”

Morrow nods and picks up a potato with one huge, gentle hand.

“And you,” Fen says, wheeling on Quan and brandishing the sagging celery stalks he’d idly removed from the refrigerator a few minutes before. “Figure this out.”

Harper stands on the other side of the kitchen counter, their arms folded. “Guess the boss is back.”

Fen regards them with bristling determination. “You’re coming shopping with me.”

The two of them go out through the back door and cross the crunchy brown grass of the back lawn. Harper boosts Fen over the gate in the back fence, which is white vinyl stamped to look like wood and doesn’t open from the inside. Once Fen is on the other side, she thumbs the code into the keypad and eases the gate open.

“Should fix that thing,” Harper says as they pass through the gate onto the community path, their eyes flicking down to the busted keypad on the inside of the fence. It looks like someone took a hammer to it.

“Good luck,” Fen replies. “Sorry, that sounded bitchy. I really mean it. You’re good with electronics.”

Harper snorts. “Sure. Hey, do you think—”

“I don’t want to talk about Daneka,” Fen interrupts.

“I wasn’t going to ask about Daneka. I was going to ask if you think that’s fennel or dill,” Harper says, pointing at a frondy green that’s growing a couple of feet off the path. This trail was a jackpot find they discovered a couple of weeks after settling into the squat: a poorly maintained ribbon of asphalt that stretches behind two miles of houses, terrible for jogging or riding a bicycle but perfect for foraging, especially when it comes to plants that like to jump fences from hobby gardens out into the world.

Fen rubs a frond, then lifts her fingers to her nose. “Fennel,” she says, grinning. “What do you think, take the bulb or just cut a couple stalks?”

“Stalks,” Harper answers, pulling a box cutter out of their back pocket. They trim off a couple of stalks of fennel. The licorice smell perfumes the air around them. “And you’re lying.”

“What?”

“You’re lying. You want to talk about Daneka.” Harper waits while Fen pulls a crumpled plastic grocery bag out of one pocket, then drops the fennel stalks into it.

Fen starts walking. Her strides are long, her pace quick—Harper has to move fast to keep up. “I’m just worried about her, is all.”

“Pissed at her, more like. Hang on. Mint.” They stoop to rip up a few fistfuls of the mint that grows in patches all along the trail, then use the blade of their box cutter to dig out a hank of it with the roots intact. “I read that if you plant this stuff in your yard, it’ll grow everywhere. We can replace that crusty lawn.”

“You think we’re going to stay in the squat long enough for it to matter?”

“Been six months already,” Harper says. “Might stay.”

“Sure,” Fen says, her eyes darting to either end of the trail. “The thing is, okay, I’m not pissed at Daneka. I’m just—if she’s not missing, then yeah, I’d feel some kind of way about it. But I’m not pissed yet, because we don’t know if she’s missing or just being an inconsiderate asshole. If she’s missing, I don’t want to be pissed at her, I want to be worried. But I’d rather be pissed.”

Harper shrugs. “Could be both. Missing and an asshole.”

“Don’t. Don’t joke like that.” Fen stalks ahead for a few minutes, until they reach a spot where they’d found wild onions once. She tucks her pants into her socks before stepping off the trail to slowly pace in a circle through the grass, looking for the tall green stalks of an allium. “I don’t know what we do if she doesn’t come home. Do we go try to find her? Get her out?”

“No,” Harper says immediately. “Too dangerous.”

Fen stoops and tears out a fistful of grass, runs her hand along the dirt. “Maybe just me and Quan,” she mutters. “If you and Morrow don’t give a shit.”

“We give a shit. But you two getting yourselves snatched won’t help Daneka. There,” they say suddenly, pointing to a spot just behind Fen.

The onions are puny, their tops scraggly, but Fen still beams with triumph. “See?” she says, brandishing the onions. “It’s gonna be great. We’re already most of the way there.”

They visit the overgrown rosemary hedge, waving away half-drunk bees to snap off a few stems. They harvest a couple of handfuls of pealike seed pods from a thatch of bolted arugula, stepping over the papery white flowers that litter the path around it. Fen crows at the sight of what looks like garlic or maybe a shallot and digs it up, only to find a snotty hunk of black rot where the papery bulb should be. As she’s swearing and wiping her hands on her jeans, though, Harper spots another, and this one turns out to only be half-rotted.

“Yes yes yes,” Fen whispers, slicing the rot away with Harper’s box cutter.

Harper eyes the rot that’s falling away. “That gonna be good?”

“Not even a risky one,” Fen confirms. “We’ve eaten way worse.”

“What else do you need?”

“Um.” Fen pauses, closes her eyes. “Carrots. Flour. Butter. We have salt, right?”

Harper thinks. “Yeah, Morrow grabbed a bunch of packets last time we got burgers. How much flour? Would cornstarch work instead?”

“Maybe? Oh, and we need chicken.”

They both laugh. “I’ll grab the first one I see,” Harper says.

They walk the rest of the path and they don’t find carrots, just a lot more mint, some marjoram, and a stray cat that puffs up his tail at them. As they head home, Fen slows her pace. “Harp, are you mad at me?”

“Nah. But I should be.”

Fen nods. She trusts Harper because of answers like this one. “How come?”

Harper stops walking, waits for Fen to turn and face them. They take a deep breath and fold their arms across their chest. The sun falls in gold dapples across their freckled shoulders. They regard Fen irritably, the way they always do when they’re figuring out how to say a thing that they think should go without saying. “Because,” they say at last, “you dropped us.”

“I—what?”

“You dropped us. You’re the one in charge. You make the decisions, you boss everyone around, you decide what the day’s gonna look like. But you got worried about Daneka, so you stopped. Where do you think Morrow went today?”

Fen shrugs. “Out?”

“They went to the coffee shop,” Harper snaps, jutting their head forward. “To see that barista they keep flirting with. Because you weren’t paying attention enough to notice that Morrow hasn’t clocked how the coffee shop is a cop joint, so you didn’t tell them not to go.”

“You could have told them not to go,” Fen mutters.

Harper narrows their eyes. “I did. But Morrow doesn’t listen to me the way they listen to you. Which you know. But you’ve been in your feelings, so you decided someone else could handle the shit you usually handle, and now we gotta figure out if Morrow got followed home by a uniform.”

 Fen shook her head. “I’m not in charge of—”

“The fuck you’re not. Take responsibility for your vibe, Fen. Either we can count on you or we can’t. Which is it?”

The two of them glare at each other. A cricket starts to sing the late afternoon down into dusk. Fen breaks first, huffing out a sigh as she looks away.

“I’ll think about it,” she says at last.

Harper nods. “I know.”

When they get back to the house, the potatoes are lined up on the counter, in order from one with no sprouts to one with four-inch-long ones. The celery is floating in a bowl of water, looking significantly sturdier than it had just an hour before. Morrow and Quan are hovering over the sink.

“Hey kids,” Harper says, dropping the now-full bag of produce onto the counter. “Whaddaya got there?”

Morrow turns around, grinning and holding up what looks like a wad of white gum. “Butter!”

Fen’s jaw drops. “You’re joking. Where did you get butter?!”

“They made it,” Quan says. He sounds like he doesn’t believe the words he’s saying.

“I learned how when I was a kid,” Morrow explains, dropping their tiny palmful of butter onto a plate on the counter. “It’s easy. You, um.” Their ears are going red from the combined attention of the other three. “You just put some cream in a jar and shake it a thousand times, then pull out the solid stuff and wash it in cold water. Is this gonna be enough?”

Harper picks up an old peanut butter jar that has a couple of inches of cloudy liquid in it. “Ew.”

“That’s buttermilk, save it,” Fen says quickly. “Morrow, where the fuck did you get cream?”

“The guy at the coffee shop down the road. Me and Quan ran over there after I finished sorting the potatoes. Dude only charged us a dollar for a pretty decent pour. I thought, maybe we could invite coffee shop guy over sometime and—”

“We won’t be doing that,” Quan says frankly, “but hey. How do you like that, Fen? Butter?”

Everyone turns to Fen. She’s holding the plate of butter, her eyes welling with tears. “I like it,” she whispers. “Thank you, Morrow.”

“I helped,” Quan mutters.

Fen’s palmset, still sitting where she left it on the counter an hour and a half earlier, chimes.

Everyone freezes. Morrow reaches for the palmset but Harper slaps their hand away.

Quan puts a hand on Fen’s shoulder. “Do you want to look at it?”

Fen shakes her head, then nods, then shakes her head again. “Do you still have the cornstarch in the bathroom? From when you were doing liberty spikes in your hair?”

“Uh, yeah.” Quan blinks a few times. “Do you need it?”

Fen picks up a potato, not looking at Quan at all. “Yeah. Can you grab it?”

“I guess.” He heads down the long hall to the bathroom on the other end of the house, looking over his shoulder at her every few steps.

Once he’s out of sight, she pounces on the palmset. There’s a message from Daneka.

I’ll do my best!

“What does that mean?” Fen whispers to herself.

Harper leans closer. “What’s it say?”

“Nothing.” Fen folds the palmset shut.

“Well. What do you mean, though? What’s nothing? Was it from Daneka?” Morrow wipes their buttery hands on their jeans and reaches one long arm across the counter for the palmset again.

“Yes.” Fen jams the handset into her pocket. Her eyes flick up toward the hall, where Quan is returning with a crumpled bag of cornstarch. “But it wasn’t anything. Who wants to wash all this marjoram?”

For the next hour, Fen steers the four of them through a recipe. Quan and Morrow work together to clean all the vegetables. By the time that’s done, Fen’s got water boiling on the hotplate. She boils all the usable potatoes, then uses the potato water to reconstitute some chicken powder into a cloudy broth. Harper pulls the celery out of its bowl of water to discover that it’s more or less revitalized; they chop that and the fennel stalks while Fen dices the wild onion and garlic they found.

Quan is playing lo-fi beats on his palmset, and Morrow is mumbling lyrics to go with the beats, and they’re all laughing hard enough that they almost don’t hear it when Fen’s palmset chimes again. She tosses the garlic and wild onion into a skillet on the hotplate before pulling it out of her pocket and unfolding it.

Harper looks over her shoulder. “Fuck,” they whisper.

“What’s up?” Quan looks up from the playlist he’s curating. “Fen? You okay?”

“I’m fine,” Fen says. Her voice is perfectly flat. She folds the palmset back into her pocket, then takes up the wooden spoon next to the skillet and gives the onion a stir. “Harper, can you throw the celery in here for me? Quan, Morrow, go pack your stuff and charge your palmsets. Use the rapid charger in the living room.”

Morrow furrows their brow. “Didn’t you say the rapid charger is a fire hazard? Or is it—”

“She’s right. We gotta go. Hurry,” Harper says. “We should pack too,” they add in an urgent whisper after Quan and Morrow have gone.

“In a minute,” Fen replies. “I want to finish this.”

“Fen—”

“In a minute,” she says again, her voice steady and certain the way it was before Daneka went missing. The way it’s always been. “Carrots?”

“We didn’t find carrots,” Harper reminds her softly. “You want the fennel, though?”

Fen closes her eyes tight, bows her head. Lets out a teakettle hiss of curses. When she looks back up and meets Harper’s eyes, her gaze is flat. “Will we stay together? Do you want to stay with us, I mean? You don’t have to.”

Harper draws her into a tight hug. “I don’t know. Let’s figure that out in the morning, yeah? Right now, I’m gonna go pack up my stuff and charge my palmset. Want me to get yours too?”

Fen nods. “I want to finish cooking this for Daneka. Just in case.”

Harper taps the recipe box on the counter as they leave the kitchen. “Don’t forget this.”

After Harper disappears into the living room with both their palmsets, Fen lets herself cry. Just for a few seconds. A couple of sobs, a spill of hot tears, that’s all.

Then she adds the chopped fennel stalks to the skillet. When the fennel is bright green, she pours the chicken broth into the pan and lets it boil for a few minutes. It’s already thickening a little thanks to the potato starch in the water, but she adds some of Quan’s cornstarch too, stirring fast until it makes a thick gravy. She adds marjoram and rosemary since she doesn’t have any sage. She smashes the potatoes, stirs in chicken powder and Morrow’s butter, adds a few salt-and-pepper combo packets from Morrow’s stash.

“Okay,” she whispers to herself as she lets the potatoes heat just a little longer, to get any last water out. “Finish it. Move on. Work to do.”

She can hear Quan and Harper trying to figure out how to fit her sweaters into her backpack. They won’t figure it out on their own, she knows, because they don’t know how to roll sweaters up tiny. She’ll go help them in a minute, but first, she scoops mashed potatoes into a paper bowl and uses the back of a spoon to spread them in an even layer. She pours vegetables and thick gravy on top, then covers those with another even layer of mashed potatoes. With the back of the spoon, she smooths the top down, then carves lines into the center of the layer to look like the slits in the top of a piecrust.

Quan comes into the kitchen, his backpack rising up over his shoulders like a turtle’s shell, and eyes the steaming bowl on the counter. “It’s smaller than I thought it’d be,” he says. “Good thing there’s only three of us. Are there clean spoons?”

Fen’s eyes snap up to him. Her face is blazing with barely restrained fury. “Don’t fucking touch it,” she says in a low, dangerous voice. “This is for Daneka.”

He frowns at her. “Chill. Daneka’s not here. Are you telling me we’re not going to eat this just because she got—”

“She’s going to be here,” Fen says. “And she’s going to be hungry when she gets home. We’ll eat on the road. Get moving.”

Quan looks like he’s about to protest, but then Morrow comes into the kitchen and smiles down at the bowl on the counter. “Daneka’s gonna love it,” they murmur. “Good job, Fen.”

“Are you serious?” Quan snaps. “You don’t want to eat it either?”

Morrow looks at him with open bewilderment. “It’s Daneka’s birthday. We’ll figure something else out.”

The four of them are out of the house five minutes later.Harper turns the lights off and locks the back door. Morrow boosts Quan over the back fence to let them out through the gate.

Fen is about to ease the back gate shut, but she hesitates, her eyes locked on the dark house. She tells herself that she’s trying to remember if she left anything behind, even as she mentally runs through the list of items that she already knows she’s carrying on her back.

“Fen?” Quan whisper-yells from the darkness down the path.

The edge of the pressed vinyl creaks in her grip. She rises up on her toes, trying to see inside.

“Hey,” Harper hisses. “We gotta move.”

A light goes on inside the house.

Fen closes the gate. “Coming.”


Fen’s “Chicken” Pot Pie

Crust (2 batches)
6 potatoes
3 tablespoons butter
Chicken bouillon powder
Salt and pepper packets

Filling
2 handfuls arugula seed pods, chopped
3 stalks celery, chopped
2 fennel stalks, chopped
3 wild onions, diced
2 tablespoons cornstarch mixed w/ ⅓ cup water to form a slurry
4 cups chicken broth
4 cloves garlic, chopped
1 teaspoon chopped fresh marjoram/rosemary
Pepper

Instructions

Make the “Crust”

  1. Boil the potatoes. Drain, reserving the potato water.
  2. Smash the cooked potatoes until smooth.
  3. Add butter, chicken bouillon powder, salt, and pepper to taste.

Make the filling

  1. Add chicken powder to the potato water to make broth
  2. In a nonstick skillet over medium heat, sauté the celery, onion, and garlic. Add the fennel and sauté until bright green.
  3. Add the chicken broth to the pan. Add herbs. Simmer 3–5 minutes.
  4. Add cornstarch slurry and whisk thoroughly to thicken.

Assemble

  1. Line a bowl with a thick layer of mashed potatoes. Add filling, then top with mashed potatoes and sculpt into a crust shape. Optional, if there’s time (there’s not): toast the mashed potatoes on top with a hand torch.

A recipe card, typewritten on an index card, stapled to a torn sheet of notebook paper with a typewritten recipe on it. Both are weathered, torn, stained, and annotated. The card is on top of a stained white kitchen towel, next to a couple of burned and repaired wooden cooking spoons, some onion and lemon scraps, a scattering of rosemary, and a bent fork. Visible recipe text is as follows (all is typewritten unless otherwise indicated; see story text for recipe in full): Index card: Chicken Pot Pie (handwritten annotation reading “Mom’s”) Crust (2 batches) 2½ cups flour Pinch of salt 1 cup butter (handwritten annotation indicates these three ingredients should be mixed to form crumbs) 6 tablespoons water Filling 1 teaspoon garlic powder – handwritten annotation reading “or 1-2 cloves” 2 chicken breasts roasted and shredded Salt and pepper – hand-drawn arrow points up to the next column Filling continued 1 bag mixed frozen peas and carrots 1 onion, diced; handwritten annotation reading “or 1 can pearl onions” 3 stalks celery, chopped 2 tablespoons flour 2 tablespoons butter 4 cups chicken broth 1 teaspoon onion powder (Several typing errors are scribbled out; handwritten annotation reading “1 tsp chopped fresh sage”) The index card overlaps the recipe page. The recipe visible on the page is as follows: 5. Bake blind for 15 minutes. Make the Filling (handwritten annotation indicates to do this while the crust is cooking.) 1. In a nonstick skillet over medium heat, sauté the celery and onion. Handwritten note says “unless using pearl on.” Remove. 2. In the same skillet, heat the butter over medium heat until it stops bubbling. Add the flour and whisk thoroughly until there are no lumps. Stir until golden brown. 3. Add the chicken broth to the pan. Whisk thoroughly until well-combined. Add the onion powder, garlic powder, and plenty of black pepper. (Handwritten annotation reads “+ sage!”) 4. Add the cooked vegetables (handwritten annotation reads “^or 1 can pearl onions”) and the frozen vegetables. Stir to combine. Simmer until the sauce thickens into a gravy. Remove from the heat and stir in the shredded chicken.
 7. Pour the filling into the blind-baked crust. Top with the rolled-out unbaked crust. Cut slits in the top to vent steam. Bake until golden and flaky on top, 35–45 minutes.
 Below the recipe, a typing error is scribbled out. A handwritten note in different handwriting from the recipe annotations, in red marker, reads: “Happy birthday, D. Meet us @ the Rosemary Patch. Heart, MQFH”

The post Have You Eaten? Part 1: Daneka’s Birthday appeared first on Reactor.

The Plasticity of Being [Original Fiction Archives - Reactor]

Edilberto Santos takes three plastic bottle caps from the teepee fire in front of him. He crumples their burnt remains together with a spatula, kneading them until they form a semi-solid, charred paste, their blue, red, and green mixing in an uninvited, incomplete rainbow. He whistles a joyful song while waiting for it to cool. I have things to say but I don’t interrupt him. After three minutes, he grabs a cheese grater and starts scraping the paste in it, sprinkling the flecks into a bowl. Finally, he scoops the floury mix with a rusty spoon and eats it. His eyes focus on the camera as he chews it. Some of the flecks catch in between his teeth. It doesn’t bother him. He’s used to it.

I glance down at my pad to escape Edilberto’s gaze. The next question is highlighted on the screen. How does it taste? Did I write those words? What was I thinking? São João da Campânula is not a damn reality show. It’s a landfill and it’s home for about forty families. A knot throbs in my chest as I cross through the question to erase it.

“Are you all right, Dona Elisa?” Edilberto asks. He’s missing a few teeth. His eyes droop over his sallow cheeks. I shrug and force a nod. What does it mean to be all right after seeing a man eating plastic?

I slide a finger over my pad so my cam-drone buzzes away from Edilberto, focusing instead on the trash behind him. A few people trudge through the paths that open like clogged veins amidst the heaps. A kid fetches something from the ground, giggling with a man beside him. A woman enveloped in a broad shawl carries a fat mesh bag. She selects an object in one of the heaps, yanks it out, and peeks at it. It’s a plastic bottle, cracky and sullied with the tan of corrosion. She throws it in her bag.

I open my backpack, pick a sandwich, and hand it to Edilberto. A sandwich. Of all the food I could’ve brought to São João da Campânula, I brought only a few sandwiches. Ham, cheese, butter.

Edilberto eyes the marmita with mild curiosity—a Tupperware box with a dog sticker on its side. He runs a finger over it. It’s the only one I brought from Mamãe’s home when I moved to Goiânia after our silent war started. She had that one since she was a child. She was five when she pasted that poodle there. Over the years, the box had stored a whole assortment of her most delicious food—Bolognese spaghetti, fried cod balls, chocolate pudding with strawberries, and scrambled eggs when she was in a hurry. The last time I tried to visit her, I brought pão de queijo in it. She didn’t touch them. Mamãe loved me for thirty-two years. However, over the past nine years she’s hated me. And she has a good reason for it.

“I’m not hungry right now, but thanks,” Edilberto says. “I can keep it for the others, though. Can I keep the box? It’s cute.”

“Yes, of course.” No hesitation. I don’t understand why. For Mamãe—and for me—it should be an heirloom. Perhaps by getting rid of her marmita, I’d be officially detaching myself from the woman I loved the most in my life. I peer one last time at the barking poodle sticker, its edges frayed and threatening to unstick. “Keep it, yeah…” Those last words falter, but they come out anyway.

Edilberto smiles at me. There’s sweetness in there. Despite the missing teeth, Edilberto doesn’t look like a broken man. Not like I pictured all those people—the plastikeaters, as some having been derogatorily calling them since they were “discovered” by the media. I’d thought of them as sad, gaunt wanderers, aimlessly looking for solace in the landfills near Mairipotaba. In my nightmares, before I fully compromised in writing a story about their lives, they came to me as dolls made of plastic, revenge cooking in their eyes but their hands wilted together in begging.

The aggression of burnt plastic slicks the air. Not only due to the bottle caps that Edilberto burned. It comes from all over the landfill. Here and there, smoky snakes writhe toward the sundown. I skim through the list of questions I didn’t ask Edilberto. How does it taste? Does it hurt to eat plastic? How is your diet? Which types of items do you prefer?

Instead, I look straight into his eyes. There’s a deepness in there, brewed in the sweetness, that I doubt my own eyes possess.

“This smell…” I hesitate, swirling a finger in the air. “It’s—What does it convey to you?” I think of fires, faulty electronics, problems. Of things going wrong.

“Which smell?—Oh! I barely notice it anymore. But it smells like dinner.”

The story of São João da Campânula started with the company called Verdidea.

Once upon a time, Verdidea was the future: the bastion of sustainability and green technology allied with social and environmental responsibility, a powerful Brazilian—then global—force to correct everything that was wrong with the world. And, indeed, they showed what they were all about. In a decade, their projects of reforestation employed millions of micro-drones in the Amazon rainforest, with tech that healed the damaged soil, planted new trees, and rescued animals during fires—all the time learning the patterns of what they were doing, so they could improve themselves over time and avoid catastrophes. In five years, they managed to recover 85 percent of the previously unrecoverable deforested area. Verdidea freed more than eight hundred rivers from industrial waste all around South America; they brought water to the driest parts of the sertão.

Once upon a time, working for Verdidea was the dream job from engineers to lawyers, from botanists to PR specialists like myself.

Verdidea truly wanted the world to become a better place. As long as the world was theirs.

The story of São João da Campânula also started with me. Once, ten years ago, I came as a PR specialist to write part of it. Now, two years after the company’s breakdown, I come as a freelancer journalist to rewrite it the best way I can.

“You can look to the camera,” I say to the woman, pointing to the cam-drone whirring in front of her. Behind her, a dog lolls on a chair underneath her wooden shack’s only window.

“I prefer not to.”

“That’s okay.” I slide a finger on my pad so the drone swivels to the side and avoids focusing on her face. “What’s your name?”

“Ângela.”

She’s a woman in her mid-fifties, brown skin, curly hair falling over her shoulders like waterfalls. She exhales a sweet scent of unnamed flowers, generic enough to fit anywhere, anytime. Next to her shack’s door there’s a cauldron filled with plastic bottles. On it, scrawled in big red letters: Pick yours, leave for others. A repurposed dresser lies next to it with five cheese graters, all shiny and clean, delicately covered with a transparent raincoat.

“Hi, Ângela. My name is Elisa Assunção. I’m a journalist and I’m working on a story about your lives. It aims to bring attention to the authorities and—”

“I know who you are.” I freeze. For a moment I think Ângela knows exactly the role Elisa Assunção played in her very existence. She waves her hand. “Your type always comes here, asking questions, giving us crumbs to nibble. Then you go away. You’re predators, that’s what I say.”

I agree. Brazil was shocked when the news about São João da Campânula broke in the headlines. Plastic-eating people living in landfill. A new kind of poverty sprouts in Goiás. In their prowl for answers—How can they survive? Is it a hoax? Where do they come from?—journalists and authorities came and went to the landfill as explorers, merely digging for stories and opportunities, never fully finding the answers, never providing ways out.

I, on the other hand, have the answers already. I’m part of them, so I come with all of them, not for them. Instead, I come for any shreds of redemption I can find in that place. Like Mamãe used to say, Don’t try to repair your mistakes all at once. Some of them you’ll just have to swallow.

“Ângela, do you have kids?”

“Um-hum.” She glares suspiciously at the cam-drone. I tap the OFF button on my pad and the drone slowly descends to the ground, its propellers shutting off and its LEDs powering down.

“Tell me about them.”

“That’s what you wanna hear? Won’t you talk about plastic? Your type loves to babble about plastic.”

“I just want to hear about your kids.”

First, she gives me what I deserve: silence. Then, she gives me the stories of Mariana, Rogério, Adenilson, and Cleiton, of how they walk fifty minutes to school every day. She tells me how they find toys in the landfill and how she has to carefully select what isn’t dangerous for them. She tells me how she loves a man called Jango, who lives in a shack in the eastern border of the landfill, of how she found brand-new canvas sneakers just lying around, green and yellow with black stripes, perfectly fitting on her feet. The only thing I type on my pad is the cornmeal cake recipe she dictates to me, which she only prepared twice in her life because she never has the ingredients.

In the end, she tells me she’s grateful for that “Verde-something company” because her kids never learned what it meant to starve.

The enzyme was a breakthrough. It took only one year to go from plastic-gobbling bacteria to plastic-digesting isopods. Verdidea’s name stamped every front page around the world. The Great Pacific garbage patch was being exorcised from its plastic by isopods at a rate never before imagined. Microbes carrying the enzyme were spread throughout landfills in Brazil, Argentina, and Colombia. It brought awareness and funding for bioplastics research, decreasing its costs of production. The video of a girl snickering and lowering a plastic soda bottle into a pool of isopods went viral for months.

When Mamãe saw the news, she was washing a plastic bowl. She guffawed, then widened her eyes.

“Perhaps I should replace it for something else.” She raised the bowl. “Lisa, do you have something to do with that, with all those great things your employer is doing?”

I laughed at her curiosity. But yes, I had something to do with Verdidea’s rise to fame. As their main PR specialist, I knew exactly what to sweep beneath the carpet: embezzlement schemes, tax evasion, greenwashing, and all scandals that involved Jandir and Vando Batista, brothers and CEOs of Verdidea. It was all justified, given the nature of Verdidea’s noble undertaking. At that moment, laughing with Mamãe in the kitchen, feeling cozy and accomplished, I had yet to fuck a lot of lives.

On the fifth day of my trip to São João da Campânula, I have only a recipe written down and less than twenty minutes of video footage. At night, I choose to walk around the landfill’s paths—its veins—with my pad and my cam-drone turned off in my backpack. This time, I don’t bring sandwiches.

I trudge, observing the flocks of people coming and going from the shacks that surround the landfill. A trio of men jab small items from the ground with hook sticks. A few steps behind them, two kids argue about the true color of the moon. One of them believes it’s as strikingly white as unspoiled milk. The other one says it’s tawny like the pages of the books in his mother’s chest. In the sky, silky clouds strive to hide the secrets of the moon.

On a heap of trash, an old woman with a hunched back fidgets with litter, a statue against the nightly hues. She wears fruit baskets as shoes and gloves to pick up what she deems useful. I wave at her, experimenting with a smile even knowing it hardly fits. She frowns at me but doesn’t wave back. A few meters ahead, six people gather around a grill, two of them sambaing to the erratic sounds of a broken pandeiro. The others laugh and talk loudly about a soccer game, pointing at each other, gesticulating. The stench that glues to the air, sweating from the grill, is the one I’m growing used to. Perhaps it means home to them. It smells like dinner. When I arrived home late from college, the aroma of Mamãe’s beans cooked with garlic and paprika pervaded the apartment. That scent was like a tight, warm embrace, even though I eventually chose to abandon it to chase illusions.

“Moça!” I pivot to face a boy sticking his foot into a pile of trash. He gives out a muffled cry but doesn’t really care about it. He stretches his arm to reach something. “You’re tall. Can you pick that lunchbox for me?” His voice is jumbled. He’s chewing bubble gum.

“Of course.” I walk to the pile of trash and fetch the lunchbox for him. It’s stylized with the drawing of a fading funny robot. One of its edges is dented. A bug skitters out of a tiny hole on its side. I shoo it away. “Is it for school?”

The boy shakes his head. He’s about eight years old, shirtless, soot daubing his cheeks like tribal marks. Dollops of dried blood swell from his lips. Not bubble gum. He’s chewing a piece of plastic casing for wires. I hand the lunchbox to him, mouth agape. They rarely eat raw plastic. It hurts the mouth, pharynx, and esophagus. That’s why they partially melt it, work it into a paste, then grate it. Verdidea’s directors spoke of plans for easing the process of eating plastic, mainly in the upper digestive system, from the mouth to the stomach. They went bankrupt without ever outlining those plans.

The boy opens the lunchbox and shakes it to clean it from dirt.

“Are you the journalist?” he asks, wiping the funny robot that grins at us with its coiling arms wide open as if looking for a hug.

“Yes. My name is Elisa.”

The boy spits half the casing from his mouth and swallows the rest. I gulp at it, wanting to look away. If it were weeks ago, I’d probably retch at the sight. But now I know it’s part of my story. I don’t want to avoid it.

“My maninha says she likes you. She met you ten years ago.”

My heart misses a beat. I gape at the boy. I don’t need to ask who his sister is. Francisca da Conceição, the person I gave to Verdidea as a corporate offering.

When would Verdidea put a base on the moon like the other billionaires were doing at a rapid pace? Questions like that whirled on the news all the time, but it never made Jandir and Vando Batista’s eyes shine. Their next big project was thankfully rooted on Earth: ending world hunger. For that, they had to choose between two paths: solving what prevented food from arriving at everyone’s tables or devising new feeding solutions. The former involved politics and tackling the core of the economic system itself, from which they greatly benefited, so they left it aside. The latter was what motivated them.

The plastic-breaking enzyme working in mammals was Verdidea’s secret—forbidden—breakthrough. After the plastic was digested into monomers, very specific bacteria carried its constituent parts through the digestive system. Grouped with other microbes artificially inserted into someone’s microbiota, those monomers could be converted into carbohydrates, proteins, vitamins, and other nutrients. It was a giant leap from what Verdidea had been using in isopods for three years. (And by the way, the Great Pacific garbage patch had shrunken 25 percent since the crustaceans were employed there. Headlines flashed that Verdidea was the company that should run the world.)

With the enzyme-bacteria system working in humans, no one would need to starve anymore. Virtually anything around people could be easily turned into food. Plastic was ubiquitous in cities. The food supply chain would be disrupted. Transport, distribution, aggregation, and processing might all be rendered secondary and, with a whole assortment of new processes, different textures and tastes could be acquired. Feeding people would be a decentralized process without lots of points of failure. Costs would plummet. It would all become excruciatingly cheaper than producing any kind of food, and with the way Verdidea planned to employ its enzyme-bacteria system, eating plastic could also prove to be healthier than eating ultra-processed food. Not only would famine end, but people would have quality nutrition all around the world. The abrasive and obnoxious stench of burnt plastic that would pester the cities could be solved soon after. Verdidea was certain they could do anything. I was certain I could make the world believe in that.

Mamãe and I had gone through rough patches when I was a kid. Mamãe had to work overnight as a prostitute to take care of me during the day, and on weekends she got temporary gigs as a window cleaner so we had food on our table. So more than a meaningful job, Verdidea’s project became personal to me.

The next step came when the process worked successfully on mice, then monkeys. So they needed volunteers. I never fooled myself about what that word meant for them.

There were poor communities near Mairipotaba comprising displaced people from Goiânia’s massive gentrification. They were jobless, many of them starving, not a few resorting to landfills to find food and junk to sell at paltry values. It was near those communities that Verdidea decided to build a new headquarters. It was me who wrote articles and called press conferences to convince Verdidea’s shareholders that it was a good idea. I worked day and night to fabricate the vision of Verdidea sinking its roots in the middle of Brazil and making them sprout deep and wide, bringing progress everywhere they touched, so when it came to the public it would all be beautifully justified. All in the name of ending world hunger. Meanwhile, Verdidea’s lawyers scoured the law for loopholes that would allow them to start experimenting on humans—and, as I later found out, Verdidea deceived the ethics committee responsible for the project, presenting to them an entirely different set of parameters.

In a one-hour speech, I convinced Verdidea’s shareholders that it was a good idea to make São João’s citizens eat trash. Three months later, they applauded me and green-lighted the project.

The story of Francisca da Conceição started when I found her lone shack, half a kilometer from São João da Campânula, the widest of the landfills. Her hut was surrounded by shrubs and flanked by a muddied-water stream. When I arrived, the wind plucked fiercely at pants, shirts, and sneakers hanging from a clothesline. Somewhere inside, sertanejo wheezed from shabby speakers. It was the furthest I had the guts to go into the Mairipotaba’s communities, not so far from Verdidea’s new headquarters—next to where I went to live after I left Mamãe and the cozy aromas of her beans with garlic. But most important, it wasn’t within the humiliating heart of São João.

I’d learned through Verdidea’s reports that an eighteen-year-old girl lived in that shack with her mothers and that she stayed alone during most of the day, when her mothers left to scavenge the landfills and hawk in the streets of Goiânia.

Francisca was a thin girl with a protruding belly. When I first saw her, she wore a crop top and jeans so spent they almost surrendered to white. Her shack only had two mattresses, a TV set, and a crooked, doorless wardrobe.

She invited me to sit on two plastic chairs outside and offered me a warm cup of coffee. I accepted.

“Do you eat?” I asked after I explained who I was and where I came from. At that point, I hadn’t been fully clear about my intentions of asking her to be a volunteer. But she certainly knew people like me only went there when they had something to gain.

“I do.” Francisca sipped at her coffee. She was a very shy girl, clearly not used to visits, much less by overdressed women.

“How is it so?” I looked around, indicating that there wasn’t much beyond a makeshift oven and a few supermarket bags lying next to the shack. “Do you make your own food?”

“Sometimes.” She shrugged. “But mostly my moms scavenge things from the landfills then sell them in the city. Then, they come back with some quentinhas. Sometimes it’s rice and chicken, other times just a lettuce salad.”

“Is it always enough for your family?”

The question caught her by surprise. Her gaze lost focus, the cup tight between her fingers, midway to her mouth. After a while, she shook her head. I was pulling the conversation to the point where I wanted, but not without pain. Speaking of hunger when you were not feeling it wasn’t always easy. It seemed unfair because you were sated; but it also filled you with a senseless kind of hope, as if that bellyful moment could linger and maybe, just maybe, you’d never have to be hungry again.

“Sorry about the…sensitive and weird question…” I said. “But if you were hungry right now, would you eat those bags if you were sure they would sate your hunger?”

“Do you mean…” Francisca blushed. “Eating what’s inside them?”

“No. I mean the bags themselves.”

“I would.” No hesitation.

I only remembered two moments of my childhood when I felt really hungry. I never forgot them. Sometimes Mamãe’s work wasn’t enough to feed us—the excruciating drama of many Brazilian families. Inflation corroded her meager wages and there was one occasion when we spent an entire day without having anything to eat. But they were enough for me to remember my own yells echoing throughout the apartment, unaware of the fact that food didn’t magically sprout whenever I wanted. Mamãe silently sobbed in a corner, knowing that even if she worked harder the next day there was no guarantee that there would be food on our table.

“I would too,” I whispered to myself.

It was later that day I offered a magical solution to Francisca. For now, she only had to come with me to Verdidea’s labs and sign some papers. For someone with a hole to fill, she couldn’t say no.

Today, Francisca doesn’t live in a shack anymore. She lives in the middle of São João da Campânula, in a house with its bricks exposed and a corrugated iron roof. Clothes hang from the clothesline tied to two poles outside her house. The wind that buffets at them now carries the landfill’s polymeric stench. From somewhere nearby, samba shackles the evening, scratching the air with streaks of happiness, threatening to extinguish the smell by the sheer pressure of joy.

I wait for Francisca, staring at her closed door, snapping my fingers and trying to control my breathing. A man walks by carrying a bag of plastic bottles on his shoulder. He nods at me. Behind the set of houses that clutter that part of the landfill, the old woman with a hunched back kneels on a mound of trash. Or perhaps it’s another woman wearing fruit baskets as shoes, another shadow against the moon-paling backwash of the night. Behind her, beyond the warts of junk that pockmark São João, I see the imposing and abandoned headquarters of Verdidea—all that remains of the company that vowed to heal the world. A chill runs along my back when I remember all the nights I spent in that place, a haunted palace built on unstable stocks and the lives of the destitute.

“Are you okay, Elisa?” The voice startles me. It’s still the same but with a quality of roughness to it.

Francisca isn’t as slim as ten years ago, but the same curious half-smile shapes her lips, except her shyness seems to have melted away in the same humble kind of sweetness I saw in Edilberto’s eyes. I shiver from head to toe when I shake her hand. I expect a slap, a reprimand; any sort of revenge for having transformed her and those around her into garbage eaters. None of that happens. After all this time, I have only one question for Francisca, and not one of those noted in my pad—How does it taste? Does it hurt to eat plastic? How is your diet? The one I have for her is different, and one that applies to her and to myself: Was it worth it?

Like the coward I am, I don’t ask it.

“We’ll have dinner tomorrow for my brother’s birthday,” she says. “Do you want to come?”

“I do,” I say as fast as I gave away Mamãe’s Tupperware.

I’m sorry for what I did to you, the words quiver on my lips. I don’t say them.

Don’t try to repair your mistakes all at once. Some of them you’ll just have to swallow.

 “Thank you for the invitation,” I say instead, gulping.

“I made dinner for you.” Mamãe was dry and brief when she called me one week after I told her about Verdidea’s plans with the enzyme. It happened a month after meeting Francisca for the first time and having her enlisted as a volunteer. “Can you come home earlier today?”

“Yes, Mamãe,” I said to my pad on the table while I slid my fingers through the volunteers’ profiles on the big screen at my office. Francisca was a go. There were five others, including one of her mothers, that were inclined to accept Verdidea’s offer as well. Volunteers would be provided with temporary housing and five months’ worth of the current minimum wages. But the big prize lay at the end of the road: they’d never have the risk of starving.

“Are you listening?” Mamãe’s grave voice shook me up. I rubbed my forehead.

“What?”

She sighed very slowly, which came out as an uncomfortable hiss through the pad’s speakers. “I asked you not to eat anything. I prepared something special.”

And when I went home, I found out what it meant.

On our dinner table, there was only one Pyrex dish at the center with an oozing black pudding that looked like charred cloth and smelled like burnt popcorn.

“Overcooked?” I said, kissing Mamãe’s forehead as I laid my backpack on the floor. She didn’t kiss mine back as usual.

“No,” she said. “Have your seat and let’s have dinner.”

I frowned at her. “But what’s that?”

“Our dinner.”

“Is it…overcooked mashed potatoes? Seriously—”

“It doesn’t matter.” Her eyes didn’t lock onto mine. “It won’t leave you hungry.”

I saw where she was heading and closed my eyes. When I told her about the new project in Mairipotaba, I said I’d probably have to spend some time in Goiânia. She didn’t take it lightly. She closed herself and spoke curtly with me in the following days. Up to that point, I’d thought it was because I was going to spend time away from her. I understood. I was all she had, so it was natural that she’d miss me. But there was something else.

“Mamãe…”

She pulled the chair. It scratched on the floorboard. I flinched while she sat.

“Mamãe, stop. You don’t need to eat that.”

She shrugged, scooping the black pudding and putting it on her plate.

“That’s what we have, isn’t it?” she said.

I pulled the other chair and sat beside her, seeking her eyes with mine, finding nothing but pain and evasion.

“The project with the enzyme is an option so no one will need to starve ever again.”

“The kid that I raised, the one that praised my soft pão de queijo”—her voice came out grated, her teeth chattering—“the one who was all yummy-yummy at my feijoada, would never want to see people eating garbage.”

“It’s not garbage, Mamãe! Don’t you understand? It’s the solution for a problem that has existed for thousands of years.” But those words tasted sour on my mouth. Those were the words of Elisa Assunção, PR Manager at Verdidea, disinterred out of a presentation to shareholders, not those of Elisa Assunção, daughter of Maíra Assunção, raised amongst the whiffs of motherly feijoada.

“It’s no solution, girl. It’s just the same problem with a different painting. They won’t give people options with dignity. They’re giving them what they always did: the leftovers. Eating is not only satiating your hunger. It’s a process that carries dignity. If you think it just serves to satiate your hunger, then eat the fucking dinner I prepared.”

“Mamãe, I can show you the documents.” I reached for her hand, but she recoiled, her mouth a thin waning moon. I wanted to talk about the documents because I didn’t want to find the truth in her words. “They’re classified, but I have access to them and I trust you. You’ll learn what this is really about. There’s a report that—”

“If you keep insisting that a poor boy should eat that fucking bottle…” She pointed to a soda bottle lying next to the bin in the kitchen. “Then don’t come back here.”

Mamãe took a mouthful of the black pudding.

In the humiliating heart of São João da Campânula, we dine.

There are about twenty people scattered on seven plastic tables around Francisca’s house, all partaking of the beer and food I brought—feijoada, pequi rice, galinhada, and green corn mush. I wish Mamãe were there too, joyfully saying how she’d change each of those recipes, how she’d sprinkle coriander in this one and nutmeg in that one.

I sit at a table with three other people, but I remain silent, just smiling at everyone who dares to look at me.

The song “O Show Tem Que Continuar” blasts from two big speakers strategically positioned on each side of the field. We’ll find the tone, a chord with a beautiful sound, and make our voices good; then we’ll be happy. Children play with a hose, frightening the heat away. Night has fallen but the sky is still daubed in the summer’s blue dyes.

Ângela is there with Mariana, Rogério, Adenilson, and Cleiton. She wears her cool sneakers and kisses her man Jango’s cheek. The hunched-back woman is there. She sings loudly. Then we’ll be happy; look, we’re on air again; the show must go on. Edilberto is there too, picking at something he brought in Mamãe’s Tupperware. He smiles as he stares at his friends—his family—chatting and singing and drinking and eating. When our gazes meet, he winks at me. He’s eating melted plastic bottle caps. It’s home to him.

“So, you came to write a story about us?” Francisca puts a hand on my shoulder. She has her other arm wrapped around her brother.

“I—Yes, I did.”

“And how is it?” Francisca picks a chair beside me and sits. I nod at a glass of beer, but she shakes her head.

I grin at her. “I’ll start over.”

“Why?”

“It’s just—My mind was elsewhere. I think it needs a complete overhaul.”

I don’t want them to become aberrations and exotic curiosities in the eyes of the public. I want them to be who they are: people. I want to write about the families living in São João da Campânula—about Mariana, Rogério, Adenilson, and Cleiton’s daily journey to school; about the samba of their evenings.

I have other questions to ask them. How was your day? What’s something you created recently? What makes you laugh? Who makes you laugh? Others will come to write about plastic. I’ll leave that to them.

“Francisca, let me ask you something.” I dare to put a hand over hers.

“Of course.”

“Was it worth it?”

She stares at me for a while like she did when I first asked her if her food was enough. “Was it worth it digging trash after food and things to sell? Was it worth it to beg in the streets? When something isn’t an option we don’t ask if it’s worth it.”

The “famine issue,” as the Batista brothers called it—as if it was just a minor inconvenience like forgetting a sandwich on a grill—was never only a question of actually eradicating famine. Since they never addressed poverty or housing, eating plastic became a symbol of desperation and lack of options, not of hope and progress. People in the landfills already picked their food from the trash. That wouldn’t change.

I wish I could say I was the one responsible for fracturing Verdidea’s business. I wasn’t. Their stocks plummeted when they abandoned the Amazon rainforest project, then again when I couldn’t shield them from the scandals—unknown up to then—involving several of the Batistas’ other companies that employed forced labor. I was horrified, but I chose to believe they didn’t know and that they could correct their mistakes. I still had my hopes high that they could address many of the world issues, including famine, food quality and distribution, housing, and poverty. It was only a setback. They were the solution. It was a selfish, self-destructive behavior. How could I have dedicated fifteen years of my life to them if they couldn’t achieve those goals? Was I merely industrial waste along with all the other workers being steadily laid off? In my desperation, I even tried to push an article defending Verdidea’s views. But not even the Batistas believed in the company anymore.

The final strike came when the people living in the Mairipotaba’s landfills were exposed as the plastikeaters. It was when I learned Verdidea was already genetically altering São João da Campânula’s dwellers to make their bodies produce the enzyme-bacteria system in their digestive tract. I thought I’d be informed when it happened. I’d thought I’d see the results, the smiles of people with enough sustenance to survive. Verdidea’s directors didn’t show me anything, perhaps because they knew I was only sustained by an illusion.

In the end, what toppled me was the front page of O Globo showing a blind old man with plastic cotton swabs on his tongue. It was then that I couldn’t take it anymore.

Mamãe used to say we shouldn’t blindly pursue our dreams. Sometimes it was okay to put them aside for a while or to abandon them altogether. Our dreams are the fabric of who we are, Lisa, but we’re changing all the time, re-sewing ourselves.

Nine years after leaving home, I knock on the door of the only woman capable of helping me sweep my dusty dreams from beneath my feet.

“Mamãe?” I stammer as an old woman opens the door. There’s deepness in her eyes, a mix of sadness and longing that brews into a bittersweet gaze when she sees me crying. “I brought cornmeal cake for us.”

Buy the Book

An illustration of a woman's face in shades of blue and green.
--> An illustration of a woman's face in shades of blue and green.

The Plasticity of Being

Renan Bernardo

The post The Plasticity of Being appeared first on Reactor.

Have You Eaten? Part 2: Dinner with Peter [Original Fiction Archives - Reactor]



Fen’s Dad’s Soup

2 bay leaves
6–8 peppercorns
3–5 allspice berries
10 cups water; or 10 cups beef broth & omit bouillon
4 tablespoons beef base or 2 bouillon cubes 
½ head cabbage, shredded
1 cup celery, chopped
2 onions, chopped
2 carrots, chopped
1 pound sliced sausage
2 chicken breasts, cubed
1 cup ham, cubed
1 6-ounce can tomato paste
1 cup dry white wine
3 large dill pickles, chopped
2 tablespoons capers
¾ cup black olives, sliced
2 cans stewed tomatoes
Salt
Pepper
Optional: Dill and sour cream.

Instructions

  1. Tie the bay leaves, peppercorns, and allspice berries up in a square of cheesecloth to form a sachet. Alternatively, put them into a tea infuser. In a very large pot, combine the water, spice sachet, beef base, cabbage, and celery. Boil for 30 minutes.  
  2. While the water boils, in a very large skillet, sauté the onions and carrots.
  3. When the onions start to brown, add the sausage, chicken, and ham to the pan. The sausage will release some fat, which will fry the chicken and ham. If omitting sausage, add oil or butter to the pan and cook until the chicken and ham are brown on all sides.
  4. Add the contents of the skillet to the cooking pot. Add tomato paste to the skillet and stir until it starts to brown; then, add the white wine and dill pickles to the skillet. Stir to loosen all fond from the bottom of the pan, then transfer contents of the skillet to the cooking pot.
  5. Add capers, olives, and stewed tomatoes to the cooking pot. Simmer 5–10 minutes until heated through.
  6. Add salt and pepper to taste. Serve with dill and sour cream. 

Iowa is quiet at night, not that anyone in the back of the pickup would know. The engine is so loud that they can barely hear their own thoughts. But that’s fine, because none of them particularly want to tune in to that frequency anyway. The noise is a mercy, in its way.

All four of them—Fen, Quan, Harper, and Morrow—are wedged into the space next to the strapped-tight ATV in the truck bed. They’ve been rattling around back there like coins in a can since the middle of Colorado, where they managed to get picked up for the clearance price of all the pills in Morrow’s pockets. The guy driving the truck didn’t even look at their faces before opening the tailgate and ushering them in. He didn’t look when he slammed the tailgate shut either. Fen was lucky not to lose a finger.

That unlooking was its own kind of courtesy—the gift of anonymity, generously granted to four nobodies in exchange for a palmful of loose capsules.

“Quan. Hey. Hey, Quan.” Morrow is folded nearly in half to fit in their corner of the truck bed, closest to the cab. They’re nudging a zoned-out Quan with one sharp elbow.

“Wha?” Quan sounds disoriented, like he’s just woken up.

Morrow bends down to lean close to Quan’s ear. “What did I give that guy?”

“What did you—do you mean the pills?”

“Yeah, I didn’t check. Did you see what I handed him?”

Quan leans away, gives Morrow an incredulous look. “No. How do you not know what pills were in your pocket?”

Morrow shrugs, leans around Quan to try to get Harper’s attention. “Harp?”

Harper shakes their head, points to their ear. Even if they were open to conversation, which they usually aren’t, the thunder of the truck’s engine is loud enough to wash out any possibility of conversation.

Morrow doesn’t bother trying to get Fen’s attention. She’s crammed tight into the opposite corner from them. Her back is against the tailgate, and a scarf is up over her face to filter the worst of the exhaust coming from the tailpipe beneath her seat. Her eyes are closed and her skin is a worrying shade of green.

Just as Quan’s eyes start glazing over again, the truck slows. The stink of exhaust thickens without the wind of movement to whisk it away. Harper and Morrow pull their shirts up over their noses and mouths; Quan just coughs.

There’s nothing here to stop for, but the truck pulls onto the shoulder anyway. The semiautomatic bleat of the rumble strip jolts them all alert. They glance at each other, worry passing between them as fast as an extreme heat warning pinging every palmset in a hundred-mile area. None of them know why the driver would choose to stop in this lonely place.

The engine cuts off. Wildflowers grow next to the highway, bottle caps scattered in the dirt they’re growing out of. The golden pre-dusk light makes the broken glass on the highway shoulder glow. A fallow field stretches as far as any of them can see; on the other side of the highway, a blanket of soybeans extends all the way to the horizon. A door opens, then slams shut again. A lone cicada whines nearby; other than that, there’s no sound louder than footsteps on gravel as the driver makes his way around the side of the truck.

The tailgate drops open. Fen nearly falls out but catches herself just in time. She drops her head into her hands and sits there, catching her breath.

The driver’s hat, a faded blue ballcap with a dark rectangle on the front where a patch has been ripped off, shades his face so his eyes aren’t visible. He clears his throat and spits into the wildflowers. “You’ll want to get out and walk from here,” he says. “State line’s in a couple miles, and the State Border Patrol in Illinois started doing agricultural inspections on all vehicles entering the state last year. Depending who’s running the booth, could mean trouble for some kinds of people.”

“We’re trying to get to Chicago,” Harper says as they scramble past Fen and out of the truck bed. It’s a five-foot drop to the ground. The driver doesn’t help them down.

Morrow nudges Quan again. “That’s in Illinois, right?” they whisper.

Quan doesn’t answer. He pauses at the edge of the tailgate, looking at the driver, who has his face turned toward the soybeans. “Do you know how we can get there without running into State BP?”

The driver responds with silence. He waits while Morrow helps ease a gray-faced Fen to the edge of the dropped tailgate. Once the two of them drop to the asphalt, he slams the tailgate shut again. He hesitates for just a moment before turning his back on all four of them.

“Go through Wisconsin. There’s just one guy working the inspection station up there, name of Bouchard. He never gives anyone trouble.”

By the time Harper reaches the “you” in “thank you,” the driver’s-side door is already slamming shut again.

Fen stumbles into the fallow field as the truck vanishes down the long, straight stretch of road toward Illinois.

“Fen. You okay?” Harper stoops to pick up their bag and Fen’s.

Fen holds up a hand, then crouches, spasms, heaves. She stays hunched over for a long minute before straightening. “I’m fine,” she calls hoarsely. “Just carsick. Anyone have a charge on their palmset? I’m down to two percent.”

“I didn’t find a charging pad in the back of the truck, no,” Quan says in a tone that could be a joke or could be a rebuke.

Harper gives him a gentle shove on the shoulder. “Doesn’t matter. We can figure out where to plug in tomorrow. Right now, we need a place to sleep. Storm’s coming.”

 “Not for a while, though, right?” Morrow looks up at the thick bank of clouds on the horizon, doubtful.

Harper doesn’t answer him. “Fen, you ready?”

Fen nods and half straightens. Together, the four of them start across the field. They pick their way across the grass, pants tucked into socks, bones jellified from the hours of travel. It doesn’t take long for the road to vanish behind them. After a couple of minutes of walking, Fen looks better enough that Harper stops shooting worried glances at her.

Quan spots an abandoned-looking shack in the middle of a bald patch in the field. The windows are missing and there are holes in the roof that you can see right through, but the night is warm and a roof’s a roof, holes or none.

Harper starts by knocking on the front door. Loud, firm knocks. Cop knocks. They try three times before deciding nobody’s home. The front door isn’t locked, and there’s a palpable emptiness to the house when the four of them walk inside.

They make a lot of noise as they enter, pitching their voices loud like they’re warning off bears. They split into pairs and sweep quickly through the house. There’s not much territory to cover—one main room the size of the truck they rode here in, with a bed pushed into the far corner; a simple kitchen along one wall with a woodburning stove and a pump sink; a water closet that doesn’t merit more than a quick peek to confirm that nobody’s hiding inside.

Fen and Harper confer. “We should check outside too, but I don’t think anyone’s been in this place for a long time,” Fen says, sweeping a layer of sandy dust off the single skinny, buckled shelf above the sink.

“Gotta plug some of the holes in the walls. Wind’s already picking up,” Harper says, nodding to a gap between the boards where the pink light of the sunset peeks through. “Who wants which job?”

Fen volunteers to check outside. Her face visibly falls when Quan volunteers to walk the perimeter with her. He has his palmset and charging cable in his hand, like he’s hoping there might be a power outlet on the outside of the house. Morrow and Harper stay inside, using an old broom handle to tug a pile of rags out from under the bed to plug the gaps in the walls.

 Quan starts in on Fen the second they’re outside. “Why don’t you want to talk to me? Did I do something?” He steps around a haphazard stack of logs, pauses, turns around, and cups his hands around his mouth. “Hey, there’s a woodpile!”

“Thanks,” Harper yells from inside.

Fen pretends not to hear him. “Did you notice the updates on Daneka’s Fotoset?” She pulls out her palmset. The screen is dim and grayscale to save power. She rotates the palmset in her hand until it opens the photo-sharing app. Daneka’s latest update is right there: a picture of a butterfly, captioned

Quan glances at it, then looks quickly away. “Daneka didn’t post that.”

“No shit.” Fen nudges an old aluminum bucket with one foot. It tips over with a hollow thunk. “It’s been stuff like that every day. I just can’t figure out if it’s a bot takeover or if someone’s running the account.”

“The bots and the Feds train on the same material. Impossible to tell them apart based on voice, but I guess we’ll know which one it is if Daneka starts messaging you links to ‘investment opportunities.’” He rounds the corner of the house, then stops, tilts his head. “Hey, when we were inside, did you see a back door into the house?”

Fen follows his gaze. He’s looking at a narrow door set into the eastern wall of the house. She thinks for a moment, then answers firmly. “No. Definitely not.”

They approach warily. Fen raps on the door hard—it’s not as loud as Harper’s knock, but it’s loud enough that they hear Morrow yell “What was that?”from inside the house. After a few seconds pass without any other response, Fen glances at Quan. He nods and reaches past her for the doorknob.

The door sticks the first two times Quan pulls on it. On the third tug, he yanks it hard, and it opens with a sick, paint-stuck pop.

“It’s a canning pantry,” Fen says, peering inside at the spiderwebbed shelves that line the walls. A single broken bulb hangs from the ceiling; glass crunches underfoot as the two of them squeeze inside.

They both jump at a pounding on the wall. Morrow’s soft voice follows, barely muffled.  “Hey, who the fuck is in the walls?”

Quan sticks an arm through some cobwebs to smack a fist into the wall. “It’s just us,” he yells back. “We found a pantry!”

Morrow pauses. When they speak again, it sounds like they’re pressed right up against the other side of the wall. “Anything good in there?”

“Electricity,” Quan says, pointing to the broken bulb overhead. “Might be an outlet in here. Fen, can we use your palmset’s flashlight mode?”

“No,” she snaps. “It’ll kill the battery.”

“Which you’ll be able to recharge if we find an outlet,” Quan drawls with exaggerated patience. When Fen doesn’t immediately pull out her palmset, he snaps his fingers at her a few times. “Come on. Let’s go.”

Fen opens her mouth like she’s about to protest, but then she closes it again, shakes her head, pulls out her palmset. “Fuck you,” she mutters as she thumbs it into flashlight mode.

“You’re saying that because you know I’m right,” Quan replies. He drops into a low squat, then gets on his hands and knees to look under the shelves. “I think I see something back here.”

“An outlet?”

“You know what would help me figure that out is if you pointed that flashlight somewhere useful.”

Fen stoops to direct the light under the shelf. It lands on a tiny can, half buried in dust. “Don’t think you can plug into that,” she says.

Quan shoves his arm under the shelf. “There’s more back there,” he grunts. “I can feel something else. I can almost reach—if I just . . .” He strains for a moment, then pulls his hand out from the darkness, holding the tiny can and a small glass jar.

The light from Fen’s palmset starts to dim. “Shit,” she says, “let’s check the rest of this place out, quick. I’m almost out of charge.”

In the sixty seconds before Fen’s palmset dies, they find a few more dust-covered jars, and a wall outlet that’s so blackened with scorch marks that even Quan isn’t willing to risk plugging into it. They gather everything they’ve found and bring it inside, where most of the gaps in the walls are plugged with rags and a fire is already burning in the woodstove.

“Huh. Well. This is . . . I don’t want to say useless,” Harper says, looking over what they’ve found. “But I would have hoped for more actual food.”

Morrow squats down in front of the row of jars. “I don’t know. I love pickles. I haven’t had them in so long.” They examine a second, smaller jar, full of dark liquid. “I think this is olives? And that’s gotta be sauerkraut,” they add, nodding to a jar packed with dense white shreds.

“And this tiny one is tomato paste,” Fen finishes, prodding the tiny dusty can Quan rescued from beneath the shelves. “Plus, of course, we always have our beloved ewed tomat.” The “ewed tomat” can with the half-ripped-off label has been in Quan’s backpack for a little more than a year. It’s a little dented, but not enough to worry about—Fen has explained to Morrow a hundred times that unless her index finger can fit into the dent, it’s not dangerous.

Quan stands at the pump sink, working the foot lever until the faucet spits out brown water. He lets it run until the water is clear, then washes his hands. “I say we open all the jars, toss everything together, and call it a salad.”

“I can add these,” Morrow says suddenly, rummaging through their bag and coming up with a paper package. “A lady outside that scary gas station in Wyoming was selling them. I think they’re like homemade Slim Jims.” They open the package to reveal a row of wrinkled, finger-length sausages.

Fen stares at the sausages, lets out a sigh. “Harp, wanna go forage with me? Maybe there’s something we can add to all this.”

“I saw a shit-ton of wild dill out there,” Morrow chimes in.

“And I have pepper,” a new voice adds.

The four of them jump, wheel around to face the hole in the wall where a rag has been pulled free. A pair of pale eyes stares in at them. “What the fuck,” Quan snaps, just as Harper says, “Who are you?” and Fen lets out a startled “Who?!”

Morrow doesn’t speak. They simply straighten out of their perpetual slouch and square their shoulders, filling the little space and reminding the other three of what Morrow is like when they’re not working to stay small and quiet and gentle.

The stranger outside doesn’t move an inch, which is smart. “I don’t want any trouble,” he says in an easy voice. “I just thought maybe we could share a roof for the night? A storm’s coming in, and it isn’t going to be pretty out here in an hour or so.”

Everyone looks at Fen, because Fen’s a soft touch. She’s chewing on her lip. Then everyone looks at Harper, because Harper’s a tough row. They’re frowning. Just then, a gust of wind rattles the shack hard enough to knock dust loose from the rafters. “We gotta,” Harper whispers.

“Come on in,” Fen says to the stranger, “but if you fuck around, you’ll find out. Clear?”

“As a bell,” the stranger says. He comes around to the front door and opens it slow, peeking around the doorframe and glancing around before stepping in and dropping a heavy-looking duffel onto the floor. His eyes pause on Morrow, and he gives a slight nod. “Thanks for the hospitality. I’m glad you’ve got that woodstove going, it’s getting cold outside. Like I said, I’ve got peppercorns. Couple other things too, if you’re in need or looking to trade.”

He has a soft accent, something that sounds like it comes from miles and miles of cornfields. He’s scrawny, short, and thin as a whistle, with hair the color of nothing. He crosses the room right away, pulling a rag out of his pocket and shoving it into the gap he’d pulled it out of in the first place.

When he lifts his hand to shove the rag into that hole in the wall, Quan lets out a soft gasp. Fen’s the only one to hear it. She follows his gaze to the stranger’s hands and gives Harper a nudge. Harper sees it too, and kicks Morrow’s ankle, signaling with her eyes.

The stranger has a bracelet of runes tattooed on his wrist.

“My name’s Peter,” the stranger says. “Like I said, I’ve got peppercorns, and bouillon, and some juniper berries too. All dried. And a few bay leaves, and—you won’t believe me, but I’ll show you—a can of SPAM.” He says this last part with a little laugh.

“I haven’t had SPAM since I was a kid,” Quan murmurs.

Harper cuts him a sharp glance, then returns their attention to Peter. “Sure, show us. What are you doing with all those spices?”

“I collect ’em on the road,” he answers, unzipping his duffel. The runes are still on clear display. “A little bit of this, a little bit of that. Makes it easier to get folks on board for a little temporary cohabitation,” he adds, aiming a wink over his shoulder.

“I’m gonna grab some of that dill outside before the storm lands on us,” Harper says. “Morrow, come with?”

Morrow nods. The two of them step outside, walk a few paces, and begin a whispered conference.

“Okay, which runes mean what?” Harper hisses. “You’re into all that spooky shit, right?”

Morrow’s eyes go wide with didn’t-study panic. “I mean, I’m into some spooky shit, but I don’t know anything about runes. I don’t touch that stuff on account of. You know.” They nod back toward the shack.

“Right. That’s the problem. How can we tell?”

They stop and stare at each other, glancing back at the shack, both trying to figure out how they can determine what Peter’s tattoo means to him. It could be that he believes in magic—or it could be that he believes in the inherent superiority of an imaginary master race. There’s no safe way to ask Are you a pagan or are you a white supremacist? but for everyone’s sake, they need to find out, and they need to find out fast.

By the time they get back to the shack, each clutching a fistful of dill, Fen is already cooking. She’s squatting on the floor over the pried-loose shelf from the wall, dicing pickles with an unfamiliar hunting knife while Quan unwraps the foil from a bouillon cube. A collapsible pot of water is steaming on top of the woodstove.

“What are we making?” Harper asks, her eyes fixed on the hunting knife.

Fen glances up, her eyes darting to Peter before returning to the pickles she’s chopping. “I remembered a recipe from the box that should work okay, now that we have Peter’s help. It’s a soup my dad used to make when any of us were sick. I’m making a half-recipe because his recipe makes enough to feed, like, ten people. He called it pickle soup,” she adds. Her voice stretches a little tighter as she stares down at the knife in her hand. “But it has another name I can’t remember right now. A Russian name. Peter, do you know anything about Russian food?”

“’Fraid not,” Peter says mildly, popping the lid off the can of tomato paste. “But I’m sure it’ll be delicious, whatever it is.”

Morrow shows Fen the dill they collected. “Will this help?”

“It’s perfect,” Fen says with a tense smile. “Give it a rinse, will you?”

“I’ll get it,” Peter says, rising to his feet and holding out his hands. He passes close to Quan on his way to the sink. “Scuse me.”

Quan shifts his weight forward, dropping the bouillon cube into the pot. “No worries. Can I grab those spices out of your bag?”

“Help yourself. Oh, and if anyone needs to charge a palmset, I’ve got a crank charger in there too,” Peter replies, not looking back. He keeps his eyes trained on the dill in the sink as he rinses it. It’s a clear signal: You can look through my shit, I won’t stop you.

Quan darts to the duffel and unzips it. “Are the spices in jars or what?” he calls over his shoulder, already searching through Peter’s things.

“Ziptop bags. Can’t miss them, they’re all the way at the bottom,” Peter says, still washing the dill, even though it has to be clean by now. “Just pull them all out and we can see what’s useful.”

Fen holds up the ripped, water-rippled recipe card up to the firelight from the woodstove. “Looks like we need peppercorns, allspice berries, and bay leaves. They can go right into the pot. Oh, and is there celery salt?”

“Yeah,” Quan says. “He has all that stuff. Plus this thing,” he adds, lifting out a small, matte-black cube with a folding hand crank on one side and two power outlets on top.

As Quan stands, Peter slowly turns around with the dill. His gaze is perfectly steady. “Did you find anything else that could be of use?”

Quan shakes his head once. “Nope. This is all we need, right, Fen?”

Fen stares hard at Quan. “You read the recipe card. You know as well as I do.”

“Then we’re good to go,” Quan says briskly. He crosses the room and drops the spices next to Fen’s makeshift cutting board, then grabs his palmset and charger and plugs in to the black cube.

“I’ll take the first shift,” Morrow says, dropping to the ground beside Quan. They have Fen’s palmset and plug it in next to Quan’s. Then they unfold the hand crank and start turning it hard and fast, waiting for the charging symbol to appear on the two palmsets.

“I was going to—” Quan starts, but then he catches a glimpse of Morrow’s dark, determined expression and changes his mind. “Thanks,” he says instead.

Everything moves briskly from there. Morrow charges the palmsets. Harper watches the pot on the stove as the bouillon cube dissolves and the spices simmer it into a fragrant broth. Fen inspects the wrinkly black olives by the firelight, making sure they’re not growing any fuzz before she slices them up. Peter shows them all how to use his hunting knife to cube the Spam without taking it out of its metal tin, while Quan discovers a flat length of cast iron under the woodstove.

“Is this a griddle?” he asks, holding it up and prodding at the lip around the edge. “It looks like—”

“That’s perfect!” Fen cries out when she sees it.

Quan looks startled, but hands over the griddle with a slow smile. “Does this mean you forgive me for whatever I did that made you stop talking to me?”

Fen pulls away, puts the griddle on top of the woodstove beside the pot. “No.”

“Wait, why not? Fen, c’mon. Quit being so—”

“So what?” Fen whips around on him, her voice taut.

Harper raises an eyebrow at Quan. “I wouldn’t,” they warn.

Across the room, Peter sits on the edge of the narrow bed, watching the four of them. The little shack is too small for him to pretend not to hear the exchange, but he has the good grace not to try to intervene.

Quan throws his hands into the air. “I’m sick of this,” he says. “Fen keeps acting like I took a shit in her backpack, and all I’ve done this whole time is—”

“Is be a huge asshole,” Morrow murmurs.

Quan freezes. If Fen or Harper had said this, it would be Quan’s cue to get into the thick of a fight. But Morrow—gentle, kind Morrow, with their cauliflower ears and scar-hatched knuckles—never says fighting words.

“What did I do?” Quan asks. The question has an edge on it, but not much of one.

Morrow shifts their shoulders. They don’t break their rhythm on the hand crank. “You just get mean for no reason sometimes. Like earlier today, when you called me a gorilla. That was mean.”

“I just meant—you know, you’re tall and strong and stuff,” Quan says, his voice faltering as he looks to Harper and Fen for backup and doesn’t find any. “That’s all.”

Morrow huffs out a barely there laugh. “Okay,” they say. “If that’s who you wanna be.”

Quan swallows hard. Harper and Fen look at each other, then at the floor. Morrow keeps cranking the charger until Quan’s phone lets out a chime.

“I want to charge mine next,” Harper says. They go to their backpack, and Morrow unplugs Quan’s palmset and hands it over, and the movement breaks the surface tension on the bubble of their fight just enough for the meal they’re preparing to come back into focus.

Peter clears his throat from the corner. “That griddle should be hot by now.”

The cubed Spam goes onto the griddle. Peter slices the sausage into rounds right over it, each tiny coin dropping onto the hot iron with an immediate sizzle.

“This would be better if we had onions.” Fen sighs.

“Be better if we had a big leather sofa,” Peter replies with a grin. “But here we are.”

The tomato paste slides out of its tiny dusty can onto the griddle, and Fen uses a spoon to stir it until it starts to stick to the metal. Then she calls to Harper, who’s deep in quiet conversation with Quan near the bed. “Harp, can you bring me those pickles?”

Harper looks up sharply. “Morrow, can you get it?”

Fen’s palmset chimes. “Perfect timing. Fen, you’re all charged up.” Morrow steps away from the charger and brings Fen the shelf-turned-cutting board with the chopped pickles and olives on it.

Fen slides the pickles onto the skillet, leaving the olives. She splashes some broth from the pot onto the hot metal, too. The moisture loosens the caramelizing tomato paste just enough for Fen to scrape up all the bits that are sticking to the cast iron.

“Shit,” Fen says, looking from the griddle to the cooking pot.

“What’s the matter?” Morrow asks.

“I need to put all this stuff,” she says, gesturing to the rapidly drying mixture of meat and tomato paste and pickles, “into there.” She points to the pot. “But if I pick up the griddle, it’ll burn the fuck out of my hands.”

Peter steps forward. “I’ve got it,” he says. He strips off his denim jacket.

Fen’s eyes are on the food, but Harper, Morrow, and Quan’s eyes all lock onto Peter’s bare arms as he uses his jacket to shield his hands and picks up the hot griddle, tipping the contents into the pot. The only tattoos visible on Peter are the bracelet of runes and a generic compass rose on one bicep. There’s nothing obvious there, nothing that speaks to what danger he might represent.

“What’s next?” Peter asks.

Fen consults the recipe card. “Gotta let this simmer for a few minutes, then rinse off some of that sauerkraut and add it in. We could probably get away with not rinsing it,” she adds, “but . . . it might be real funky.”

Peter opens the sauerkraut and gives it a whiff. “Could go either way. Your palmset’s going off,” he adds, looking to the lit-up screen on the floor.

Fen has the cutting board in her hands again, is about to slide the chopped olives into the pot. “Morrow, can you grab it?”

“Oh fuck,” Morrow whispers when they’ve got the screen in front of them.

“What?” Fen asks, dropping the olives into the pot.

“It’s a voice message from Daneka.”

The room freezes. Peter doesn’t seem to notice. He lifts the sauerkraut jar. “What do y’all think? Should I rinse this?” When nobody answers, he looks up and his face drops. His eyes flick to his duffel bag. “What happened?”

“It’s nothing,” Quan says quickly. He crosses the room to look at the screen in Morrow’s hand.

Fen wipes olive brine onto her jeans. “We got a message from a friend.”

Peter glances at his bag again, even less subtly this time. He takes a few steps back from the sink, looks ready to bolt. “A local friend?”

“A friend from back home,” Harper says. “Fen, do you want to listen to it?”

Fen shakes her head. “I’m almost done cooking.” She sounds tense.

“Fen,” Quan says, reaching for her arm.

She jerks away from his touch. “Don’t. Fine. We can listen to it.” She looks down at her palmset, swallows hard, and presses the notification.

It’s Daneka’s voice – her unmistakable chainsmoker rasp — but something sounds wrong. They can all hear it.

Fen slips her palmset into her pocket. She turns and uses a fork to add some sauerkraut into the pot. “This would be better with onions,” she says again. Her voice has all the color squeezed out of it.

“That wasn’t her.” Quan strides briskly across the room, headed nowhere at all, then turns on his heel to stare hard at his friends. “Right? That definitely wasn’t her.”

Harper sits on the edge of the bed. “We can’t know.”

Quan lets out a short, sharp laugh. “That sounded like a robot. It was definitely a fake! C’mon, Harp—”

“It was real,” Peter interrupts. “I used to code artificial-speech software. They don’t transition between similar sounds that smoothly. You heard when she said ‘wanted to know’? The ‘d’ in ‘wanted’ flowed right into the ‘t’ in ‘to.’ That’s a human-speech thing. Really hard to smooth out virtually.”

Morrow wheels around to face him. “Who did you write code for?”

His shoulders are tight, his face blank. “The company’s closed now. They got bought out during the last big market crash.”

“What company?” Harper demands.

He swallows hard. Takes a few slow steps toward his bag, then uses a foot to flip it over. There’s a faded logo on the side, barely visible in the flickering light from the fire in the woodstove. The twisting double-S logo of the multimedia conglomerate that used to dominate the digital newsletter marketplace. “We developed an integrated voice-to-text service.”

“You mean proprietary,” Harper says. “So you worked for the company everyone worked for. Why were you so squirrely about it just now? What, are you not a ‘champion of free speech’?” All the venom in her voice pools at the end of the sentence.

“I don’t agree with everything they—”

“Dinner’s ready,” Fen interrupts. “Peter, can I use your jacket again?”

He brings his jacket to the woodstove and uses it to pull the cooking pot off the heat. The soup is still bubbling as he carries it to the middle of the room. Harper sets down a couple of rags, and Peter sets the pot on top of them. Morrow passes out spoons.

The five of them sit on the floor around the pot. Fen’s eyes are dull as she stares into the soup she’s made them. Harper is staring at Peter’s wrist.

“What did you say this soup is called?” Peter asks.

“That part of the recipe card is stained,” Fen replies. “I couldn’t read it.”

Quan coughs. “I remember. You mentioned it once, back when we first met. You called it solyanka.” He says it slow, his lips working to fit a memory of Fen’s mouth.

Fen looks up at him, surprised. “You remember stuff from all the way back then?”

A small smile ghosts across Quan’s face, but he doesn’t meet Fen’s eyes. “I remember everything you say.”

Fen hesitates. “Quan, I—”

“I’m sorry for being a dick,” Quan interrupts. “I’m gonna try to do that less. Might take me a little trying, though. But I am gonna try. I love you guys.”

Harper sniffs loudly. “Love you too. Dick.”

Morrow tastes the soup, burns their mouth. “Ow. Fuck. Ow. Where’s the dill?” they ask, their voice distorted by pain.

Fen glances behind her. “I forgot—”

“I’ll grab it.” Peter pushes himself to his feet, walks to the sink. Harper’s eyes track him. The hunting knife and cutting board are still in the sink. He reaches past them, grabs the very clean dill, brings it back, and hands it to Morrow.

“Thanks.” Morrow tears off a fistful of feathery green fronds, drops them into the pot.

“It’d be better with onions,” Fen says, blowing on a spoonful of soup straight from the pot. “But it’s not bad. That company you worked for—they’re based in Chicago, right?”

“Yeah, that’s where I’m coming from,” Peter says. He leans forward to dip his spoon into the pot. “How come?”

Fen looks up at him, pins him with her eyes. “That’s where we’re going. Do you still know anyone there?”

He thinks for a moment. “Depends who you want to meet. Why Chicago? There’s not much left of it.”

“Always wanted to go. Bright lights,” Fen says. “Big city.”

Peter nods. “I don’t know anyone there. But I know people on the way. Got a buddy who can get us across the state border to Wisconsin and put us up for a night or two, if that’s the route you want to take.”

Harper raises their eyebrows at Fen. Fen nods, then frowns at Morrow. Morrow nods, then nudges Quan. Quan takes a long sip of soup, clears his throat, and nods.

“Sounds good,” Fen says to Peter. “We’ll make our plan in the morning.”

The five of them eat the rest of their dinner in silence. Outside, the wind howls across the fallow field, yanking at the rags in the walls, whipping the petals off the wildflowers that grow on the side of the road.


Fen’s Solyanka  

2 bay leaves
6–8 peppercorns
3–5 allspice berries
1 shake celery salt
5 cups water
1 bouillon cube
2 cups sauerkraut, drained but not rinsed
1 pound sliced sausage
1 can Spam, cubed
1 6-ounce can tomato paste
3 large dill pickles, chopped
¾ cup black olives, sliced
1 can ewed tomat
Salt
Pepper
Optional: dill, chopped

Instructions

  1. In a very large pot, combine the water, spices, and beef base. Boil for 30 minutes.  
  2. Add the sausage and Spam to the pan. The sausage will release some fat, which will fry the Spam.
  3. Add tomato paste to the skillet and stir until it starts to brown; then, add the dill pickles and a little broth to the skillet. Stir to loosen all fond from the bottom of the pan, then transfer contents of the skillet to the cooking pot.
  4. Add olives and ewed tomat to the cooking pot. Simmer 5–10 minutes until heated through. 
  5. Serve with dill. 

A recipe card, typewritten on an index card, stapled to a torn sheet of notebook paper with a typewritten recipe on it. Both are weathered, torn, stained, and annotated. The card is on top of weathered, scarred wood, and is surrounded by jar lids holding whole spices, dill fronds, a folding knife, and a couple of jars with preserved vegetables and meats. Visible recipe text is as follows (all is typewritten unless otherwise indicated; see story text for recipe in full): The name of this recipe is blurred out from damage to the recipe card. Handwritten annotation says “Dad’s Recipe.” 2 bay leaves peppercorns 3–5 allspice berries (handwritten annotation indicates to bundle these ingredients) 10 c water 4 tablespoons beef base *handwritten annotation suggests substituting 2 bouillon cubes) ½ head cabbage 1 c celery, chopped 2 onions, chopped 2 carrots, chopped 1 pound sliced sausage 2 chicken breasts, cubed 1 cup ham, cubed 1 cup dry white wine 2 tablespoons capers (Handwritten annotation reads “continued on back.”) The index card overlaps the recipe page. The recipe visible on the page is as follows: 2. While the water boils [obscured] and carrots in a very large skillet. 3. When the onions start to brown, add the sausage, chicken, and ham to the pan. The sausage will release some fat, which will fry the chicken and ham. If omitting sausage, add oil or butter to the pan and cook until the chicken and ham are brown on all sides. 4. Add the contents of the skillet to the cooking pot. Add tomato paste to the skillet and stir until it starts to brown; then, add the white wine and dill pickles to the skillet. Stir to loosen all fond from the bottom of the pan, then transfer contents of the skillet to the cooking pot. 5. Add capers, olives, and stewed tomatoes to the cooking pot. Simmer 5–10 minutes until heated through. (Handwritten annotation reads “*try pepperoncinis”) 6. Serve with dill or sour cream A handwritten note in different handwriting from the recipe annotations, in red marker, reads: “Peter??” followed by a series of runes. Next to that, running up the side of the page, a handwritten note in sweet cursive, also in red marker, reads “I say we trust him :) -morrow”

The post Have You Eaten? Part 2: Dinner with Peter appeared first on Reactor.

Have You Eaten? Part 3: Morrow’s Comfort [Original Fiction Archives - Reactor]


Author’s note: This story contains fictional depictions of intimate partner violence.


Fen’s Sister’s Gnocchi

350 g butternut squash
1 egg
2–3 cups flour
Salt
Pepper

  1. Cut the squash in half. Rub it all over with oil. Place it face down on a baking sheet and roast at 425 degrees for 25 minutes.
  2. Remove the squash from the oven and let it cool completely, about 1 hour.
  3. Remove the peel and mash the squash into a smooth paste. Form the paste into a mound and form a well in the center.
  4. Crack 1 egg into the well. Stir with fingers to combine.
  5. Add flour in batches, working the flour in until a sticky, firm dough forms. Add a big pinch of salt and a healthy amount of pepper with the first batch of flour.
  6. Knead for 1–2 minutes.
  7. Form into a ball and rest for 20 minutes.
  8. Cut the ball into eight equal parts. Roll each part out into a snake the width of your thumb. Cut each snake into 1-inch sections using a knife or pasta cutter.
  9. Bring a large pot of water to a rolling boil. Add the gnocchi in batches, stirring gently once to prevent sticking. Once the gnocchi bob to the top of the water, remove/drain and serve.
  10. Optional: Fry after boiling to get a crisp exterior.

Suggested lemon ricotta sauce: Combine the zest of 1 lemon, 1 cup ricotta, lots of black pepper, and about 1 ladleful of pasta water. Stir to combine. Consistency should be thick and smooth.


The old farmhouse has thin walls, so everyone in the kitchen knows it when Peter and Morrow go from fucking to fighting. The soft thumps and creaks from upstairs are interrupted by the sound of Morrow asking a question over and over, at increasing volume, and then there’s a crash that is unmistakably the sound of a body hitting a wall. And then another crash, that is unmistakably the sound of the same body hitting the wall again.

Quan is the first one to move. He and Harper and Fen have been processing oranges all morning for Missus Bouchard. They’ve been seated at the kitchen table—Quan slicing off thin curls of peel, Harper pulling off the white pith, Fen smashing the oranges through a wide-mesh strainer and into a huge pot in her lap. Quan still has the paring knife in his hand as he gets to his feet and heads for the stairs at the sound of the second impact.

Fen is next. She sets the pot on the table, careful even in her haste—that pot of pulp is their days’ rent—and by the third time they hear the body hit the wall, she and Quan are halfway up the stairs.

Harper doesn’t follow right away, because Fen is already on the way, and they don’t want to move until they know there’s a real problem. They finish pulling pith off the orange in their hand, adding it to the pile of foamy white discard on the scarred wooden kitchen table. They listen as, upstairs, Quan and Fen burst into Peter and Morrow’s bedroom. They don’t stand up until they hear Fen’s voice shouting a clear, high “What the fuck?!”

At the sound of that, Harper sets down their orange and makes for the stairs. They take their time. With each step they ascend, they hear the voices upstairs rise. Everyone is talking over each other. Harper can make out “explain” and “are you really” and “don’t fucking move” and “Daneka.”

They stand in the bedroom doorway and take in the scene. Morrow is in their underwear, breathing like a street-loose bull. Peter is curled at Morrow’s feet, naked, head tucked, hands clasped protectively over the back of his neck. Quan and Fen are standing near the bed, peering down at an unfamiliar white palmset.

Harper leans against the doorframe. “S’goin’ on?”

Morrow looks up. Their face is alight with rage. “He’s not who he says he is.”

“I never said I didn’t know her,” Peter says. The words come out muffled, thick with pain. “Babe, please. If you’ll just let me explain—”

Morrow’s body twists with liquid speed. They drive their heel hard into the back of Peter’s thigh, and the bone-deep thump of the impact shakes the air in the room. “We’ve been here for a fucking month,” Morrow says. They usually keep their voice small. It is not small now. “And you never thought to mention that you know Daneka? Never occurred to you?”

Harper straightens, their brows drawing together. “Wait. He knows Daneka?”

Fen is still staring down at the palmset. “Seems like.”

They kick out again, but Peter has curled himself up tighter, and the blow doesn’t land as hard this time. “You didn’t think you should tell us? Not once when we’ve been sitting around talking about how worried we are? Not once when you were inside of me?”

“Morrow, maybe you don’t want to—” Quan says, but Fen puts a hand on his shoulder and he falls silent.

Morrow squats down and grasps a fistful of Peter’s hair, wrenching his head back. “You remember what Fen said when we first met you?”

Peter looks up at Morrow the way a broke-neck deer on the side of the road looks at the receding taillights of the truck that put it there. Blood coats his lips and chin. “Wh—?”

“She said that if you fuck around,” Morrow growls, “you’ll find out.”

The hand that isn’t clenched around Peter’s hair forms a fist. The fist is the size of a brick. The fist is the weight of a brick. The fist is as hard as a brick. Peter closes his eyes, tries to twist out of Morrow’s grip as they draw the fist back, but there’s nowhere to go.

The blow lands with killing force. Fen and Quan and Harper feel it in their teeth and all of them wonder at the same time whether they’ve just watched a man die. But then Morrow pulls the fist back again, and Peter sucks in a breath of whistling pain, and they know that—at least for now—he’s alive.

 Before Morrow can strike Peter again, Harper is out of the doorway and in the room. They step in close enough to press the front of their thigh against the bloody plane of Morrow’s knuckles. “Don’t,” they say. So Morrow doesn’t.

Harper and Quan grab Peter by the underarms and haul him to his feet. “Fen, you got Morrow?”

“On it.”

“We’ll be right back.” Harper says. They and Quan drag Peter down the stairs without stopping to let him get his feet under him. After a minute, the front door of the old farmhouse slams.

Fen looks at Morrow, trying to decide what kind of help they might need. She’d said “on it” when what she’d really meant was “you go ahead and handle what you’re handling, you can trust that I’ll handle things up here.” But she doesn’t know what handling things up here actually means.

“Is all his stuff in his bag?” Fen finally asks. Morrow shakes their head, points to a pile of clothes in one corner. Fen shoves the clothes into the now-familiar duffel, then opens the window and peers down at the naked, bleeding man in the front yard. “Catch,” she calls, and then she drops the bag out the window. She doesn’t wait to see if it falls on top of him.

As she turns around, Morrow is pulling on a shirt. “Sorry you had to see that,” they say softly.

Fen doesn’t say that it’s okay, because she knows Morrow’s not okay. And she doesn’t say that she’s surprised Morrow let Peter live, because that would only make them feel worse about letting out the violence they work so hard to contain. She doesn’t say that she can’t believe what she saw on Peter’s palmset, because she doesn’t want to remind Morrow of the thing that made them let their fury loose in the first place.

So she shoves her hands into her pockets and asks, “You hungry?”

Morrow looks up at her and their face is raw and their eyes are shining and she can see all the way down the deep dark tunnel that shame has drilled through them. “Yeah,” they say. They’re obviously lying, but that doesn’t matter. As long as they’re answering at all. As long as they’re still here.

“It’s almost time for lunch. Come downstairs. I’m gonna make something cool.”

Quan and Harper are waiting for them in the kitchen. They’re back to peeling oranges, and the bright fog of citrus oil is overwhelming. It smells like a day in the sun. Morrow flinches a little, then breathes in deep through their nose. They linger in the kitchen door, filling the frame, watching Quan strip curls off an orange with that tiny paring knife. “How’d Missus Bouchard get oranges all the way up here this time of year?” they ask at last.

“I guess her husband seized them at the border crossing,” Quan answers. He doesn’t add a barb—gentleness is something he’s been trying on lately, with mixed success, but it’s a relief that he’s managing it right now.

“Yeah, he pulled the truck out of line right before he got sick,” Fen adds. “Missus Bouchard told me this morning. She said State BP was so tied up with trying to deny his sick leave that they didn’t notice the seized oranges never ended up anywhere.”

Harper snorts. “I believe her exact words were, ‘If they want the fucking oranges they can come try me.’”

Morrow’s face twitches in the same place a smile would go.

They take over for Fen at the strainer, smashing the peeled oranges with a wooden spoon. Their movements are methodical, rhythmic. The work needs doing, and they need to do it until they’re back in their own body, their own mind. Their own promises to themself.

This is how the four of them—five, including Peter—have been earning their keep at the Bouchard farm for the past month. They’ve doing odd jobs in exchange for permission to sleep in the old farmhouse on the Bouchard property, biding their time while they wait for Bouchard himself to recover from the SARS-15 that’s currently keeping him bedbound. Once he’s well enough to get back to work at the border crossing, they’ll be able to get into Illinois safely.

To Chicago. Maybe, if everything goes right, to Daneka.

Fen and Quan are thinking about Daneka right now. About her face in that video on Peter’s palmset. Harper didn’t see it, and they’re waiting to hear about it so they can understand what happened upstairs. Morrow isn’t thinking about anything. They can’t, not after what just happened upstairs. Their skull is filled with soft white static, like the pith that cushions the wet flesh of an orange.

Fen consults a recipe card from her family recipe box. She cleans the counter thoroughly, scrubbing it down with soap and hot water twice over. Then, when she’s satisfied that the counter is ready, she pulls a pan out of the oven. It has the leftover half of a roasted butternut squash on it. The other half was dinner the night before, shared between the five of them along with a few eggs from Missus Bouchard’s chickens. This half has been sitting in the oven waiting to get used for something.

Fen knows what she wants to do with it now. She uses a spoon to scrape the peel away from the flesh of the roasted squash, then crushes it into paste with her hands. She scoops the paste right onto the clean kitchen counter, shapes it into a hill, and makes a divot in the center of the pile.

“Morrow, can you give me a hand?” She holds up her palms, which are coated in sticky orange squash. “I’m all gross.”

Morrow looks up at her with empty eyes. “Sure. What do you need?”

At Fen’s instruction, Morrow pulls out the last of Missus Bouchard’s eggs and cracks it into the well in the middle of the crushed squash. She mixes the egg and the squash with her hands. The mixture makes a shockingly awful wet noise that draws a cackle out of Quan and a skeptical frown out of Harper.

Then Fen asks Morrow to grab the flour. Missus Bouchard gave a full sack of good white flour to Harper as payment for a full day of fence repair, and they’ve got half the sack left. It looks to be made from an old version of the Wisconsin state flag, from back before the state took the e pluribus unum seal off and replaced it with a second, larger badger.

Morrow stares down at the deep blue fabric blankly until Fen says their name. She has them add a fistful of flour to the heap of goo in front of her. Just a fistful. Then another, and then another, slowly. At first Fen uses her fingers to gently stir, mixing the flour in; then her hands begin to knead as the combination forms a thick dough that pulls away from the surface beneath it. Soon enough, the dough in front of Fen has turned into a smooth orange ball.

Morrow is watching her hands, the dough, the nearly clean counter. Some of the blankness is melting away from their face. “That was cool,” they murmur.

Fen smacks the taut surface of the dough with her palm. “Gotta let it sit for twenty minutes. Then I’ll need your help again.”

“Twenty minutes,” Harper says, not looking up from the half-cleaned orange in their hands, “seems like exactly the right amount of time to talk about what happened upstairs.”

Fen draws a slow breath. Quan puts down his paring knife. Morrow’s shoulders slump. Harper looks to each of them with hard, patient eyes.

Morrow speaks first. “I don’t know how to explain the video.”

“How did you even see the video?” Quan asks. “Weren’t you two right in the middle of—”

“His palmset was on the nightstand. I saw Daneka’s name come up on a notification,” Morrow says. They’re speaking like there’s a candle in front of their lips that mustn’t go out. The others lean forward to hear. “I grabbed it and looked. He tried to stop me, but he— that was a mistake. You know?”

Harper nods. They understand mistakes like this one better than anyone. “Did you see the whole thing?”

Morrow shrugs. “It was a video. I saw it, but he was trying to explain and get the palmset away, so I didn’t really get to watch all the way through. Quan and Fen did, though, I think.”

“Sort of,” Quan says. “But I didn’t understand what I was seeing.”

Fen’s got her arms folded tight across her chest. She’s chewing on the inside of her cheek. She drops her chin to her chest and her dark curls, longish now and dry from travel, fall over her eyes. Her deliberation lasts long enough to fill the kitchen with a low hum of tension.

Quan snaps first. “For fuck’s sake. What?”

Fen looks up at him, eyes narrowed. “I’m thinking.”

“Obviously.”

“I’m thinking about whether the thing I wanna say is a bad idea. For Morrow.”

Morrow’s brow tightens. “For me?”

“I don’t want this to make things harder for you.”

Harper cracks a knuckle against the table. “I think,” they say, “Morrow can handle themself.”

“I know that,” Fen says. “We all know that. I’m more worried about—” And then she stops herself, because she doesn’t know how to say what she’s worried about. It’s the tight coil of violence that lives in the center of Morrow, it’s the whipcrack of their fist, it’s the way they stop feeling pain when it’s someone else’s turn.

Morrow’s shoulders draw down toward their sternum and their eyes find a spot on the floor. “I promise I won’t hurt any of you,” they whisper. “No matter what you saw on that palmset. I wouldn’t. I won’t.”

Quan rubs his forehead with the heel of one hand. His eyes have gone glossy. “Fen’s not afraid of you. Nobody here is afraid of you. It’s just—”

“I don’t want to make it harder,” Fen says again. “But. Okay.” She untucks one arm from across her chest and reaches into her back pocket. When her hand reappears, she’s got the white palmset between her index and middle fingers. “I kept this.”

Harper rises and crosses the kitchen. Their movements are slow, their knees soft, their footfalls quiet. They slowly put their body between Morrow and Fen before taking the palmset out of Fen’s hand. Their back is still toward Morrow when they say, “I don’t know if Morrow wants to see this.”

“I do,” Morrow says quickly. “I want to see her.”

Quan drums his fingers on the table. “Morrow is fine. You two need to calm down.”

The way Harper turns to face Quan has just as much danger in it as the fist Morrow made an hour before. “You want me more calm than I am now?”

“I’m not fine,” Morrow cuts in. “But that’s okay. I want to see the video. The video isn’t the thing that made me—um.” They swallow hard. “That made me upset. I don’t think it’ll make me upset again now.”

Harper approaches the table and stands next to Quan. Morrow moves to stand next to them. They rest their palms flat on the surface of the table. Their knuckles are swelling; a deep red bruise is forming on the biggest knuckle of their right hand. Fen winds up behind Quan’s chair. She tugs on his hair and he swats her hand away.

The video is one of many in a long series of messages from Daneka to Peter. There are no responses from Peter in the chat. All of Daneka’s messages are videos, going back about a month.

“What was the date when we met Peter?” Fen asks softly.

“Not sure,” Quan replies.

Morrow sniffs. “It was about a month ago. But I’m not sure if it was before or after that first message from Daneka.”

They play through the videos, and it quickly becomes clear that they’re all the same video. Kind of. In each one, Daneka stands in a field, squinting into bright sunlight, shading her eyes with the flat of her hand. Her auburn curls toss wildly in a strong wind. There are flowers behind her, yellow and white ones, and some trees in the middle distance. She turns slowly to reveal a massive, shining lake that stretches to the horizon. As she’s turning, she speaks, her voice cigarette-raspy and wind distorted but still as musical as always. “You guys wouldn’t believe how beautiful it is here! I found the most amazing queer community. We have our own little farm and a communal kitchen that Fen’s gonna love! Come soon? I miss you!”

Then she blows a kiss into the camera, and the video is over.

The four of them watch each video. The first one doesn’t have the kiss—it just cuts off after “I miss you.” In the second one, Daneka just says “amazing community,” but in the third one, the word queer comes back in. Sometimes the flowers change color. Sometimes it seems to be later in the day, sometimes earlier. The second-to-last video is where the line about the communal kitchen appears.

Harper blows out a slow breath. “So.”

“We’re fucked,” Quan says. “Should have let Morrow kill him.”

Fen scrubs her hands across her upper arms. “We’re not fucked yet.”

Quan twists in his chair to look at her. “Explain how. That guy is clearly working with someone who wants to fuck us over somehow, and who has the ability to make this quality of deepfake. Peter knows who we are, and he knows where we are, and he knows where we’re going. Show me a gap we can slip out of. Tell me what I’m missing here.”

“Right,” Fen says. “That dough’s been resting long enough. Morrow, want to help me get lunch going?”

Quan throws his hands into the air. “Great. Yeah, go cook. I’ll just sit here and wait for sirens.”

Fen walks into the kitchen. Her lips are tight. She grabs the big kitchen knife and uses it to cut the ball of dough into eight sections, never letting the blade come into contact with the countertop. “I just need to think.”

“What’s there to think about? We need to leave. I’m going to go pack. Harp, want me to pack up your stuff too?”

“Not yet,” Harper replies, their eyes fixed on Fen. “I want us to have a plan first.”

“I need a minute to think,” Fen says again.

Harper’s reply is low. “I heard you the first time. I’m not rushing you. Don’t let Quan get in your head.”

“He’s not in my head.”

Harper doesn’t say anything to that. They don’t need to.

Fen gives Morrow an are you helping or not look, and Morrow comes to the kitchen. Fen sprinkles flour across the countertop, then demonstrates how to roll each section of dough into a long snake. The width of the snake is halfway between Morrow’s massive thumb and Fen’s slender one. “Gentle hands,” Fen says. “The squash makes the dough break easier.”

Morrow’s hands are gentle. They’re as gentle as a kid holding an egg, as gentle as a cat pawing at a cobweb. They don’t break the dough. Fen leaves them to the work of rolling out the sections while she fills a tall pot with water.

“I think we do need to leave,” she says slowly. “But I don’t think it’s an emergency.”

At the kitchen table, Harper has taken up Quan’s paring knife and is methodically peeling oranges. “Why not?”

“Because whoever Peter was working with—if they’re after us, they already know where we are, right? It’s not like he can go bring them any new information.”

“But now they know that we know that they know.” Harper pauses, mouthing the sentence to themself again to make sure they’ve gotten it right. “They aren’t spying on us in secret anymore.”

“So there’s no reason not to just come scoop us up directly,” Morrow murmurs. “I’m done with these, Fen.”

Fen looks over the lengths of dough and smiles. “These are perfect.” She hands Morrow the big knife, handle-first, and shows them how to cut the dough into inch-long sections. “It’s good for them to be kind of pinched down at the edges like that. I don’t think they’re going to come scoop us up from here. They wouldn’t raid this place.” She doesn’t pause between these two sentences, and it takes both Harper and Morrow a moment to realize that they’re not connected.

“Because Bouchard’s a statie?” Harper considers this. “I don’t know.”

Morrow frowns down at the dough as they cut it. “He’s a state border cop. Border cops and regular cops don’t protect each other the same way they protect themselves.”

“We don’t know that Peter’s working with state cops. Could be feds,” Harper offers.

Fen leans her elbows on the kitchen counter and buries her face in her hands. “We can’t know. And if we don’t know what’s coming, then we can’t stay here. But if we run—if we don’t get to Chicago . . . Fuck. That’s where I told Daneka we’d be. We’ll miss her if we don’t find a way into the state and this is our best bet.”

“I’m done with these,” Morrow says again, gesturing to the neat piles of miniature pillows on the counter.

Harper drops the last peeled orange into the pile on the table. “Perfect timing. Morrow, you come pull pith off these things. I gotta go.”

Fen lifts her head out of her hands. “You’re leaving?”

Harper grabs their jacket off the back of a kitchen chair. “Not leaving-leaving. Just heading over to the New House to talk to Missus Bouchard.”

“About what?”

They pull the jacket on. “To tell her we’re almost done prepping her fruit for marmalade. And to ask after her husband. Maybe he’s ready to go back to work. Maybe he’s picking up a shift tomorrow.”

“There’s no way,” Fen says warily. “She’d have said something if he was better.”

Harper shrugs. “S’polite to ask. Morrow, finish off these oranges so I can bring Missus Bouchard over to pick up her pot of goo. And Fen?”

Fen waits.

“Don’t worry,” Harper says. It’s almost soft, the way they say it. “I’m not leaving you alone. Not yet.”

And then they’re gone.

Morrow sits at the dining table and starts picking pith off the oranges with quick, careful fingers. Behind Fen, the water on the stove starts to boil. She heaves a hard, sharp sigh. 

“I’m sorry,” Morrow says after a few minutes.

Fen drops two handfuls of gnocchi into the boiling water. “For what?”

“For being scary. Don’t say I wasn’t, I know I was.”

Fen nods down into the pot as she gives the water a gentle stir. “You were. But it’s okay. You were keeping us safe.”

They’re quiet for a long time. Then, so softly Fen almost doesn’t hear it at all, they murmur, “I don’t want to be a guard dog.”

Quan comes stomping down the stairs before Fen can reply. “There’s blood all over the floor in that bedroom. We got time for me to clean it up before we go?”

“Plenty of time,” Fen says. She and Quan negotiate around each other in the kitchen—the sink is too close to the stove, and there’s not quite room for her to watch the pot while Quan rummages for cleaning supplies. When Quan straightens, a rag in one hand and an unlabeled spray bottle in the other, he and Fen are only a couple of inches apart.

 He studies her face for a moment. “Are we fighting?”

“No,” Fen says firmly. Then she lets herself smile. “We’re just figuring things out. All of us. Me and Harper are working on a plan. It’s gonna be okay.”

“You’re sure?” Quan studies Fen’s eyes, her forehead, her mouth. “Is Harper leaving?”

“They said they’re not. I believe them.”

“If they leave . . . will you go with them?”

Fen blinks rapidly. “If Harper leaves, I don’t think they’d want anyone to come with them. But they’re not leaving, so it doesn’t matter, right?”

“Sure. And we’re not fighting?”

It pulls a little smile out of Fen, finally, Quan asking this again. “We’re not fighting.”

“Good.” Quan kisses Fen on the forehead once, quickly and lightly, and then he’s gone, long strides carrying him out of the kitchen.

Fen blinks at the space where Quan was standing a moment before. She turns wide eyes toward Morrow. “Did you—?”

Morrow stares back, their brows nearly touching their hairline. “I saw. Are you two . . . ?”

“No,” Fen replies. “Not that I know of. Maybe—no. Right?”

Morrow doesn’t have an answer for her. 

In the pot, the gnocchi are starting to bob to the surface. Fen thinks of Daneka’s hair in the video, the way it tossed in the wind. She heats a pan on the other burner, drops a knob of butter from Missus Bouchard’s huge ornery cow onto the heat, and waits for it to melt and sizzle. She thinks of Daneka’s eyes in the video. Once the butter starts turning golden, she scoops the cooked gnocchi out of the pot with a slotted spoon and drops them into the butter to fry. She thinks of the shine of that vast lake. She puts more gnocchi into the pot, and works in batches to boil and fry them.

She thinks of Quan’s lips on her forehead, and she smiles down into the sizzling pan.

As the house fills with the smell of browning butter, Morrow pulls the pith off oranges, and Quan scrubs the floorboards, and Harper charms an answer out of Missus Bouchard. The sun outside is high and bright. It shines on the old farmhouse, and the big new one on the other side of the property, and the milking shed and the chicken coop and the feed shed, and somewhere out there, it shines on Peter, too.

Fen sprinkles salt a pile of toasted, butter-glossy gnocchi.  “Come get a plate,” she calls. She knows the only people who can hear her are Morrow and Quan, but part of her is calling out to Daneka, wherever she is. Part of her is making a plate for Daneka. Part of her is cooking for Daneka, every time she cooks. Every meal.

She doesn’t wait for anyone to come running before she grabs a fork. The bite she takes is too hot.

She closes her eyes and lets it burn her tongue.


Fen and Morrow’s Gnocchi

Half of a butternut squash
1 egg
2–3 cups flour
Salt
Pepper

  1. Place the half-squash face down on a baking sheet. Rub it all over with butter. Roast at 425 degrees for 25 minutes.
  2. Remove the squash from the oven and let it cool completely.
  3. Remove the peel and mash the squash into a smooth paste. Form the paste into a mound and form a well in the center.
  4. Crack 1 egg into the well. Stir with fingers to combine.
  5. Add flour in batches, working the flour in until a sticky, firm dough forms.
  6. Knead for 1–2 minutes.
  7. Form into a ball and rest for 20 minutes. *This is the perfect amount of time for a hard conversation.
  8. Cut the ball into eight equal parts. Roll each part out into a snake the width of someone’s thumb. Cut each snake into 1-inch sections using a knife or pasta cutter.
  9. Bring a large pot of water to a rolling boil. Add the gnocchi in batches, stirring gently once to prevent sticking. Once the gnocchi bob to the top of the water, remove.
  10. Melt butter in a skillet over medium heat. Once the butter starts to brown, fry gnocchi in batches.
  11. Sprinkle with salt and pepper and eat piping hot.

A recipe card, typewritten on an index card, stapled to a torn sheet of notebook paper with a typewritten recipe on it. Both are weathered, torn, stained, and annotated. The card is on top of a hefty wooden cutting board, and is surrounded by a bowl of lemons, a dish of eggshells, a cut lemon, a repurposed breath mints tin containing mixed pills including estrogen/estradiol and antidepressants, and scattered flour. Much of the recipe card is obscured by the eggshells. Visible recipe text is as follows (all is typewritten unless otherwise indicated; see story text for recipe in full): On the recipe card: a handwritten note reading ‘rub all over with oil including the peel!!!’ is overlapped by a handwritten note in different handwriting, in red marker, which reads: “WI / IL border crossing 04:30 AM Bring CASH and MEDS 4 guard don’t be late!!!!!!!” The index card overlaps the recipe page. The recipe visible on the page is as follows: 5. Add flour in batches, working the flour in until a sticky, firm dough forms. 6. Knead 1–2 mins 7. Form into a ball and rest for 20 mins 8. Cut the ball into 8 equal parts. Roll each part out into a snake the width of your thumb. Cut each snake into 1-inch sections using a knife or pasta cutter. 9. [after this point, the recipe card is folded and obstructs part of each line.] Bring a large pot of water to a rolling b. Add the gnocchi in batches, stirring gent … void sticking. Once the gnocchi bob … the water, remove/drain and serve. Partially obscured handwritten annotation reads: Fry after boiling to [text obscured]

The post Have You Eaten? Part 3: Morrow’s Comfort appeared first on Reactor.

Feeds

FeedRSSLast fetchedNext fetched after
@ASmartBear XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
a bag of four grapes XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Ansible XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
Bad Science XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Black Doggerel XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
Blog - Official site of Stephen Fry XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Charlie Brooker | The Guardian XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Charlie's Diary XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Chasing the Sunset - Comics Only XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Coding Horror XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
Comics Archive - Spinnyverse XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
Cory Doctorow's craphound.com XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Cory Doctorow, Author at Boing Boing XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
Ctrl+Alt+Del Comic XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Cyberunions XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
David Mitchell | The Guardian XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
Deeplinks XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
Diesel Sweeties webcomic by rstevens XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
Dilbert XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Dork Tower XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Economics from the Top Down XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
Edmund Finney's Quest to Find the Meaning of Life XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
EFF Action Center XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
Enspiral Tales - Medium XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Events XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Falkvinge on Liberty XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Flipside XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Flipside XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Free software jobs XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
Full Frontal Nerdity by Aaron Williams XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
General Protection Fault: Comic Updates XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
George Monbiot XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
Girl Genius XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
Groklaw XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Grrl Power XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Hackney Anarchist Group XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Hackney Solidarity Network XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
http://blog.llvm.org/feeds/posts/default XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
http://calendar.google.com/calendar/feeds/q7s5o02sj8hcam52hutbcofoo4%40group.calendar.google.com/public/basic XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
http://dynamic.boingboing.net/cgi-bin/mt/mt-cp.cgi?__mode=feed&_type=posts&blog_id=1&id=1 XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
http://eng.anarchoblogs.org/feed/atom/ XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
http://feed43.com/3874015735218037.xml XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
http://flatearthnews.net/flatearthnews.net/blogfeed XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
http://fulltextrssfeed.com/ XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
http://london.indymedia.org/articles.rss XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
http://pipes.yahoo.com/pipes/pipe.run?_id=ad0530218c055aa302f7e0e84d5d6515&amp;_render=rss XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
http://planet.gridpp.ac.uk/atom.xml XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
http://shirky.com/weblog/feed/atom/ XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
http://thecommune.co.uk/feed/ XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
http://theness.com/roguesgallery/feed/ XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
http://www.airshipentertainment.com/buck/buckcomic/buck.rss XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
http://www.airshipentertainment.com/growf/growfcomic/growf.rss XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
http://www.airshipentertainment.com/myth/mythcomic/myth.rss XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
http://www.baen.com/baenebooks XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
http://www.feedsapi.com/makefulltextfeed.php?url=http%3A%2F%2Fwww.somethingpositive.net%2Fsp.xml&what=auto&key=&max=7&links=preserve&exc=&privacy=I+accept XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
http://www.godhatesastronauts.com/feed/ XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
http://www.tinycat.co.uk/feed/ XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
https://anarchism.pageabode.com/blogs/anarcho/feed/ XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
https://broodhollow.krisstraub.comfeed/ XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
https://debian-administration.org/atom.xml XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
https://elitetheatre.org/ XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
https://feeds.feedburner.com/Starslip XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
https://feeds2.feedburner.com/GeekEtiquette?format=xml XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
https://hackbloc.org/rss.xml XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
https://kajafoglio.livejournal.com/data/atom/ XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
https://philfoglio.livejournal.com/data/atom/ XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
https://pixietrixcomix.com/eerie-cutiescomic.rss XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
https://pixietrixcomix.com/menage-a-3/comic.rss XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
https://propertyistheft.wordpress.com/feed/ XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
https://requiem.seraph-inn.com/updates.rss XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
https://studiofoglio.livejournal.com/data/atom/ XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
https://thecommandline.net/feed/ XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
https://torrentfreak.com/subscriptions/ XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
https://web.randi.org/?format=feed&type=rss XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
https://www.dcscience.net/feed/medium.co XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
https://www.DropCatch.com/domain/steampunkmagazine.com XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
https://www.DropCatch.com/domain/ubuntuweblogs.org XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
https://www.DropCatch.com/redirect/?domain=DyingAlone.net XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
https://www.freedompress.org.uk:443/news/feed/ XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
https://www.goblinscomic.com/category/comics/feed/ XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
https://www.loomio.com/blog/feed/ XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
https://www.newstatesman.com/feeds/blogs/laurie-penny.rss XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
https://www.patreon.com/graveyardgreg/posts/comic.rss XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
https://www.rightmove.co.uk/rss/property-for-sale/find.html?locationIdentifier=REGION^876&maxPrice=240000&minBedrooms=2&displayPropertyType=houses&oldDisplayPropertyType=houses&primaryDisplayPropertyType=houses&oldPrimaryDisplayPropertyType=houses&numberOfPropertiesPerPage=24 XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
https://x.com/statuses/user_timeline/22724360.rss XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
Humble Bundle Blog XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
I, Cringely XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Irregular Webcomic! XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
Joel on Software XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
Judith Proctor's Journal XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
Krebs on Security XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
Lambda the Ultimate - Programming Languages Weblog XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
Looking For Group XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
LWN.net XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
Mimi and Eunice XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Neil Gaiman's Journal XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
Nina Paley XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
O Abnormal – Scifi/Fantasy Artist XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Oglaf! -- Comics. Often dirty. XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Oh Joy Sex Toy XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
Order of the Stick XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
Original Fiction Archives - Reactor XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
OSnews XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Paul Graham: Unofficial RSS Feed XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Penny Arcade XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Penny Red XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
PHD Comics XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Phil's blog XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
Planet Debian XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Planet GNU XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
Planet Lisp XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Pluralistic: Daily links from Cory Doctorow XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
PS238 by Aaron Williams XML 11:56, Sunday, 26 April 12:44, Sunday, 26 April
QC RSS XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
Radar XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
RevK®'s ramblings XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
Richard Stallman's Political Notes XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Scenes From A Multiverse XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
Schneier on Security XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
SCHNEWS.ORG.UK XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
Scripting News XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Seth's Blog XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
Skin Horse XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Tales From the Riverbank XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
The Adventures of Dr. McNinja XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
The Bumpycat sat on the mat XML 12:07, Sunday, 26 April 12:47, Sunday, 26 April
The Daily WTF XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
The Monochrome Mob XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
The Non-Adventures of Wonderella XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
The Old New Thing XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
The Open Source Grid Engine Blog XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
The Stranger XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
towerhamletsalarm XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
Twokinds XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
UK Indymedia Features XML 12:21, Sunday, 26 April 13:03, Sunday, 26 April
Uploads from ne11y XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
Uploads from piasladic XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April
Use Sword on Monster XML 11:49, Sunday, 26 April 12:36, Sunday, 26 April
Wayward Sons: Legends - Sci-Fi Full Page Webcomic - Updates Daily XML 11:56, Sunday, 26 April 12:42, Sunday, 26 April
what if? XML 12:07, Sunday, 26 April 12:48, Sunday, 26 April
Whatever XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
Whitechapel Anarchist Group XML 11:49, Sunday, 26 April 12:38, Sunday, 26 April
WIL WHEATON dot NET XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
wish XML 11:42, Sunday, 26 April 12:27, Sunday, 26 April
Writing the Bright Fantastic XML 11:42, Sunday, 26 April 12:26, Sunday, 26 April
xkcd.com XML 12:21, Sunday, 26 April 13:04, Sunday, 26 April