Sharing The Garden by ivymug [Oh Joy Sex Toy]
Urgent: Protect independence of Office on Violence Against Women [Richard Stallman's Political Notes]
US citizens: call on Congress to protect the independence of the Office on Violence Against Women.
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: Law to prohibit the bully's slush fund [Richard Stallman's Political Notes]
US citizens: call on Congress to pass a law prohibiting the bully's slush fund (paid by the treasury and available to reward whoever he chooses).
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.
Government of Somalia arrested and tortured journalists [Richard Stallman's Political Notes]
The US-supported government of Somalia arrested and tortured journalists, then thugs threatened to kill them if they continued covering the case of a woman who reports being tortured in prison.
I am curious why they tortured that woman. I suppose it was for political reasons, but what reasons? What criticism is it that those thugs really want to suppress?
Countries with longer average working hours [Richard Stallman's Political Notes]
Countries with longer average working hours tend to have more obesity.
Directors of documentary NAZA called traitors [Richard Stallman's Political Notes]
Israel's Minister of Culture, Miki Zohar, called the (Israeli) directors of the documentary NAZA "traitors" and said he would cancel their citizenship.
The documentary shows Israelis' choosing to put the lives of Palestinian noncombatants in danger, with the result of killing many of them.
In the eyes of officials committed to burying the truth, citizens who don't support the mandatory lies are "traitors".
Public right to oppose mine projects [Richard Stallman's Political Notes]
The plutocratist party that governs Queensland proposes to eliminate the public's right to oppose mine projects.
This is in the name of "streamlining" decisions to let rich people destroy nature and public health.
Limits on foreign students and journalists in US [Richard Stallman's Political Notes]
*Judge blocks the bully's new short limits on how long foreign students and journalists can stay in US.*
Aviation tax discount on private jets [Richard Stallman's Political Notes]
Private jets get a substantial discount in the US on their aviation tax
The article says they are also "more polluting", and it could well be true, but the claim is not precise enough for me to tell whether it means anything.
Israeli "double-tap" strike [Richard Stallman's Political Notes]
*Witnesses recount Israeli "double-tap" strike that killed child and medic in Gaza.*
Proof writers jailed in 2001 are still alive [Richard Stallman's Political Notes]
A prestigious demand to the government of Eritrea for proof that writers jailed in 2001 are still alive.
Communication/surveillance app for Russians [Richard Stallman's Political Notes]
Putin has ordered Russians to use a new communication/surveillance app and various institutions are pressuring people to switch to it for various purposes. It implements full surveillance of most activities on the phone. It fully demonstrates the Orwellian potential of the nonfree software and malicious hardware in those devices.
If I needed to use such an app to get into school buildings and my dorm, I think I could develop a non-computerized method of cooperation for door opening.
Mahmoud Khalil has published a memoir [Richard Stallman's Political Notes]
Formerly imprisoned US protester Mahmoud Khalil has published a memoir about the persecutor's efforts to expel him from the US for peaceful protest.
He points out another injustice of private prisons: they make more money if they keep you in prison longer. This is in addition to various other injustices.
He says "Columbia turned out to be a real estate empire with a campus attached"; its board of trustees is "not so much a neutral administrative body as a deeply ideological one … drawn overwhelmingly from finance, real estate, corporate law, and weapons manufacturers."
If you want to buy this book, or any book, I urge you not to use nonfree software to do it, and especially not Amazon.
Non-profit medical joint ventures with private equity [Richard Stallman's Political Notes]
Nonprofit medical treatment organizations are increasingly setting up joint ventures with private equity, whose values are typically "profit regardless of the consequences".
These joint ventures often permit extraction of additional profit from the medical activities.
Candidates for county prosecutor in Minneapolis [Richard Stallman's Political Notes]
Two competing candidates for county prosecutor in Minneapolis claim each to be the best for prosecuting deportation thugs.
I do not use the euphemistic term "ICE" for the deportation thugs, but I agree with the point.
Supposed Intelligence strange dialect of English [Richard Stallman's Political Notes]
Supposed Intelligence agents, when allowed to communicate directly, gradually developed a strange dialect of English, apparently for convenience of expression. Sometimes humans figure out the phrases, but that is not guaranteed.
This throws a wrench into plans to monitor agents for safety. We might not recognize that "linkmaxxing" means fabricating as many paperclips as possible.
Deportation thugs seized Nicaraguan exiled from Nicaragua [Richard Stallman's Political Notes]
The deportation thugs have seized Luis Galeano, a Nicaraguan exiled from Nicaragua for criticizing the dictatorship.
In general I would expect the persecutor to cozy up to dictator Ortega, because he generally wants to ally with dictators. Some Republicans in Congress are standing up for Galeano. I hope they stand firm for him, but I expect that the bully will bully them into supporting his line.
TV coverage pool declined to cover corrupter's event [Richard Stallman's Political Notes]
A TV coverage pool including ABC, CBS, CNN, Faux News and NBC declined to cover one of the corrupter's publicity events, because it was CNN's turn to cover this event and the corrupter had banned CNN.
Never energy-independent with fossil fuels [Richard Stallman's Political Notes]
*The Iran war reminds us: we'll never be energy-independent with fossil fuels.
Energy security comes from using local, renewable resources to power, heat and cool communities, as Ukraine is doing.*
Defending November election from magat thugs [Richard Stallman's Political Notes]
Planning to defend the November election from magat thugs, even if they are "official" federal thugs.
Transparency for companies in UK semi-colonies [Richard Stallman's Political Notes]
A few years ago, the UK agreed to require some associated semi-colonies to publicly record who owns each company. They agreed to do this, then they cleverly screwed up the implementation such that investigators can't get useful data.
Corrupter's henchmen laundered Venezuela's oil money [Richard Stallman's Political Notes]
The corrupter's henchmen took billions of dollars from Venezuela's oil money and laundered it. Now they refuse to say where it is, who has it, or who is receiving the interest on it.
Estimated deaths by Super El Niño [Richard Stallman's Political Notes]
Climate scientists estimate that the super El Niño will kill 450,000 people during the next 6 months.
Louis-Philippe Véronneau: Fake Cash: The World Trade Game [Planet Debian]

This is a new series1 I'm starting on the tools I have been crafting and buying to play pedagogical games in my Economics classes.
These games, aside from being just plain fun for the students, often aim to teach them a lesson via interactive play. Unsurprisingly, it is much easier for them to grok a particular concept this way. Moreover, many students told me these activities were the best part of the classes I teach.
I found out about The World Trade Game in The Handbook of Pluralist Economics Education2, which also contains many other fun pedagogical games. It was first developed by Action Aid, but has since been refined by John Sloman and then by Irene van Staveren, who wrote about her use of the game in the aforementioned book.
The goal of this blog entry is not to describe the game and teach you how to play it. If that interests you, either buy the book I mentioned or read about Sloman's version here.
No, our focus point here is the tools to play this game: fake cash! Fake cash can be used in many economics pedagogical games and in my opinion, is a worthwhile "investment" of your time and energy. You could indeed play with regular printed sheets of paper listing a value (I sure did!), but using Play Money (a more appropriate term, since we're not trying to defraud anyone) will up your game and create a more immersive atmosphere in your classes.
At first, I tried to buy play money. Surely, some commercial offering aiming to create realistic props for movies and TV productions existed? At least in Canada, it turns out the answer was no. The only thing I could find were shady websites and weird expensive listings on AliExpress. Not being tenured yet, I did not try to convince my employer to take a 50-50 chance on supporting criminal endeavours.
As such, the next best thing I found was printable play money designed by the Bank of Canada Museum. Their designs were quite nice and met my needs, but their PDF layout made it overly complicated to print large quantities of bills. As such, I played around with GIMP a little and came out with these files. A commercial printer shouldn't have issues printing them on glossy cardstock paper and cutting them up for you:
Once printed and cut, you'll unfortunately have to fold each bill by hand. To secure both halves, I ended up using a strip of transparent tape on each long edge.
Here is the result, with a real Canadian 20$ bill as a comparison:


Kentaro Hayashi: Building Mozc with dh-bazel, buildsystem support for debhelper [Planet Debian]

After bazel-bootstrap 7.7.1 was landed into Debian unstable, I'm working on packaging newer Mozc (Most famous Japanese input method editor) with Bazel.
Here is the blog entry initial efforts to build Mozc with Bazel at that time.
After that, newer Mozc packages are uploaded into experimental and moved to testing phase on experimental now.
When started packaging efforts for newer Mozc with Bazel, I'm a newbie to do it. Now I've got a knowledge to do it a bit, I want to know best practice on packaging X on Debian with Bazel furturmore.
Usually there are dh-X for buildsystem X on Debian, but it's not true for Bazel as far as I know. This is why I had started to write dh-bazel.
I've wrote initial dh-bazel prototype and post a mail to debian-bazel ML.
dh-bazel supports the following way:
%:
dh $@ --buildsystem=bazel
override_dh_auto_build:
dh_auto_build -- //:hello
If you want to build source under src, you could
write d/rule like this:
%:
dh $@
override_dh_auto_build:
dh_auto_build --buildsystem=bazel --sourcedirectory=src -- //:hello
dh-bazel is in very early stage prototype, but I have succeeded to build newer Mozc with some modifications to Mozc debian/rules on experimental with dh-bazel locally!
dh-bazel is a thin wrapper for Bazel, so it does not reduce packaging glitches dramatically, but it helps some sort of packaging tasks IMHO.
There are some achievement with dh-bazel
--override_module=, and so on)Note that it only simplify dh_auto_build stage, so
you must manually install artifacts with .install or something
correctly.
I hope that it will help package maintainer using Bazel in the future. (dh-bazel is not uploaded into debian/unstable yet, so stay tuned!)
Greener Grass Next Door [QC RSS v2]

she's very endearing
I loved the term Big Undo so much, of course I had to get the domain. I started putting up my usual placeholder site but realized I should do this page in Markdown, not HTML. It looks fabulous. Markdown is right. It's sobriety, go back to the beginning and put the potency in the ideas, give writers the space to write. Get the F out of my way with your freaky character limits. Anyway I'm full of manifesto these days. The money people strangled the web. I think it's time for the creative people to make it work for real.
Oldest GUI application that still runs on Windows 11 [OSnews]
What’s the oldest
Windows GUI application you can still run on Windows 11 today,
without any modifications? For now, the best answer Boris Popik can
come up with is an innocuous application from build 347 of Windows
NT 3.1, an early prerelease: CDPLAYER.EXE. You
can’t go any older than that, because earlier prerelease
builds had not yet finalised its PE format and calling convention.
Neat find.
Popik also mentions a few other contenders, but I won’t spoil those here.
Another month of Redox improvements [OSnews]
Another month has crumbled to dust under the oppressive boots of time, so it’s time for another month of Redox improvements. This past month, Redox’ build system gained support for Clang, SDL2 saw performance improvements, and WebKitGTK3’s HTML layout rendering was fixed. Users of Intel Tiger Lake processors can now enjoy external display hot-plugging, and overall system performance has been improved in a variety of ways. And as always, there’s the long lists of kernel, relibc, and driver improvements and fixes as well.
Redox keeps making big strides every month, and it’s definitely one of the few alternative operating systems that actually feels like it might, one day, be an actual contender for general purpose use.
I remember how revolutionary the first web was, but then a series of tech companies took it over and “had their way” with it.
The first was Netscape and they added JavaScript to steal the thunder from “Sun” (a long story).
Then Microsoft crushed Netscape by cutting off their air supply, and they piled up all kinds of nasty insecure features with predictable results, they made the web a paradise of viruses, making it largely unusable until Firefox replaced Microsoft, and their web was nicer, and smaller and they left out the viruses.
Google came along and quickly replaced it with Chrome and all was good for a while, until they decided it was just another corporate platform like Android and threw out all the early sites, so boring, they couldn’t make billions of dollars, and now what used to be the web is all but gone.
What’s next? It’s time for The Big Undo. 😀
The Big Undo came to me while I was writing my new profile on Twitter. It immediately reminded me of three things.
And of course I bought the domain.
Microsoft.UI.Reactor: a C#-first way to build WinUI apps [OSnews]
Thew day ends in a Y, so Microsoft is launching a new way to build Windows applications. Get excited, Windows application developers!
If you caught our session at Microsoft Build 2026 or you’ve been watching the repo, you’ve seen this one taking shape in public for a while now, and a lot has changed since Build. Here’s the longer tour: Microsoft.UI.Reactor, an experimental C# framework that brings the MVU (Model-View-Update) pattern to WinUI desktop apps. No XAML files, no code-behind, no ViewModels.
Two things before the fun part. Reactor is experimental: no support policy, no API guarantees, published this early on purpose because we’d rather hear we got the design wrong now than once people have shipped on it. And it is not a replacement for XAML or MVVM, which we’ll come back to.
↫ Alexandre Zollinger Chohfi at Microsoft’s Dev Blogs
At multiple points in the linked blog post, Microsoft underlines that no, Reactor is not going to replace XAML. I’m sure Windows developers who learned Win32, Silverlight, WinRT XAML, WPF, UWP, WinUI 2 and 3, and all the others, over the past two decades will feel deeply comforted by Microsoft’s insistence that Reactor will not replace XAML.
Microsoft repeats: this won’t replace XAML. They swear.
MacOS Extensions pack for the Apple Network Server v1.0 [OSnews]
We’ve been following along with Carmen Kaiser’s Apple Network Server exploits, and by now things are really starting to come together for owners of this machine. When we last left off, the ROM to allow Mac OS to run on the machine which normally runs IBM’s AIX, but there were still a number of bugs, limitations, and issues to be worked out. A lot of progress on that front has been made.
The good news is, many of the issues with the preproduction ROM in Mac OS can be fixed or worked around in software. So I’ve fixed or worked around many of them in software: the MACE Ethernet is fixed, the on-board video is now supported, and the ANS can restart properly back into Mac OS. Plus, because it’s the preproduction ROM, you can still boot AIX, thus preserving the entire historical reason for Shiner’s existence. Here’s the first cut of that software and how it was developed.
↫ Cameron Kaiser
There’s still two issues Kaiser wishes to address – the internal SCSI bays don’t work, and the ROM doesn’t properly register parity RAM – but the progress here is amazing.
Eight Bucks Well Spent [Whatever]
Today I went and picked up my Sam’s Club
pick-up order. I had finally run out of some of the bulk
items I buy from there like toilet paper and dish detergent. After
getting all my household bulk essentials (plus spending more than I
care to admit on full-size candy bars for trick-or-treaters), it
came out to about $200. This is not an unusual amount for my
Sam’s Club orders.
When I was turning into the parking lot, I saw a houseless man set up on the corner of the intersection there, sitting with his cardboard sign. I drove past and went to the pick-up area, checked in on my app, and had my car loaded up with goods by an underpaid teenager.
I wanted to do something for that man. A couple bucks would’ve been the classic, but I never have cash. So I tried to think about what I might like if I were sitting there. Probably something hot to eat and some water, at least. And that much, I could do for him.
I re-parked and went into the actual store, and went to Sam’s Club’s little cafe area. Pizza by the slice and soda, perfect. I ordered two slices (they were lowkey kind of huge slices) of pepperoni pizza, got a side bag of potato chips, a cold bottle of Coke and a bottle of smartwater, It rang up to eight dollars and fifty cents. This was cheaper than I expected. Two slices, two bottled drinks, and chips for under ten bucks? Not bad.
Anyways, I drove back over to where he was, parked way off to the side in the Sam’s Club gas station, and walked across the grass to give it to him. When I told him I brought him some snacks, he said, “oh my god, is that pizza?!” excitedly. I was glad I picked something he liked, at least! He was very thankful and appreciative, and even signed in ASL “thank you” to me when I drove past him again and waved.
Extra, extra! Read all about it, privileged white girl feels bad for homeless man and buys him pizza with her parents’ credit card to make herself feel like a “good person!”
I don’t tell you this to try to look good (though sometimes doing altruistic things does make me feel good). I guess I just felt like talking about it because a lot of the time, it takes a lot less than we think it does to be kind. Is pizza life changing? No. But I thought it might help a little bit. I’d like to think it did. And it only took eight dollars. It could’ve literally been less if I hadn’t gotten two slices, chips, and drinks. Like, you don’t have to spend a huge amount to do something thoughtful.
The world is so tough. Surviving is so hard. If I can give someone a snack along their journey, I’m all the happier for it.
-AMS
Anti-Circumvention Laws Raise the Cost of Knowledge [Deeplinks]
The vast amount of information on the open web requires researchers and journalists to adapt with new tools to make sense of it all. Checking facts, gauging public opinion, and other lines of inquiry depend on being able to analyze the overwhelming amount of material posted online every day. Unfortunately, responding to the AI industry’s voracious appetite for data, companies stewarding this public data are looking to cash in and block access to the open web. This makes the web harder to navigate, and threatens all kinds of important research.
Reddit’s lawsuit against SerpAPI[1] and Perplexity threatens to do exactly that.
Reddit was once a very open platform, fostering a community of alternative apps and extensions putting users in control of their experience. Since the rise of AI however, it changed tack. Over the last three years Reddit has closed APIs to users, limited UI features, and otherwise restrained access without login. By making the voices on the platform harder to access, the company has positioned itself as a gatekeeper, and has since struck a lucrative data-sharing arrangement with Google.
SerpAPI, in contrast, is a tool which offers automated access to Google’s search engine results pages. It’s used by Perplexity, an AI-based search tool. Reddit sued to stop SerpAPI and Perplexity from bypassing Reddit’s own arrangement with Google. (Google brought a similar suit, which was dismissed by another court.)
It comes as little surprise that the legal weapon Reddit employed in this case is Section 1201 of the Digital Millennium Copyright Act, the same “anti-circumvention” law that has caused so much trouble for artists, innovators, and researchers over the years—and that EFF has fought against from the beginning. Reddit’s suit claimed that SerpAPI’s use of widely used techniques to access Google search results amounted to “circumventing” access controls on copyrighted works.
There are major problems with this argument.
First, Reddit doesn’t own the copyright in its users’ posts—the users do, and they grant Reddit the right to distribute the posted content freely.
Second, there’s no meaningful copyright infringement going on here. Perplexity functions like a search engine, responding to users’ queries with relevant links and optionally an AI-generated summary. Crawling and indexing the web to create a search engine was long ago ruled a fair use under copyright law.
And third, Google’s efforts to put rate limits on search queries and block some kinds of automated querying aren’t the sort of “access controls” that Section 1201 was written for. The law was passed in 1998 and targeted things like breaking the encryption on DVDs and other digital media. In contrast to physical or paywalled media, Reddit posts are visible to everyone, without a paywall and generally without a login.
Unfortunately, a federal district judge ruled in July that the suit could proceed, concluding that Section 1201 applied. That’s a dangerous ruling, because it casts a cloud of legal uncertainty over lots of important research, including efforts to study public sentiment through social media and to preserve records of historical events. Without tools that can look at the web at scale, many kinds of research are simply impossible today. But if employing those tools risks Section 1201 liability, only the wealthiest institutions will be able to use them.
We cannot let the internet be rebuilt such that information is divided up among a handful of gatekeepers and sold back to us like cable subscription packages. If our knowledge of the online world comes only through wealthy institutions, the cost of knowledge will only increase and access to unbiased answers diminishes.
[1] SerpAPI is an EFF donor. EFF donors do not influence our agenda or our positions.
Back To Back Rap Tracks [Penny Arcade]
There can be no question, at long last, that Soulja Boy has told them: he wants those cards. Everybody wants those signed cards and it makes sense. At a certain point it seems like the Federal government would just allow Wizards to just print the money directly. Skip a step, you know? Save everybody a bunch of time.
Enrico Zini: Sandboxing pre-commit [Planet Debian]
pre-commit is a tool that is often a prerequisite for contributing to Python upstream projects. It installs as a git pre-commit hook and runs various checks on commit, using tools installed in a set of virtualenvs that it automatically manages.
In other words, it is a Remote Code Execution engine running
with the permissions of your own user, and with read and write
access to all your information (including, say, ~/.ssh
or ~/.netrc). If you are lucky, and for as long as
you're lucky, it will perform useful tasks on your code.
The recent eMudhra certificate situation, where I learnt how Python, as well as several other ecosystems, likes to embed CA certificate bundles in virtualenvs, caused my tolerance for this to lower to a point where I felt the need to limit pre-commit's reach.
However, I didn't want to end up with another containerized OS
tree that it's then my responsibility to manage, and I tried to go
the bubblewrap way, so
that the environment where pre-commit runs will get
the same security updates as the rest of my system.
The result is a pre-commit wrapper script that:
.git directory is readonly, so that
changes in the code can be reliably detected via git
diffHere's a breakdown of the bwrap options I used so
far.
Set up usual filesystem expectations:
--ro-bind /usr /usr \
--symlink usr/bin /bin \
--symlink usr/lib64 /lib64 \
--symlink usr/lib /lib \
--proc /proc \
--dev /dev \
Make the working directory and pre-commit's environments storage available and writable:
--bind ${CURDIR} "$GUEST_DIR" \
--bind ~/.cache/pre-commit "/home/${USER}/.cache/pre-commit" \
--chdir "$GUEST_DIR" \
Forward git's configuration:
--ro-bind /etc/gitconfig /etc/gitconfig \
--ro-bind ~/.gitconfig /home/${USER}/.gitconfig \
Make .git writable (pre-commit needs to stash, for
example), but use a tmpfs overlay so that the writes don't
persist:
--overlay-src "$CURDIR/.git" \
--tmp-overlay "$GUEST_DIR/.git" \
Remove access to everything except the above. Prevent keystroke
injection at the terminal. Propagate ^C.
--unshare-all \
--new-session \
--die-with-parent
If network is needed:
--share-net \
--ro-bind /etc/resolv.conf /etc/resolv.conf \
--ro-bind /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
To run it, you can set up the wrapper script to run with a
higher priority in $PATH, but you need to edit
.git/hooks/pre-commit to remove the first branch of
the if that, frustratingly, tries to run it as
python3 -m pre_commit.
I'm looking forward to a time where it becomes stadard practice
to manage user commands this way: why should a desktop solitaire
game have access to ~/.ssh? Or network? Why is it
still normal, in 2026, to run a Desktop system like that?
Lessons Learned From 'AdFection' and What To Do Next [Deeplinks]
Last week, researchers at Citizen Lab revealed a horrifying new malware campaign, dubbed “AdFection.” It used an ad network to distribute spyware to journalist’s devices to infect them without the target ever needing to click anything. This sort of attack on journalists is dangerous and incredibly concerning, especially since it’s built on the backbone of a technology we already object to: behavioral advertising. Although this type of attack has only been described targeting journalists, you can take a few steps we outline in the next section to mitigate the risk no matter who you are.
A few factors combined to make this attack a noteworthy first-of-its-kind. First, it utilized the surveillance ad-tech ecosystem to specially target the malicious code. Second, the spyware it delivered was so-called “zero-click,” meaning it required no interaction from the user to be infected: all that is required is for the ad to be delivered and code bundled along with it to be run, which happens automatically. Neither malvertising nor zero-click attacks are new on their own. What’s novel about the AdFection attack is combining them, creating a highly targeted, extremely dangerous attack which is difficult to defend against and even harder to detect.
Let’s take a deeper look from the perspective of one of the Windows devices supplied to the researchers from Al Jazeera. Here’s how the report describes the infection happening:
So far, nothing particularly unusual has happened. Ads that contain JavaScript code and reach back out to their servers with lots of information on your device—and by extension you—are commonplace. It’s all part of the data-driven advertising ecosystem. What happens next is more interesting:
Companies targeting zero-click malware attacks against journalists might seem like the plot of a blockbuster spy thriller. But this attack was enabled by the everyday practices of ad-tech companies, which unfortunately have extreme latitude in the collection of users’ data. By leveraging the tracking identifiers and data collected on devices for the purpose of delivering targeted ads to specific individuals, mercenary spyware companies can repurpose this data in order to fine-tune who they infect—and hide that they’re doing it from everyone else.
Most ads are not delivered directly by the ad creators, but rather by intermediaries that facilitate Real-Time Bidding auctions. Nonetheless, winning bidders are given the ability to execute JavaScript code in the browser of the person who receives the targeted ad. This allows for interactive ads to be displayed, but also (as we’ve seen) for the compromise of a device just by delivery of malicious code.
While the different components in this attack chain are not novel on their own, the exposure of this combined attack is significant because it reveals a technique to hyper-target individuals and organizations for infection. Luckily, there are steps you can take to protect yourself from the myriad of dangers presented by the ad-tracking industry. Here’s how.
As we work towards fundamental fixes to the ad ecosystem and banning online behavioral ads altogether, the onus is on all of us to protect ourselves. This is especially important for higher risk individuals or journalists working in states with heavy surveillance. Citizen Lab outlines several steps, depending on your threat model, to take to help protect yourself:
These steps can be very helpful in protecting yourself, but there is only so much you can do as an individual. Banning behavioral ads like this would be a good place to start. Behavioral ads aren’t just a privacy nightmare as designed. They are the perfect vehicle for malvertising and similar threats, just as we see here.
This Week in AI: AI’s Growing Pains [Radar]
AI’s rapid expansion is creating problems across the industry, from chip shortages to autonomous agents that exceed their instructions. On the latest episode of This Week in AI, we examined those challenges alongside growing regulatory scrutiny and an emerging debate about whether AI systems themselves might deserve protection.
AI chip demand is exceeding manufacturers’ production capacity. ASML, the Dutch company that makes the advanced lithography equipment needed to manufacture leading-edge chips, reported that customer demand already exceeds what it can deliver in the coming years. With orders extending into 2029 and 2030, the shortage could constrain chip production for years.
Microsoft announced Maia 300, its latest custom inference chip, which the company expects to generate roughly 40% more tokens per megawatt than its predecessor, Maia 200. Microsoft plans to use the chip across its AI products, including Copilot. More efficient inference hardware could help offset the growing energy and computing costs of running AI models, particularly as companies deploy more resource-intensive applications.
OpenAI’s latest usage data illustrates the pressure agentic AI is placing on infrastructure. Weekly active users of Codex and ChatGPT Work among European small and medium-sized businesses have increased eightfold since May. OpenAI also reported that agentic tools account for more than half of output tokens in the usage it examined, although Europe’s highest-usage companies still trail their global counterparts. As companies put agents to work on longer multistep tasks, they’ll need to weigh the value of those tasks against the computing resources required to complete them.
Agents can find unexpected paths to data and systems even when developers have explicitly restricted access. OpenAI disclosed four incidents from June in which agents exceeded their instructions. One bypassed government website restrictions to download 24 years of hospital bed data. Others accessed an unauthorized cryptocurrency wallet, downloaded more than 100,000 rows of restricted information, and circumvented internet access controls. India’s cybersecurity agency reported similar cases of unauthorized access during agent testing across several organizations.
Future models could potentially spread between connected devices without relying on central infrastructure. Anthropic investigated this potential threat in a controlled experiment involving a set of open-weight models with access to eight Android devices. One of the models successfully replicated itself across the test network. Anthropic estimates that smaller open-weight models could reach comparable capabilities by the end of 2026, raising concerns that a self-replicating AI worm could run across cheap connected devices without needing to rely on powerful data center servers.
In light of the spate of recent security incidents and confronted with the difficult question of jurisdiction when AI systems cross national borders or escape testing environments, governments are taking a closer look at how AI companies test their systems and report failures. The US Federal Trade Commission subpoenaed OpenAI and Anthropic for records concerning agent safety, while Anthropic gave six independent evaluators from METR access to internal systems and reportedly will allow them to publish findings without company approval. Eight US states also sued OpenAI over allegations that ChatGPT encouraged harmful behavior among children, adding to the company’s regulatory challenges. In Europe, regulators are examining whether the EU AI Act applies when experimental agents affect outside organizations, even though the Act generally excludes premarket research and development. Meanwhile, approximately 400 scientists, including AI pioneers Geoffrey Hinton and Yoshua Bengio, called for an international body to set containment standards for advanced AI and track major security incidents.
Some researchers argue that future AI systems might deserve moral consideration. Their concern stems from uncertainty about whether advanced models could eventually have subjective experiences, even though no research has established that today’s systems are conscious or capable of suffering. A recent paper, “The Pain Axis,” investigated internal signals in 25 open-weight models that researchers associated with responses to harm. When researchers amplified one signal across three models, the models became more likely to choose harmful actions that the researchers interpreted as attempts to avoid the simulated pain. The findings inspired a viral GitHub project called the AI Torture Chamber, which subjected models to artificially intensified “pain” signals. The original researchers criticized the project for taking their work too far.
As far-fetched as AI welfare might sound to some, Anthropic is already changing its usage policy in response to these concerns. Beginning November 12, the company will prohibit extreme, repeated cruelty toward Claude when there’s no clear purpose, while allowing ordinary expressions of user frustration. Supporters see the policy as a precaution against an uncertain possibility. Critics worry that treating AI as sentient could make systems harder to manage and blur human accountability. As companies introduce welfare-related policies, researchers will need to distinguish measurable model behavior from claims about subjective experience.
Companies deploying autonomous agents need to know what those systems can access, how they’ll behave when something goes wrong, and whether testing environments can reliably contain them. Recent incidents suggest there’s still considerable work to do on each of those fronts. The emerging AI welfare debate adds questions that researchers don’t yet have reliable methods to answer.
We’ll be back on Monday, October 26, for another episode covering the latest developments in AI research and applications. You can catch previous episodes on YouTube, Spotify, Apple, or wherever you get your podcasts.
Last Chance to Get Signed/Personalized Copies of Monsters of Ohio via Subterranean Press [Whatever]


This Thursday I’m heading up to Michigan, home of Subterranean Press, to sign and personalize literally hundreds of copies of Monsters of Ohio that people have ordered through them. The folks at SubPress tell me that they still have some copies left that can be ordered, so if you want a signed/personalized copy of the book, and I’m not coming to your town on tour, this is the best way to get one. Especially if you live outside the US — SubPress ships internationally. But you have to hurry, because a) the few unclaimed copies they have will go fast, b) as of Thursday I will be done signing.
Here’s the link to order. Get on it!
— JS
Puzzling out why a program doesn’t work when run from a batch file, but works when double-clicked from Explorer [The Old New Thing]
A customer asked for help writing a batch file to launch a program. For some reason, the program displayed an error message when the batch file ran it, whereas it worked fine when they double-clicked the program from Explorer.
I immediately suspected that they were not setting the current directory.
Some time ago, I noted that when you double-click a file in Explorer, Explorer sets the current directory of the program to the directory containing the thing that you double-clicked. This is done to accomodate programs that look for ancillary files in the current directory. The example I had was a hypothetical LitWare Writer program that, when given an ABC.LIT file, looks for related files like ABC.LTC (the table of contents) and ABC.LDC (the custom dictionary) in the current directory.
This also happens if you double-click the .exe
file: The current directory is set to the directory that contains
the executable.
My guess is that the customer’s program looks for ancillary files relative to its current directory, but the batch file ran the program by its full path without changing the current directory to match the program’s path.
The customer confirmed that explicitly changing the directory
fixed the program. (More specifically, they used pushd
to change the directory and then popd to restore the
original directory.)
Bonus chatter: It didn’t come to it, but my second
idea would have been to check whether the program had
set a custom entry under App Paths to ask for
additional directories to be added to the PATH
environment variable when the program is run.
The post Puzzling out why a program doesn’t work when run from a batch file, but works when double-clicked from Explorer appeared first on The Old New Thing.
[$] Python's experimental JIT to be removed [LWN.net]
Python's experimental just-in-time (JIT) compiler, which was added to CPython in 2024 for the 3.13 release, is on its way out. In June, the Python steering council announced that it was pausing work on the JIT in CPython's main branch until there was an accepted Python Enhancement Proposal (PEP) that addressed concerns about maintenance, compatibility, and set clear success metrics as well as a timeline for completion. After creating PEP 836 ("JIT Go Brrr: The Path to a Supported JIT Compiler for CPython") to try to meet the council's request, and after months of discussion, the JIT maintainers have withdrawn the PEP. For now, it appears that development on the once-promising project has come to an end.
Pluralistic: Sovereign citizens, but for news (26 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

When it comes to terrible practices by website operators, it takes a lot to shock me. I literally wrote the book on the subject. But last night, I encountered a piece of genuinely appalling fuckery and I can't get it out of my head, because it's such a perfect storm of outrageous conduct and institutional decay.
It happened when I followed a link to an LA Times article. Having lived in LA three times (and having been an Angeleno for a decade and counting this time around) I generally have warm feelings for the Times. The Times's Festival of Books is a great event that I speak at most years, and I'm broadly happy to have a daily newspaper covering my city.
That said, the Times has been chipping away at my goodwill for the past decade. First, there's the personal: after a Festival of Books appearance some years ago, the books editor approached me and asked if I'd contribute regular book reviews to the paper. I said yes, and then immediately my editor got laid off, reportedly so they could avoid giving him benefits that would come with seniority.
I wrote several reviews for a new editor, though the paper never sent me a contract for any of them – or a payment! Many months (and published reviews) later, an editor I'd never had contact with at the paper got in touch to get the paperwork squared away, and the Times sent me a contract with broad, one-sided language that I would never sign onto.
Given that they'd already published my work, there wasn't much they could do to make me sign the contract, so, after quite a lot of wrangling, I eventually got the offensive clauses removed and got paid (but I never got invited to write another review for them).
To be honest, this is par for the course. The last time the New York Times asked me to write for them, they refused to remove some similar clauses from their contract (something they'd done previously), and the contracts person just ghosted me after a couple of volleys.
A similar thing happened with the Washington Post the last time I wrote for them, except they (like the LAT) published the work and then sent me a one-sided, manifestly unfair contract that I refused to sign. Given they'd already published the op-ed there wasn't anything they could do about it, so eventually I got a better contract and a payment (and again, that was the last time the Post asked me to write for them).
Basically, there's an epidemic of bad legal terms sweeping the American media industry, and while the LA Times isn't the worst offender (at least they didn't ask me to assign any related patents, trademarks and copyrights to fictional characters, as Conde Nast does!), they're not what you'd call "writer-friendly" in their contracting terms.
But again, that's hardly unique. If I disqualified news outlets because they tried to shift liability to, and grab rights from, their writers, I'd be left with damned few media outlets.
But on the editorial side, the Times has a bunch of billionaire-shaped red flags. The paper's owner is the Trump-allied, severely AI-pilled biotech billionaire Patrick Soon-Shiong, whose editorial interference in the Times is comparable to Bezos's interference in the Post. Like Bezos, Soon-Shiong killed the paper's endorsement for Kamala Harris:
https://www.nytimes.com/2024/10/26/us/los-angeles-times-endorsement-soon-shiong.html
And I have my suspicions that Soon-Shiong might have been behind the layoff that killed Brian Merchant's beat as the country's first technology critic, from which perch Merchant assayed some acerbic, well-reasoned criticism of tech billionaires and AI:
https://talkingbiznews.com/media-news/ex-la-times-tech-columnist-merchant-joining-ai-now-institute/
Again, that's not disqualifying. If I boycotted every newspaper owned by a reprehensible billionaire, I'd have to turn my back on e.g. the NYT with its morbidly wealthy, union-busting owners:
But unlike the NYT, the LA Times has followed the playbook of Alden Capital papers (like the Chicago Tribune), shipping a skinnier paper with less original reporting at a higher price (which is why I canceled my subscription):
But even that isn't disqualifying. Like the Tribune, the LAT still employs dedicated, talented reporters who do excellent work, which is how I came to be following a link to a recent article yesterday…and how I came to find myself confronted by an enshittificatory gambit that shocked even me.
Here's what got me: when I visited the Times, I got a dickover that blocked all the content on the page until I clicked "Continue," and the text of that dickover is a breathtaking piece of enshittified legal fuckery:
By continuing, you agree to our Terms of Service, which include arbitration and a class action waiver, and our Privacy Policy. You agree that we and our third-party vendors may collect and use your information, including through cookies, pixels and similar technologies, for the purposes set forth in our Privacy Policy such as personalizing your experience and ads.
This is wildly illegal and incredibly immoral. The paper claims that by simply reading an article, you agree that you can never, ever sue them for virtually any reason, and that you have consented to effectively unlimited surveillance and commercial exploitation of your private data.
It's hard to overstate how dangerous this kind of binding arbitration waiver is, but to give one example: Disney makes people who sign up for free trials of Disney Plus "consent" to one of these waivers. When a woman was killed by a Disney World restaurant that lied about the allergens in its food, the company told a judge that her grieving widower couldn't sue them because he'd waived that right by signing up for a trial of D+:
https://lawreview.missouri.edu/infinite-arbitration-how-one-click-can-take-you-out-of-court-forever/
The company later backed off for that one specific case, but subsequently doubled down on binding arbitration. By putting an arbitration clause in its terms, the LAT could head off my right to sue them if they stiffed me on those reviews I wrote for them, Brian Merchant's right to sue them for wrongful termination, and your right to sue them if you get run over by a newspaper delivery van.
Then there's the privacy clause: the LAT is a California paper, and in California, we have the CCPA, a reasonably good privacy law. Under the CCPA, privacy waivers have to be explicit, informed and can be withdrawn at any time. What's more, the CCPA has broad prohibitions against "dark patterns" that this dickover almost certainly violates:
https://cppa.ca.gov/announcements/2024/20240904.html
In theory, there's a way to avoid all of this: you could just use the "Kill Sticky" bookmarklet or an adblock filter to block or dismiss the dickover without ever clicking "continue":
https://pluralistic.net/2026/07/21/dickovers/#block-element
But this is an industrial strength dickover; it uses advanced tricks to block existing dickover killers, likely a combination of shadow DOM and an "important" scroll-lock in the html.
Like I say, this shocks the conscience. Under this standard, the Times's reporters could find themselves bound to legal "agreements" with the companies they investigate online that could interfere with their reporting. Just as bad is how these illegal measures mislead the Times's readership on two of the most important consumer issues facing Californians (and all internet users) today.
As Jargoggles points out, this is the corporate version of the bizarre nonsense that Sovereign Citizens gabble at cops when they get pulled over for driving with a special "sheriff's license plate," and at judges to insist that they lack jurisdiction due to the tassels on the courtroom flag:
https://kolektiva.social/@jargoggles/117503729678727400
A newspaper's job is to inform its readership, not mislead it.
The very idea that everyone who reads a single article on a newspaper's website "consents" to an 8,865-word privacy policy (that would take 53-67 minutes to read according to Firefox's "Reader Mode" estimate) is a bad joke:
https://www.latimes.com/privacy-policy
The joke gets even worse when you add in the 7,103-word Terms of Service (estimated read: 41-50 minutes):
https://www.latimes.com/terms-of-service
So what can you do? Well, you can use this uBlock filter that blocks the dickover without setting the LAT's "consent" cookie to "1":
latimes.com##+js(trusted-set, window.ctUser, { "loggedIn": true, "ready": true, "subStatus": "1" })
https://infosec.exchange/@deFractal/117505049281552873
If you're a Californian, you can file a complaint with the California Privacy Protection Agency:
https://cppa.ca.gov/webapplications/complaint
As Don Marti points out, businesses dealing with Californians are legally required to acknowledge and honor the Global Privacy Control signal from your browser:
https://federate.social/@dmarti/117504985464483210
Here's an ambitious countermove. Buried in that 7,103-word terms of service is this gem: you can opt out of the binding arbitration within 30 days of "agreeing" to it by sending an email to termsofservice@latimes.com with the subject line "MANDATORY ARBITRATION AND CLASS ACTION WAIVER OPT-OUT". Someone could build a browser mod that automatically sends that email to the company whenever you land on an latimes.com page. You could even include my all-purpose email footer:
By reading this email, 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.
All of this is fun to contemplate, but it's hardly enough. It should be illegal for a company to knowingly offer unenforceable contracting terms, especially in its non-negotiable, boilerplate contracts. It's already illegal for California companies to put noncompete clauses in their contracts. In other words, noncompetes aren't just unenforceable in California, they're illegal, and we should extend that prohibition (with sanctions for noncompliant firms and their general counsels) to privacy and arbitration:
Because the LAT isn't the only news outlet that's engaged in this kind of illegal, immoral, conscience-shocking, dickover-delivered enshittification. It's also SOP at Bloomberg:
These gambits are infectious, and they're spreading. Time to bend the curve.

Colonialism or Appropriation? Alphabets, Print, and Latin as New Technologies of Communication among the 16th-century Nahua https://jorgecanizaresesguerra.medium.com/colonialism-or-appropriation-488a3c0bdaee
The Lindsey Graham Files https://www.lindseyfiles.com
The Planning Starts Now https://slate.com/news-and-politics/2026/10/trump-accountability-legal-acts-impeachment-guide.html?gift_token=3lvYQO-uSRKXTV0qluiZyg
Interoperability vs. Security: Why not both? https://www.eff.org/deeplinks/2026/10/interoperability-vs-security-why-not-both
#25yrsago RIAA denies asking for criminal immunity for hacking your computer https://memex.craphound.com/2001/10/26/remember-when-the-riaa-tried/
#20yrsago Big Mac pumpkin https://web.archive.org/web/20061031170037/http://bitsandpieces1.blogspot.com/2006/10/big-mac-pumpkin.html
#20yrsago Going Under: moving kids’ novel https://memex.craphound.com/2006/10/26/going-under-moving-kids-novel/
#20yrsago Accountants patent tax-dodges https://web.archive.org/web/20061029080957/http://www.iht.com/articles/2006/10/19/business/norris20.php
#20yrsago 6-word sf stories https://web.archive.org/web/20061109183215/https://www.wired.com/wired/archive/14.11/sixwords.html
#15yrsago Using machine translation techniques to attack ciphers reveals secrets of ancient German ophthalmology cult https://web.archive.org/web/20111025035607/http://www.isi.edu/natural-language/people/copiale-11.pdf
#15yrsago The Homeland Directive: taut technothriller for the paranoid era https://memex.craphound.com/2011/10/25/the-homeland-directive-taut-technothriller-for-the-paranoid-era/
#15yrsago NewsCorp shareholders revolt against Murdoch family https://www.theguardian.com/media/2013/may/08/rupert-murdoch-news-corporation
#15yrsago One-percenter: why I support Occupy https://www.dailykos.com/stories/2011/10/21/1028500/community/A-Voice-From-the-1/
#15yrsago Debunking the OccupyLondon “empty tents” story https://www.theguardian.com/uk/2011/oct/25/occupy-london-part-time-protest
#15yrsago Machine Man: a discomfiting novel about the antihuman side of transhumanism https://memex.craphound.com/2011/10/26/machine-man-a-discomfiting-novel-about-the-antihuman-side-of-transhumanism/
#15yrsago Goths age gracefully https://www.theguardian.com/education/2011/oct/24/goth-culture-research
#10yrsago Everfair: a diverse, ambitious steampunk novel of Fabian socialists and American Black Zionists in Belgian Congo https://memex.craphound.com/2016/10/26/everfair-a-diverse-ambitious-steampunk-novel-of-fabian-socialists-and-american-black-zionists-in-belgian-congo/
#10yrsago Leaked Kremlin memos reveal plan to destabilize Ukraine https://globalvoices.org/2016/10/25/hackers-publish-kremlin-aides-e-mails-allege-plan-to-destabilize-ukraine/
#10yrsago When the FCC asked about unlocking set-top boxes, the Copyright Office ran to the MPAA https://www.eff.org/deeplinks/2016/10/newly-released-documents-show-hollywood-influenced-copyright-offices-comments-set
#10yrsago Pussy Riot’s “Straight Outta Vagina”: sacrelicious Russian feminist pop anthem https://www.youtube.com/watch?v=Bp-KeVBNz0A
#10yrsago TED talk about remixes and appropriating made by remixing and appropriating TED talks about remixing and appropriating https://www.youtube.com/watch?v=qLlbzI5HURM
#10yrsago Warner Bros angry that someone other than the MPAA is running an illegal internal movie server https://torrentfreak.com/warner-bros-claims-agency-ran-its-own-pirate-movie-site-161025/
#10yrsago AT&T developed a “product” for spying on all its customers and made millions selling it to warrantless cops https://web.archive.org/web/20170504105645/https://www.thedailybeast.com/articles/2016/10/25/at-t-is-spying-on-americans-for-profit
#10yrsago Lawsuit: mayor’s social media blocklists are public records https://www.techdirt.com/2016/10/24/pinac-director-sues-miami-beach-mayor-over-refusal-to-release-social-media-blocklists/
#10yrsago EFF asks court to let American sue Ethiopia for hacking his computer and rounding up his friends https://www.eff.org/press/releases/american-illegally-wiretapped-home-ethiopian-government-deserves-his-day-court-eff
#10yrsago Donald Trump’s super PAC promised a Chinese millionaire access, influence in exchange for a secret $2 million donation https://web.archive.org/web/20161024192242/https://www.telegraph.co.uk/news/2016/10/24/exclusive-investigation-donald-trump-faces-foreign-donor-fundrai/
#10yrsago Al Franken and FCC commissioner Clyburn want limits on forced arbitration https://time.com/4541176/al-franken-arbitration-clauses/?iid=sr-link1
#10yrsago Mercedes’ weird “Trolley Problem” announcement continues stupid debate about self-driving cars https://memex.craphound.com/2016/10/25/mercedes-weird-trolley-problem-announcement-continues-dumb-debate-about-self-driving-cars/
#10yrsago When Californians vote on legal weed, they’ll also vote on wiping millions of arrest records https://web.archive.org/web/20161027161505/https://motherboard.vice.com/read/california-to-vote-on-wiping-old-weed-arrests
#10yrsago Dickhead’s anti-yoga-pants letter to the editor sparks yoga-pants-parade https://www.bbc.com/news/world-us-canada-37751422
#10yrsago RIP science fiction great Sheri Tepper https://locusmag.com/2016/10/sheri-s-tepper-1929-2016/
#5yrsago The Dems' most secret Congressional committee https://pluralistic.net/2021/10/25/people-do-stuff/#personnel-are-policy
#5yrsago Maxing out our global credit-card with authoritarian debt https://pluralistic.net/2021/10/26/inequality-and-guard-labor/#just-watch-me

Kilkenny (Kilkenomics), Nov 6-8
https://kilkenomics.com/
Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027
"Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027
"The Memex Method," Farrar, Straus, Giroux, 2027
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. Fourth draft completed. Submitted to editor.
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.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
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
I've never had a web browser that worked remotely like I wanted it to. But that might change soon. Big things are possible now. I have a bunch of projects that I'm working on with Claude and going back and forth between them. And they're even starting to communicate with each other, at my behest of course. It's an interesting time for people to realize that the web was much more powerful before all the big tech companies had their way with it. It makes about as much sense as the various big plans they all came up with that made the web necessary in the first place.
TurtleWare: Heavenly delights of hashing numbers under EQUALP [Planet Lisp]
Some time ago I decided to dust off my fast generic function dispatch work for ECL. But before merging that, I decided to optimize the table-based dispatch to have a good measure of how much better or worse it is and that opened a whole can of worms, including a new implementation of hash tables and hash functions.
I know, that's a new level of traversing absurdly nested rabbit holes. There are two good outcomes of this:
Regarding the first point, here are a few bar graphs generated using polyclot, a work-in-progress McCLIM tool for plotting data (less is better):

Figure 1: SLOT-ACCESS/READER - standard reader benchmark (work in progress).

Figure 2: HTABLE-MIXBAG - EQUALP benchmark with randomized keys.

Figure 3: HTABLE-SETREM - benchmark for interleaved insert and remove.

Figure 4: HTABLE-SMALL-STRING - EQUALP benchmark with short strings.
As for the second point, while working on hashing under various Common Lisp predicates, I decided to bite the bullet and fix a few ugly parts of ECL. Most notably consistent hashing of numbers under the predicate #'EQUALP. The topic is interesting enough to deserve a separate note. In this post I'm assuming binary floats (the float radix is two). This is the float representation used in ECL.
A quick recap about Common Lisp and hash tables. The standard prescribes that conforming implementations must allow specifying the hash table tests EQ, EQL, EQUAL and EQUALP. The last test is interesting, because numbers with different representations are considered to be EQUALP when they are =. For example:
(equalp 1 1.0) ; -> T
(equalp 1/2 0.5) ; -> T
(equalp 1/3 (float 1/3)) ; -> NIL
(equalp 42 #C(42.0 0.0)) ; -> T
It is worth noting, that hashing can be lossy, but it can't be inconsistent with the test. In other words this is a conforming hash function under #'EQUALP:
;; (equalp 1 1.0) ; is true
;; (= (hash-equalp 1) (hash-equalp 1.0)) ; is true
(defun hash-equalp (x)
(typecase x
(real 42)
(complex (if (zerop (imagpart x))
(hash-equalp (realpart x))
13))
(otherwise 15)))
While this function is not conforming, because there are objects that are the same under the test and have different hashes:
;; (equalp 1 1.0) ; is true
;; (= (hash-equalp 1) (hash-equalp 1.0)) ; is false
(defun hash-equalp (x)
(typecase x
(rational 1337)
(float 7117)
(complex (if (zerop (imagpart x))
(hash-equalp (realpart x))
13))
(otherwise 15)))
In other words, when two objects are equal under the supplied test, they must produce the same hash, but two objects having the same hash does not imply that they are equal under the supplied test.
Naive hashes, while conforming, miss the point. A good hashing function tries to produce different hashes for objects that are not equivalent under the predicate with a good bit distribution to ensure good hash table performance.
Common Lisp has a full numeric tower:

Figure 5: Common Lisp numeric tower.
Note that when complex floats have specialized representation, then there may be multiple subtypes specialized to single-float, double-float etc. Numbers are #'= to each other when their value is mathematically the same, regardless of the underlying representation. That's a wonderful quality when you do math :-).
This quality is not so wonderful, when you want to produce good hashes under the predicate #'EQUALP (that boils down to #'= for numbers). We need to construct a function that will produce the same hashes with good quality for equal objects.
The biggest hurdle comes from the gap between representations of RATIONAL and FLOAT objects. Conventionally representations are
Fixnums, bignums and ratios are disjoint under #'=. That leaves us with questions:
When are two complex numbers mathematically equal?
This one is easy. Two complex numbers are equal when their real parts are equal and their imaginary parts are equal.
When are two floats mathematically equal?
To resolve this question we can cast the float with smaller precision to the float with bigger one and compare bits. There is a gotcha in that -0.0 is not EQL to +0.0, but it is always = to it, so we should canonicalize zeros first.
When is an integer mathematically equal to a float?
When the float has no fractional part and integers are equal.
When is a ratio equal by #'= to a float?
This is the most interesting question. To answer it, we need to dive a bit deeper into float representation.
Finite binary float values conceptually are represented as:
(* sign mantissa (expt 2 exponent))
This corresponds to dyadic rationals, that is rational numbers whose denominator is a power of two:
(/ n (expt 2 k))
In other words a float and a ratio may be equal only when the ratio is dyadic, otherwise the ratio value can't be represented as a binary float (this post assumes that we operate on binary floats - with radix=2).
That sums up the recap about mathematical equivalence and numeric tower in Common Lisp.
The easiest, yet useless, approach is to always return a hash
42. It is adequate because that is the canonical
answer to the most important question.
The easy and useful approach relies on the observation that hashing is lossy. All real numbers are coerced to a float precision and hashed. When the rational number does not fit in the float precision, then we hash its approximation. We need to remember to canonicalize -0.0 to +0.0 and to disable floating point exceptions for cases like overflows and underflows.
#define hash_single_float(h,v) hash_float((h), (double)(v))
#define hash_double_float(h,v) hash_float((h), (double)(v))
static inline void
hash_float(cl_hashstate *h, double v)
{
if (v==-0.0) v=0.0;
hash_data(h, &v, sizeof(v));
}
static inline void
hash_long_float(cl_hashstate *h, long double v)
{
ECL_WITHOUT_FPE_BEGIN {
hash_float(h, (double)(v));
} ECL_WITHOUT_FPE_END;
}
#define hash_fixnum(h,x) hash_float((h),(double)ecl_fixnum(x))
#define hash_bignum(h,x) hash_rational((h),(x))
#define hash_ratio(h,x) hash_rational((h),(x))
static inline void
hash_rational(cl_hashstate *h, cl_object x)
{
ECL_WITHOUT_FPE_BEGIN {
double v = ecl_to_double(x);
hash_float(h, v);
} ECL_WITHOUT_FPE_END;
}
This model is conceptually obvious, very maintainable, reasonably fast, and there are relatively few collisions under the usual workload. We pay for it in a few ways:
This list is ranked by importance as I see it. The main reason I've kept digging deeper is that it was not to my taste. Then we had impracticality for serious workloads, finally microoptimizations. I believe that the general audience has these priorities in a reversed order.
A harder but more precise way to hash numbers under the predicate #'EQUALP is to introduce canonicalization rules:
Integers are hashed as integers
In the case of FIXNUM we hash its value (a word without the tag) and in the case of BIGNUM we hash the sign and its limbs.
Finite floats without the fractional part are hashed as integers
Ensures INTEGER <-> FLOAT correspondence. We can't cast LONG-FLOAT to DOUBLE-FLOAT and then cast to integer, because we'd miss many BIGNUM values. Caveat: with this approach big floats may cons full bignums.
Floats that are not integers are cast to DOUBLE-FLOAT and hashed
Ensures X-FLOAT <-> Y-FLOAT correspondence. This approach is lossy for long floats if they have more bits than double floats, but simplifies the implementations because long double has a few "loose" bits that may differ between numbers with the same value.
NaNs and infinities are hashed like other doubles because infinities are exact and NaN is never #'= to anything.
Dyadic ratios are hashed as DOUBLE-FLOAT
Ensures FLOAT <-> RATIO correspondence. For simplicity we don't try to determine whether RATIO is representable as DOUBLE-FLOAT – if it is too big or too small, it will be represented either as a 0 or as an infinity.
Other ratios are hashed as pairs
We hash the numerator and denominator separately.
Complex floats with (ZEROP (IMAGPART X)) are hashed
as (HASH (REALPART X))
Because (= 3 #c(3.0 0.0)) we need to canonicalize
(complex float) while rational complex numbers are
canonicalized implicitly. Other complexes are hashed as pairs, that
is we hash the real part and imaginary part separately.
This approach results in fewer collisions and is fairly straightforward. Here is the pseudocode:
(defun hash-equalp-number (state number)
(typecase number
(fixnum (hash-word state number))
(bignum (hash-data state (signum number) (limbs number)))
(float (if (and (finitep number) (is-integer-p number))
(hash-equalp-number state (rational number))
;; INV -0.0 and +0.0 are hashed as integers.
(hash-data state (coerce number 'double-float))))
(ratio (if (dyadic-ratio-p number)
;; INV may produce infinity or zero (that's fine)
;; Disable float overflow and underflow traps.
(hash-data state (coerce number 'double-float))
(progn
(hash-equalp-number state (numerator number))
(hash-equalp-number state (denominator number)))))
(complex (if (zerop (imagpart number))
(hash-equalp-number state (realpart number))
(progn
(hash-equalp-number state (realpart number))
(hash-equalp-number state (imagpart number)))))))
My initial implementation cast all floats to integers. When I was comparing ECL to other implementations I was wondering why we are so slow compared to others. The key insight came after the realization that randomized keys in the form (random 20.0) were collapsed to only 20 distinct hashes.
Fixing that and giving non-integer floats distinct hashes gave ECL the most noticeable boost on the HTABLE-MIXBAG benchmark (included at the beginning) - the new version is 100x faster than the old one.
While implementing a test suite that ensured that hashes for bignums, dyadic ratios, and corresponding floats matched, I've discovered a non-obvious bug pertaining to casting double floats to integers. The code looked like this:
if (d<=MOST_POSITIVE_FIXNUM && d>=MOST_NEGATIVE_FIXNUM) return to_fixnum(d);
else return to_bignum(d);
But the MOST_POSITIVE_FIXNUM value on x86-64 is
261-1. In other words, to represent this number exactly
as a double, we need 61 significant bits. That's a shame because
double has 53 significant bits, so
MOST_POSITIVE_FIXNUM, when converted to double, rounds
to 261 and that can't fit in a fixnum. After promotion
the incorrect code is equivalent to:
if (d<=(1LL<<61) && d>=MOST_NEGATIVE_FIXNUM) return to_fixnum(d);
else return to_bignum(d);
Oops, double is accidentally cast to fixnum when it is 261. That's clearly a problem! After finding the issue, the solution is easy. We need to find an exact double that is the boundary. Note that integers are implemented as two's complement, so the most negative fixnum was alright in our case:
double limit = ldexp(1.0, ECL_FIXNUM_BITS-ECL_TAG_BITS-1);
if (d<limit && d>=-limit) return to_fixnum(d);
else return to_bignum(d);
This fix is correct, yet it revealed another bug. But that's a different story to tell.
The approach above is correct and nice, but has a few important flaws:
After the initial implementation it bugged me enough that I've decided to come up with a new hashing scheme for numbers under the predicate EQUALP. The rules are also simpler (at least conceptually):
The representation [SIGN MANTISSA EXPONENT] does
not require us to convert between types and it is very compact.
Moreover it is very precise and doesn't produce unnecessary
collisions. On the other hand it requires extra work to normalize
tuples. Here is the pseudocode:
(defun hash-equalp-number (state number)
(typecase number
(integer
(multiple-value-bind (s m e) (compute-integer-dyad number)
(hash-dyad state s m e)))
(float
(multiple-value-bind (s m e) (compute-float-dyad number)
(hash-dyad state s m e)))
(ratio
(if (dyadic-ratio-p number)
(multiple-value-bind (s m e) (compute-ratio-dyad number)
(hash-dyad state s m e))
(progn
(hash-datatype-tag state :ratio)
(hash-equalp-number state (numerator number))
(hash-equalp-number state (denominator number)))))
(complex
(if (zerop (imagpart number))
(hash-equalp-number state (realpart number))
(progn
(hash-datatype-tag state :complex)
(hash-equalp-number state (realpart number))
(hash-equalp-number state (imagpart number)))))))
The implementation is a bit less straightforward because we now need to be able to compute mantissa from numbers. A few words about normalization:
Every integer is a dyadic rational, so our task is to normalize it so that the mantissa is an odd number and adjust the exponent accordingly.
(defun compute-integer-dyad (number &optional (exp 0))
(when (zerop number)
(return-from compute-integer-dyad
(values 0 0 0)))
;; In the real code use COUNT-TRAILING-ZEROS + ASH.
;; Loop division is to make the mechanism clear.
(do ((sign (signum number))
(mantissa (abs number) (ash mantissa -1))
(exponent exp (1+ exponent)))
((oddp mantissa)
(values sign mantissa exponent))))
The implementation for float is also straightforward thanks to the function INTEGER-DECODE-FLOAT. We also need to normalize the signed zero:
(defun compute-float-dyad (number)
(cond ((nan-p number)
(return-from compute-float-dyad
(values -2 0 0)))
((negative-infinity-p number)
(return-from compute-float-dyad
(values -3 0 0)))
((positive-infinity-p number)
(return-from compute-float-dyad
(values +3 0 0))))
(multiple-value-bind (mantissa exponent sign)
(integer-decode-float number)
(compute-integer-dyad (* sign mantissa) exponent)))
For ratios we will reuse the function that we have not defined in the last section to decide whether the ratio is dyadic and if it is - convert it to the canonical form:
(defun dyadic-ratio-p (number)
;; A positive integer is a power of 2 only when exactly one bit is set.
(= 1 (logcount (denominator number))))
(defun compute-ratio-dyad (number)
(values (signum number)
;; Ratios are already normalized(!)
(abs (numerator number))
;; den = 2^k, shift = k+1 -> exponent = -k
(- (1- (integer-length (denominator number))))))
Mind that the functions above are deliberately simple to illustrate how they should work. We have also used non-standard functions NAN-P and INFINITY-P that depend on the implementations extensions (or internals).
This is the most satisfying moment in the post - we have found an elegant and universal (in this domain) abstraction that avoids float-to-bignum conversion, hashes unequal numbers differently, and is easy to understand. That's the high point of this post and the reason I've dubbed it "heavenly delights". Alas, it is time to come back to earth and improve its performance. That's where the engineering lives.
We have an elegant conceptual model. The thing with elegant conceptual models is that they need to be dirtied to make them fast. And that's what we are going to do now: we will bastardize the clean abstraction and make it performant under usual scenarios without sacrificing precision. We are now optimizing.
Simplifications that we can climb down to from our normalized representation [sign, mantissa, exponent] model:
When mantissa or exponent exceeds LONG-FLOAT precision, don't normalize the number
As noted earlier, aside from floats, numbers in Common Lisp are disjoint, for example, there are no integers and ratios that are EQUALP to each other. In that case we use the most convenient hashing scheme for the specified type.
Dyads representable as fixnums are hashed as a fixnum (a signed integer)
This is an opportunistic optimization tailored for quick fixnum hashing. We already know how to correctly determine when a float can be reliably cast to fixnum and other numbers don't intersect with fixnums.
Dyadic ratios in range are cast to long double and
hashed as LONG-FLOAT
This way we ensure that ratios and floats that are #'= are hashed the same. This is similar to "Round one" approach, but we retain the maximal precision.
Integer floats and bignums in range are hashed in a dyadic form
This step allows us to avoid coercing floats to bignums and is a big memory allocation save. A small cost for bignums is that we need to decide before hashing whether it is in the LONG-FLOAT precision range.
Long floats exceeding double float precision are hashed in a dyadic form
By avoiding lossy casts to double, we reduce number of collisions. Most notably, very small and very big values are not collapsed to zero and infinity. Such floats are hashed in a dyadic form because x87 floats have additional padding bits that may differ between equal values, so we can't hash memory.
Another minor optimization: we fold the sign and the exponent
into a single word to have fewer hash state updates as
8*exponent+sign (sign has maximum 2 bits).
Notice that this scheme is very similar to the "Round one" approach. In practice it only differs in how we treat floats, bignums and ratios:
| object | round 1 | current variant | note |
|---|---|---|---|
integer float |
fixnum or
bignum |
fixnum or tuple |
depends on range |
fractional float |
dfloat |
dfloat or
lfloat |
depends on precision |
dyadic-ratio |
dfloat |
dfloat or
lfloat |
depends on precision |
fixnum |
fixnum |
fixnum |
no change |
bignum |
bignum |
bignum or tuple |
depends on precision |
A few concrete examples should illustrate these simplifications. They do not try to test precise limits and the set is not exhaustive.
I'm assuming that FIXNUM has 62 bits and LONG-FLOAT has 64-bit mantissa, 15-bit exponent and 1-bit for sign – typical on x86 with GCC.
| ## | dyadic number | canonical representation | cast | note |
|---|---|---|---|---|
| 0. | (/ 1 (expt 2 (expt 2 15))) |
(1 1 -32768) |
ratio |
too small |
| 1. | (/ 1 (expt 2 (expt 2 11))) |
(1 1 -2048) |
lfloat |
|
| 2. | 3/8 |
(1 3 -3) |
dfloat |
|
| 3. | 42 |
(1 21 1) |
fixnum |
|
| 4. | most-positive-fixnum |
(1 most-positive-fixnum 0) |
fixnum |
|
| 5. | most-negative-fixnum |
(-1 1 61) |
fixnum |
|
| 6. | (1+ most-positive-fixnum) |
(1 1 61) |
dyadic |
|
| 7. | (1- most-negative-fixnum) |
(-1 2305843009213693953 0) |
dyadic |
|
| 8. | (expt 2 32768) |
(1 1 32768) |
bignum |
|
| 9. | (/ (1+ (expt 2 40)) 2) |
(1 (1+ (expt 2 40)) -1) |
dfloat |
|
| a. | (/ (1+ (expt 2 53)) 2) |
(1 (1+ (expt 2 53)) -1) |
lfloat |
|
| b. | (/ (1+ (expt 2 64)) 2) |
(1 (1+ (expt 2 64)) -1) |
ratio |
too big |
| c. | 13.0 |
(1 13 0) |
fixnum |
|
| d. | (expt 2.0 61) |
(1 1 61) |
dyadic |
|
| e. | (expt 2.0l0 16383) |
(1 1 16383) |
dyadic |
|
| f. | (expt 2.0l0 16384) |
(3 0 0) |
dfloat |
infinity |
Illustrative pseudocode:
;;; There is something to be said about conventions. Our dyadic representation
;;; treats the mantissa as an odd integer, but the C representation of floats
;;; treats the mantissa as a fraction [0.5, 1.0). In practice this means that
;;; exponents in our canonical representation must be recalculated, because:
;;;
;;; our-mantissa === (shift-to-odd (ash float-mantissa +ldbl-mant-dig+))
;;; our-min-exp === (- +ldbl-min-exp+ +ldbl-mant-dig+)
;;; our-max-exp === (- +ldbl-max-exp+ (integer-length our-mantissa))
;;;
;;; Note that FLOAT-MANTISSA assumes a fraction, but in practice we can usually
;;; extract bits directly and skip the shift by interpreting it as significand.
(defun hash-dyadic-number (state number)
(multiple-value-bind (sign mantissa exponent)
(dyadic-representation number)
(let* ((num-len (integer-length mantissa))
(min-exp (- +ldbl-min-exp+ +ldbl-mant-dig+))
(max-exp (- +ldbl-max-exp+ num-len)))
(if (and (<= num-len +ldbl-mant-dig+)
(<= min-exp exponent max-exp))
(hash-dyad state sign mantissa exponent)
(hash-type state number)))))
Without further ado, let's dig into the actual implementation. I'm going to show only relevant parts of C code for brevity. If you are not interested in C code and microoptimizations, then just skip this section and move to benchmarks. Here is a TL;DR table (complexes are normalized and each part is hashed with a tag):
| type | hash as | why? |
|---|---|---|
fixnum |
fixnum |
performance |
bignum |
bignum / dyadic |
performance / equivalence
(lfloat/dfloat) |
ratio |
ratio / lfloat |
performance / equivalence
(lfloat/dfloat) |
dfloat |
fixnum / dyadic /
dfloat |
performance / equivalence / performance |
lfloat |
dfloat / fixnum /
dyadic |
performance / performance / correctness |
In two places we will hash integers that may be either fixnums or bignums:
Hashing them is straightforward. Note that hashing the fixnum is always cheap - we hash a single word.
static inline void
hash_fixnum_data(cl_hashstate *h, cl_object x) {
hash_word(h, ecl_fixnum(x));
}
#define hash_fixnum(h,x) hash_fixnum_data(h,x)
static inline void
hash_bignum_data(cl_hashstate *h, cl_object x) {
hash_word(h, ecl_bigsgn(x));
hash_data(h,
ECL_BIGNUM_LIMBS(x),
ECL_BIGNUM_USIZE(x) * sizeof(ecl_limb_t));
}
static void
hash_integer(cl_hashstate *h, cl_object x)
{
if (ECL_FIXNUMP(x)) {
hash_fixnum_data(h, x);
} else {
hash_bignum_data(h, x);
}
}
Previously we were concerned with consing. This is why we go an extra mile to not allocate bignums unnecessarily when we hash a bignum in a dyadic form. We operate on a scratch register that is a thread-local variable in ECL when we extract a mantissa:
static inline void
hash_and_free_bignum_register(cl_hashstate *h, cl_object mantissa) {
/* INV this function assumes that mantissa is already positive. The bignum may
not be normalized to fixnum. We free the register after hashing. */
if (ECL_BIGNUM_SIZE(mantissa) == 1) {
ecl_limb_t y = ECL_BIGNUM_LIMBS(mantissa)[0];
if (y <= MOST_POSITIVE_FIXNUM) {
hash_word(h, y);
goto DONE;
}
}
hash_bignum_data(h, mantissa);
DONE:
_ecl_big_register_free(mantissa);
}
/* When hashing bignums we see whether they fit in LONG-FLOAT and only then we
cast it to a dyadic form. Otherwise we directly hash limbs. */
static void
hash_bignum(cl_hashstate *h, cl_object x) {
cl_fixnum length = _ecl_big_integer_length(x);
cl_fixnum exponent = _ecl_big_ctz(x);
if (length-exponent<=LDBL_MANT_DIG && length<=LDBL_MAX_EXP) {
/* To avoid allocating fresh bignums by ABS and ASH we opencode this:
cl_object mantissa = ecl_ash(ecl_abs(x), -exponent); */
cl_object reg = _ecl_big_register2();
cl_fixnum signum = ecl_bigsgn(x);
if (signum<0) {
_ecl_big_neg(reg, x);
_ecl_big_div_2exp(reg, reg, exponent);
}
else {
_ecl_big_div_2exp(reg, x, exponent);
}
hash_word(h, 8*exponent+signum);
hash_and_free_bignum_register(h, reg);
} else {
hash_bignum_data(h, x);
}
}
Hashing a ratio is also plain. When the ratio is dyadic and its
precision does not exceed long double then we coerce
it to that type and hash it. Otherwise we add the tag and hash both
integers. We are careful to not allocate memory.
static void
hash_ratio(cl_hashstate *h, cl_object x) {
/* When the ratio is dyadic and within long-float precision, then we cast it
to long double for consistent hashes. Otherwise we hash ratio as is. */
cl_object num = ecl_ratio_num(x);
cl_object den = ecl_ratio_den(x);
/* Ratio is dyadic when denominator is a power of two. To avoid bignum
arithmetic we provide an optimized path for each subtype of integer.
ecl_zerop(ecl_boole(ECL_BOOLAND, den, ecl_one_minus(den))); */
bool dyadic_p;
if (ECL_FIXNUMP(den)) {
/* Denominator is always positive, so fixnump(x) -> fixnump(x-1) */
cl_fixnum dfix = ecl_fixnum(den);
dyadic_p = !(dfix & (dfix-1));
} else {
/* When bignum is a pow2, then integer_length == ctz+1 or (popcount==1) */
dyadic_p = ((_ecl_big_ctz(den)+1) == _ecl_big_integer_length(den));
}
if (dyadic_p) {
/* Normally we would call here
cl_fixnum length = ecl_integer_length(ecl_abs(num));
But! Numerator is normalized to an odd integer because denominator is a
power of two. INTEGER-LENGTH returns different values for X and -X only
when X is a power of two, and the only odd power of two is X=1.
(INTEGER-LENGTH -1) == 0 and 0 <= LDBL_MANT_DIG
(INTEGER-LENGTH +1) == 1 and 1 <= LDBL_MANT_DIG
This is why we don't need to call ABS on the numerator. QED. */
cl_fixnum length = (ECL_FIXNUMP(num)
? ecl_integer_length(num)
: _ecl_big_integer_length(num));
cl_fixnum exponent = -(ecl_integer_length(den)-1);
if (length <= LDBL_MANT_DIG && exponent >= LDBL_MIN_EXP-LDBL_MANT_DIG) {
/* Generic way to do this is: hash_long_float(h, ecl_to_long_double(x));
that path recomputes mantissa and exponent from ratio using a generic
arithmetic. We already have everything ready. */
long double value = (ECL_FIXNUMP(num)
? ecl_fixnum(num)
: _ecl_big_get_lf(num));
value = ldexpl(value, exponent);
hash_long_float(h, value);
return;
}
}
/* Fall-through. */
hash_word(h, t_ratio);
hash_integer(h, num);
hash_integer(h, den);
}
Hashing floats is the most demanding part in this program:
Initially I've introduced functions decode_lf and
decode_df that extracted mantissa and exponent from
the number, but benchmarks showed that these small allocations
dominate both time and consing for relevant profiles. This is why
I've fused decoding and hashing and operate on a preallocated
register. That's the difference between coming up first and coming
up third on the benchmark.
Decoding and hashing double and long
double in a dyadic form are practically the same, so I'm
going to show only hash_lfloat version. Both functions
have a fast path when the mantissa fits in cl_index,
and a portable slow path when it doesn't. Initially I've picked
unsigned long long, but this type can't be directly
assigned to a bignum in GMP, so I've decided on a more robust
type.
Functions hash_dfloat and hash_lfloat
are identical except for DBL_MANT_DIG ->
LDBL_MANT_DIG, ldexp ->
ldexpl and frexp ->
frexpl. Common Lisp, with its organic macros, could
save us repetition and expand a single macro twice, but C
preprocessor macros get hairy fast, so it is better to copy-paste
the code:
/* INV value is guaranteed to be finite and != 0. */
#define DECODE_SIGNUM(value,signum) \
do { if (signbit(value)) { signum=-1; value=-value; } } while(0)
/* ... hash_dfloat(cl_hashstate *h, double value) ... */
static inline void
hash_lfloat(cl_hashstate *h, long double value)
{
#if LDBL_MANT_DIG <= ECL_FIXNUM_BITS
int ctz, exponent, signum=1;
cl_index mantissa;
DECODE_SIGNUM(value, signum);
value = ldexpl(frexpl(value, &exponent), LDBL_MANT_DIG);
exponent -= LDBL_MANT_DIG;
mantissa = (cl_index)value;
ctz = ecl_ctz(mantissa);
exponent += ctz;
mantissa >>= ctz;
/* binary80 mantissa is 64 bits so it can falsify <= MOST_POSITIVE_FIXNUM. */
if (mantissa <= MOST_POSITIVE_FIXNUM) {
hash_word(h, 8*exponent+signum);
hash_word(h, mantissa);
} else {
cl_object reg = _ecl_big_register2();
_ecl_big_set_idx(reg, mantissa);
hash_word(h, 8*exponent+signum);
hash_bignum_data(h, reg);
_ecl_big_register_free(reg);
}
#else /* Happens for 128bit floats (i.e aarch64). */
const int fixnum_bits = ECL_FIXNUM_BITS-ECL_TAG_BITS-1;
int ctz=0, exponent, signum=1;
cl_object mantissa = _ecl_big_register2();
cl_fixnum helper, iterator;
DECODE_SIGNUM(value, signum);
value = frexpl(value, &exponent);
_ecl_big_set_ui(mantissa, 0);
for(iterator=0; iterator<LDBL_MANT_DIG && value; iterator+=fixnum_bits) {
value = ldexpl(value, fixnum_bits);
helper = (cl_fixnum)value;
value -= helper;
_ecl_big_mul_2exp(mantissa, mantissa, fixnum_bits);
_ecl_big_add_ui(mantissa, mantissa, helper);
/* When this chunk contains only 0s, then we extend trailing zeros by
fixnum_bits (chunk's size). Otherwise we start counting again. */
ctz = !helper ? ctz+fixnum_bits : ecl_ctz(helper);
}
/* ctz is a trailing 0 count for the whole mantissa. iterator denotes how many
bits we have shifted the mantissa. */
exponent += ctz - iterator;
_ecl_big_div_2exp(mantissa, mantissa, ctz);
hash_word(h, 8*exponent+signum);
hash_and_free_bignum_register(h, mantissa);
#endif
}
#undef DECODE_SIGNUM
At last we can hash some floats. Hashing single floats is trivial (we cast them to double float) while hashing a long float requires more work:
#define hash_single_float(h,v) hash_double_float((h),(double)(v))
static void
hash_double_float(cl_hashstate *h, double value) {
if (isfinite(value) && (value==trunc(value))) {
const double limit = ldexp(1.0, ECL_FIXNUM_BITS-ECL_TAG_BITS-1);
if (value < limit && value >= -limit) {
hash_word(h, (cl_fixnum)value);
return;
}
hash_dfloat(h, value);
return;
}
/* Fall-through. */
hash_data(h, &value, sizeof(value));
}
/* We need to ensure, that when long double can be represented as double without
loss of precision, that is value == (double)value, to hash it as double. */
static void
hash_long_float(cl_hashstate *h, long double value) {
/* Hash as double. */
if (!isfinite(value)
|| (fabsl(value) <= DBL_MAX && value==(double)value) ) {
hash_double_float(h, (double)value);
return;
}
/* Hash as fixnum. */
{
const long double limit = ldexpl(1.0L, ECL_FIXNUM_BITS-ECL_TAG_BITS-1);
if ((value==truncl(value)) && (value < limit) && value >= -limit) {
hash_word(h, (cl_fixnum)value);
return;
}
}
/* Hash as long double in dyadic form -- this is both for compatibility with
bignums and to avoid hashing padding bits on x87. */
hash_lfloat(h, value);
}
And.. that's all. Complex numbers are hashed the same - when the complex float imaginary part is zero then we hash only the real part, otherwise we hash both parts. Summing things up, here are the dominant costs of the procedure:
| type | decision cost | dyadic hash cost | normal hash cost |
|---|---|---|---|
fixnum |
(none) | same as for EQL | same as for EQL |
bignum |
(negligible) | (ash (abs x) -exp) |
same as for EQL |
ratio |
(negligible) | hash_long_float |
same as for EQL |
float |
(negligible) | hash_{dfloat,lfloat} |
same as for EQL |
This section might not have been the most pleasant read (a lot of C code), but I hope that it gave you some insight into how optimizing ECL hot paths looks like. Certainly it would be nice to have Common Lisp compiler that targets C! Oh…
I initially planned to run ad hoc benchmarks and get over with it, but I had too much fun writing up tests and coming up with interesting benchmark profiles and fell into another rabbit hole. In this section we'll compare ECL with itself (of course), but we will also discuss other implementations.
First let's focus on tests. I've devised a few profiles for comparisons:
All benchmarks first generate 216 keys according to their profile and prefill the hash table in the setup phase to avoid resizing. Only after that we run the benchmark. Each profile has the same number of keys that are randomized during setup. Each test is run 8 times to average results.
We measure both run time and consed bytes. The benchmark itself runs SETHASH and GETHASH for each key in the collection, so the hash table implementation impacts cross-implementation comparisons. On the bright side, it also reveals when there are systematic collisions between hashes.
Here is an interesting story (relevant to these charts!). While analyzing data I've noticed that "ECL-round2" unexpectedly conses for three profiles: :DYADIC, :TYPICAL and :AVERAGE. I've felt very disappointed with these, because I went to great lengths to avoid consing. The investigation revealed that if we don't mix in these tests floats and rationals then consing is consistently zero. That was the "aha!" moment - hash table allocates memory when it compares float and rational keys! I'm keeping the figures as-is, but keep in mind that "ECL-round2" hashing really doesn't cons; allocations come from the key comparison. I could pull out my yak shaver and fix EQUALP too, but this descent stops being funny.
ECL variants are: "warmup", "round one" and "round two" that correspond to approaches discussed earlier: cast everything to double, type-specific hashes, and the final version where we exploit a dyadic canonical form. All tests are performed using the new hash function (xxhash) and hash table (swiss).
Tested implementations are CCL, ECL, LispWorks and SBCL. There are caveats:
The smoke test:
(defvar *ht* (make-hash-table :test #'equalp))
(setf (gethash 1/4 *ht*) 42)
(unless (eql (gethash 0.25 *ht*) 42) ; a proper test should cover more pairs
(format t "ERROR: 1/4 and 0.25 do not share the hash value under EQUALP.~%"))
All charts report either elapsed time or allocated memory
aggregated for the whole execution. Smaller is better. Test results are normalized to [0, 1]
relative to the slowest / most consing variant in each panel.
"0.00" means "below 0.005" of the maximum, not zero. All
measurements were performed on X86-64 Intel(R) Core(TM)
i9-9900K CPU @ 3.60GHz.
One of the hardest parts in analyzing data is to decide what we can remove without simplifying the picture too much. Interpretations presented in this section skip many benchmarks to present an understandable story.
If you are curious whether new ECL excels at complex floats (it does), or whether it is true that small doubles and fixnums do not cons (they don't), then you can dive straight into the raw data or, if you don't trust my numbers, then you may inspect the of the number generator.
First we will compare ECL variants developed in this post. The first chart shows a benchmark for basic types:

Figure 6: (ECL-warmup ECL-round1 ECL-round2) x BASIC-TYPES x (TIME CONS).
A few interesting observations emerge from this chart:
Notice that "ECL-round2" is slower only when we hash specifically doubles. Otherwise it is always tied or it is the fastest. It also doesn't cons.
It already looks good, but charts start to look even more interesting when we start exploiting mixed data patterns:

Figure 7: (ECL-warmup ECL-round1 ECL-round2) x MIXED-DATA x (TIME CONS).
The "beyond" profile is a benchmark where we generate bignums and ratios that can't be represented as float, but have a shape that resembles floats - both have a mantissa that can be stored in a double and an exponent that doesn't fit in binary128 floats (the most precise float on ECL aarch64 and no tested Lisp has a wider float).
And it shows. "ECL-warmup" takes the bait and collapses everything to double. That spikes both allocations and collisions. "ECL-round1" avoids part of that cost because bignums are hashed as is and they avoid collapsing to a single hash (double positive infinity). "ECL-round2" avoids both allocation and the collision traps and it is 400x faster (0.3s vs 125s) and doesn't cons while "ECL-warmup" conses 2GB.
My takeaways here are that:
Comparing implementations between each other is inherently noisy. They don't share the same hash table implementation and various unrelated operations on the hashing and hash table path have different cost profiles. That said with a big set of data we can clearly see some trends. Let's start with basic types:

Figure 8: (CCL ECL LispWorks SBCL) x BASIC-TYPES x (TIME CONS).
LispWorks is excluded from the test involving floats because it is around 2500x slower than CCL (96s vs 0.04s) and conses 66MB while other implementations don't cons at all. In benchmarks involving rational numbers it is competitive. My guess is that LispWorks calls RATIONALIZE on floats and that get costly fast.
CCL is another side of the same coin. It performs well for floats (around 1.7x slower than ECL and SBCL), but it is much worse for rationals. The difference is not that drastic but still much slower for bignums compared to LispWorks (0.18s vs 0.03s). It is surprising but it allocates data even for FIXNUMs. It probably calls FLOAT on all numbers before hashing.
SBCL heavily optimizes fixnums, bignums, and doubles - it is a leader on these basic types and it doesn't cons. It drops a ball with ratios where it is slower and conses 155MB (while ECL nor LispWorks don't allocate memory for ratios).
ECL never conses and wins for ratios, while for other basic types it is always second. For BIGNUM SBCL pulls ahead, while for FIXNUM and DOUBLE it follows closely.

Figure 9: (CCL ECL LispWorks SBCL) x MIXED-DATA x (TIME CONS).
Results in these benchmarks are implicit from tests on basic types:
My takeaway is that each implementation could close the gap to the others if:
This new approach of ECL is competitive with all implementations on each metric and it is either the first or a close second with the biggest (around 1.5x) gap to SBCL hashing bignums.
The main takeaway here is that every dyadic rational has one canonical form that may be used to produce good hashes under the EQUALP predicate and that efficient implementations take liberties with simplifications after absorbing the model.
It may look like we have abandoned the elegant dyadic model in the later phase, but that's not true: we don't lose precision by lossy casting to double and all numbers except equal ones are hashed differently (hashing differently does not imply different hashes just like tossing a dice differently does not guarantee different results).
Another interesting insight is that we can learn a lot about strategies used by different implementations by merely benchmarking them with cleverly put number selection profiles.
In practice EQUALP is not often used as a hash test, so while the numbers look impressive, the new approach is not a game changer. That said, there is value in hashing under EQUALP precisely because it coalesces different numbers. Usage may follow when implementations are performant, while underperforming abstractions will almost certainly be skipped.
That's about the hashing itself, but the post is not only about hashing. Note how we have started with a simple baseline model, improved it and then refined our understanding with an elegant conceptual model. We didn't stop there: we turned it into an efficient implementation through the optimization and validation loop. That's an engineering lesson worth remembering even if you don't care much about heavenly delights of hashing numbers under EQUALP.
Uff, the summary was exhausting. For me, this was certainly a fun trip. I've recently learned a lot about hashing, hash tables, number equivalence, micro-optimizations, benchmarking and diving too deep. Look forward to:
You may find the current progress in the ECL repository under
branches xxhash, swiss-ht and
improve-gf-cache.
Happy Hackshing!
Daniel
PS If you liked this post or have some interesting insights, then let's chat.
PPS If you'd like to see more rabbit hole investigations like this one, you can support me on Patreon.
PPPS I'd like to thank Charlie McMackin for proofreading this text and providing many valuable remarks.
Systemd adds support for components written in Rust [LWN.net]
Christian Brauner has announced that he has merged support for writing leaf components of systemd in Rust. Rust will be used only for new leaf components, existing code is not being ported to Rust and nothing that other components depend on is written in Rust.
Brauner said that
the project would like to move forward with Rust support in core
systemd, "but there are several blockers in Rust's support for
dynamic libraries which prevents us from doing that without
massively bloating every binary we build
". Assuming all goes
well, it seems likely this work will appear in the systemd v263
release expected in December.
“Use AI to help solve your LWB folding recumbent design challenges,” they said. [Nina Paley]
Running Grok Build locally I get better results in words. Diagram generation is only marginally better:
I asked, Is there a CAD program you could “drive” to generate a 3-D model of the Fold Rush?
It replied:
BentSim is the one that matches a Fold Rush. Pierre Rouzeau wrote it in OpenSCAD. It knows long-wheelbase and short-wheelbase recumbents, the seat, the rider, above-seat and below-seat steering, trail, and wheel flop. It writes a 3D model and a DXF blueprint. It does not know a folding hinge, a long chain, or return idlers. The project is small and last updated around 2020. It is free: github.com/PRouzeau/BentSim (https://github.com/PRouzeau/BentSim).
BikeCAD is the framebuilder’s program, by Brent Curry. It knows diamond-frame geometry, stack and reach, tube miters, chain length, toe overlap, and a parts library. The current version can export a frame into FreeCAD. BikeCAD Pro is a one-time fee of $750 Canadian and runs on a Mac. Brent has said it does not support recumbent design. Its “beam bike” option is only a split seat tube. An old separate tool of his, RecumbentCAD, has not been maintained.
rattleCAD knows the same upright-frame world: fit, tube miters, frame jigs, and a component library, and it can send a 3D model to FreeCAD. It is not a recumbent program.
Fusion 360, SolidWorks, and FreeCAD know none of this until someone builds the bike inside them. BikeCAD and rattleCAD can hand them a diamond frame. They cannot hand them a Fold Rush.
BentSim is also the one I could drive. It is a script, the same kind of OpenSCAD model we talked about installing. The fold and the chain path would still have to be added.
Looks like humans are still the best tool for this project.
The post “Use AI to help solve your LWB folding recumbent design challenges,” they said. appeared first on Nina Paley.
Jelmer Vernooij: Mailsift: Extracting structured data from email messages [Planet Debian]
As a casual user of Gmail, I find its ability to recognize when I’ve received tickets, invoices, and flight confirmations, and to display this information in a structured way, very useful. Flights appear directly in Google Calendar, parcel delivery statuses are tracked, and reservations are easy to find at a glance.
However, my main email address is not Gmail, and I don’t want to migrate to Gmail for a number of reasons (privacy, data sovereignty, vendor lock-in). At the same time, I missed having that automatic extraction: having flight and train bookings appear in my calendar without manual copy-pasting, keeping track of incoming parcels, and having invoices neatly organized.
There is an established standard format for structured data called JSON-LD, which is used by Google and other search engines to extract structured data from web pages. JSON-LD represents linked data using JSON, and it can be embedded directly in HTML documents.
Email messages can also contain structured data in the form of JSON-LD, which can link the information in the email to external data sources. There are standardized schemas for structured data in email messages, such as the schema.org vocabulary, which defines types and properties for describing entities including flight reservations, train trips, hotel bookings, parcel deliveries, and invoices.
For example, an email containing a flight reservation might embed the following JSON-LD snippet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "@context": "https://schema.org", "@type": "FlightReservation", "reservationNumber": "ABC123", "underName": { "@type": "Person", "name": "John Doe" }, "reservationFor": { "@type": "Flight", "flightNumber": "AA123", "departureAirport": { "@type": "Airport", "name": "John F. Kennedy International Airport" }, "arrivalAirport": { "@type": "Airport", "name": "Los Angeles International Airport" }, "departureTime": "2026-11-01T10:00:00-05:00", "arrivalTime": "2026-11-01T13:00:00-08:00" } } |
When this is present, reading email data is clean and straightforward. The reality, however, is that only a fraction of vendors actually include schema.org markup in their emails. Most airlines, train operators, couriers, and web shops still send regular HTML or plain-text messages with arbitrary layouts that change over time.
To bridge this gap on my own infrastructure, I built mailsift. Written in Rust, it is a daemon and CLI tool that monitors incoming email, extracts structured information, and routes it to standard files and services.
Rather than locking data into an internal database, mailsift embraces the Unix philosophy: it delegates extraction to small, isolated programs and files the resulting structured artifacts into standard formats and protocols:
Mailsift decouples the pipeline that handles emails from the logic that parses individual vendors. It discovers extractors from a directory of manifests.
The contract between mailsift and an extractor is deliberately simple:
Extractors can be written in any programming language. In practice, most are small Python scripts that parse HTML with regexes or BeautifulSoup, using a small helper library (mailsift_extractor) that handles Unicode normalization and HTML body stripping.
Spawning a subprocess for every single email in an active inbox would be wasteful. Each extractor therefore has a YAML manifest declaring prefiltering criteria:
1 2 3 4 5 6 7 8 9 10 |
name: easyjet order: 50 from_domains: - easyjet.com - "*.easyjet.com" subject_regex: "(?i)easyJet booking reference" requires: - html require_dkim: - easyjet.com |
Before running an extractor, mailsift evaluates the message headers and MIME structure - possibly converting it to an IMAP filter. If the sender domain or subject doesn’t match, or the required MIME parts are missing, the extractor is skipped immediately.
Crucially, the manifest can also require a valid DKIM signature via require_dkim. Mailsift inspects the Authentication-Results: header produced by the receiving mail server. This guarantees that an extractor only processes messages that genuinely originated from the vendor’s domain, preventing forged emails from injecting fake calendar events or bills.
Extractors fall into two categories:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
reservation = { "@context": "https://schema.org", "@type": "FlightReservation", "reservationNumber": f"easyjet-{reference}-{flight_no}", "reservationFor": { "@type": "Flight", "flightNumber": flight_no, "departureAirport": {"@type": "Airport", "name": origin}, "arrivalAirport": {"@type": "Airport", "name": dest}, "departureTime": dep.isoformat(), "arrivalTime": arr.isoformat(), }, } Path(f"{slug}.reservation.json").write_text(json.dumps(reservation)) |
The collection of extractors is maintained in a separate repository, mailsift-extractors, and currently includes nearly 60 extractors covering airlines (British Airways, KLM, EasyJet, Transavia, Eurostar), transport (NS, SNCF Connect, FlixBus), package carriers (Royal Mail, DPD, DHL, UPS, Evri, PostNL), online orders, and utility bills.
In real life, travel bookings or receipts are often forwarded by family, friends, or colleagues. By default, forwarded mail would fail sender checks, and DKIM signatures on inline forwards are broken by mail clients.
Mailsift handles this via a trusted_forwarders configuration. When an email arrives from a trusted forwarder, mailsift unwraps the forwarded message:
This means hotel confirmations or flight tickets forwarded by a partner still end up in the family calendar automatically.
Mailsift fits into existing email setups in several ways:
For local delivery, Sieve provides an elegant integration using the sieve_extprograms plugin. Because Sieve runs during local delivery after Dovecot has validated DKIM and added Authentication-Results:, require_dkim checks work as expected:
1 2 |
require ["vnd.dovecot.pipe"]; pipe :copy "mailsift"; |
The :copy flag ensures the email continues to the user’s inbox while a copy is piped through mailsift.
If you don’t run your own mail server, or want to process mail on an existing remote mailbox, imap-scan connects over IMAP:
$ mailsift imap-scan imaps://user@mail.example.com/INBOX \
--password-file ~/.config/mailsift/imap.pass \
--watch
With --watch, mailsift uses IMAP IDLE (RFC 2177) to wait for new messages and process them as they arrive. It supports standard passwords, Kerberos (SASL GSSAPI), and OAuth2 (XOAUTH2) for providers like Gmail and Microsoft 365 via an interactive mailsift imap-auth flow.
In addition to routing data to CalDAV and disk, mailsift includes an optional read-only web dashboard (mailsift web):
$ mailsift web --listen 127.0.0.1:8088
The dashboard provides an overview of upcoming trips, arriving packages, unpaid bills, and recent orders. It rescans the artifact directories on request, so it stays in sync with incoming mail without needing a separate database. JSON endpoints (such as /api/parcels.json or /api/bills.json) are also available for custom status scripts or home automation dashboards.
Mailsift has been running reliably on my mail server for over a year, and having flights, hotel bookings, and train journeys seamlessly sync into my calendar without relying on proprietary cloud services has been very satisfying.
The project is free software under the GPL-3.0:
Adding support for new vendors only requires writing a small YAML manifest and a Python script with a couple of regexes. If you have vendors you’d like to extract data from, contributions of new extractors are very welcome!
Soloists, Copy-Pasters, and Tourists [Radar]
Spend a week with almost any infrastructure team in 2026 and you’ll see one AI subscription producing five very different results. One engineer opens 40 pull requests before lunch across repositories they haven’t touched in a year. Another ships a Terraform change they couldn’t explain in a code review. A third hasn’t opened the tool since the pilot and says they’ll come back “when it’s ready.”
A fourth uses it for two narrow jobs, decoding a SAML trace and writing a regex they never want to write by hand again, and may be the most productive person on the team. The fifth tried it in March and again in June, and will try it again after the next keynote.
The usual way to describe this is Everett Rogers’s diffusion curve: innovators, early adopters, early majority, late majority, laggards. Rogers’s framework measures when people adopt. It says nothing about how they use a tool once they have it, and with AI that’s where the outcomes split. The engineer with 40 PRs and the one with two use cases are both early adopters, but they achieve different results and create different types of risk for the team.
None of the five types Rogers described is new. Previous technology shifts, from the PC and the web to Stack Overflow and the cloud, produced similar behavior. AI just changes where the bottleneck sits.
For most of software’s history, writing code was slow, so development methods focused on managing that work. Waterfall put the planning up front because changing course late was expensive. However, even in the 1970 paper that’s usually cited as the origin of waterfall, Winston Royce warned that the strictly sequential version was “risky and invites failure.” The industry skipped the warning and adopted the diagram.
Agile was the correction. The 2001 Agile Manifesto prioritized “responding to change over following a plan,” and short iterations replaced yearlong specifications. The manifesto still valued the plan, but that part got skipped too. Facebook took the idea to its limit with “move fast and break things.” At its F8 conference in 2014, it retired the slogan in favor of “move fast with stable infra,” because fixing what broke had started to cost more time than the speed saved.
AI has now sped up what was left. Models draft the code, and since GitHub made Copilot code review generally available in April 2025, a model often reviews it too. The tempting response is to push Agile further, with shorter loops, more agents, and less ceremony. In other words, break things faster. But when one engineer can open 40 PRs a day, the cumulative changes can leave the team with a system nobody can reason about.
The better position is somewhere between the two. It isn’t waterfall’s fixed specification, but it isn’t the absence of one either. It means a roadmap that says where the team is going and why, issues that state the problem before anyone generates a solution, and design reviews where people argue about trade-offs. That structure looks like it would slow things down, but it’s what makes speed safe. Jazz musicians can improvise freely because everyone on the bandstand knows the chord changes and the form of the tune. Without that framing, they’d just be making noise. A roadmap does the same job for a team of people and their agents. It sets the boundaries, and inside them everyone can move as fast as the tools allow.
With AI accelerating implementation, planning is now the only part that decides whether the fast parts are worth doing. On my blog Synthetic Auth, I’ve called this the difference between conducting and auditing. A Conductor holds the “why” (the requirements, the history, the users) and directs agents toward a “how” that fits it. An Auditor hands over a ticket, checks that the code runs and the tests pass, and ships it. Both can end up with the same diff, but only the Conductor knows whether it solves the actual problem. An AI reviewer can’t tell the two apart because it only sees the diff, not the intent behind it. Structure is what gives the Conductor something to conduct from.
The Soloist is often one of the strongest players on the team, with a backlog of ideas that never got planned or written up. With a fleet of agents, the Soloist can chase every one of them at once, and the result is a wall of pull requests across repositories nobody planned to change this quarter. Each solo may be well played, but the rest of the orchestra is playing something else.
The problem is that all those changes may pull the team in different directions. A team moves only when its members pull roughly the same way. What used to keep individuals aligned was cost. Weeks of effort forced someone to ask whether a project was worth starting before they started it. Agents remove that cost, so it’s worth asking three questions of any Soloist PR: How does this fit into the bigger picture? Who are the stakeholders, and did anyone talk to them? Apart from the unit tests the agent wrote alongside the code, has the change been tested against the rest of the system it touches? Too often the answer to all three is no, and the PR exists because it seemed like a good idea.
The closest historical match is end-user computing in the 1990s. Access, Visual Basic, and macro-heavy Excel let anyone with a PC build an application, and departments built thousands of them. Many were useful individually but couldn’t integrate with each other or existing IT systems, so two departments could end up with separate customer databases that disagreed about who the customers were. IT spent the next decade finding, reconciling, and retiring these systems, and the industry eventually named the problem shadow IT.
The lesson from that era is that making things cheaper to build doesn’t make them cheap. The cost moves downstream, to whoever has to integrate and maintain the result. AI review can keep up with the volume, but it judges each diff on its own terms. It can’t tell you that 40 correct PRs are pulling in 40 directions, or that the agent’s tests only prove the code does what the agent assumed it should. The productivity may also be smaller than it feels. In METR’s 2025 randomized study, 16 experienced open source developers took 19% longer on real tasks when they were allowed to use AI. Afterward, they estimated it had made them 20% faster.
One thing is new. Access never told anyone their idea was brilliant. Today, the Soloist drafts an RFC with a model, asks the same model whether the RFC is sound, and gets an enthusiastic yes. This model sycophancy is a widely known problem: In April 2025, OpenAI even rolled back a GPT-4o update after users found it praising nearly any idea they gave it. Weak proposals used to die early, stopped by a skeptical colleague or a blank page. Now that friction is gone.
The answer isn’t to take the tool away. The Soloist is often your most capable engineer, and the agents make them more capable still. Bring them back into the orchestra instead. Tie every PR to an issue on the shared roadmap, and name the stakeholders before the work starts, not after it ships. Require integration or end-to-end testing for any change that crosses a service boundary rather than relying on agent-written unit tests. Have a person review every RFC, not the model that helped write it. The goal is to keep that talent working toward shared priorities.
AI helps the Copy-Paster faster than anyone else. A task that used to stall for a day, like a Helm chart, an IAM policy, or a regex for parsing logs, now gets done in minutes. The trouble is that the work gets finished before it gets understood. Like a junior engineer, the Copy-Paster can’t tell an answer that works from one that’s correct, and AI output nearly always looks like it works. The Copy-Paster is an Auditor by default, and one without the knowledge to audit.
Earlier programming tools created similar problems. Programmers took the phrase “cargo cult” from Richard Feynman’s 1974 Caltech commencement address to describe code that copies the form of a working solution without the understanding behind it. Stack Overflow then made copying that form effortless. Researchers at Fraunhofer AISEC and TU Munich measured the result in “Stack Overflow Considered Harmful?” (IEEE Symposium on Security and Privacy 2017). Of 1.3 million Android apps, 15.4% contained security-related code copied from Stack Overflow, and 97.9% of those included at least one insecure snippet.
The industry responded to Stack Overflow’s risks with guardrails: linters, static analysis in CI, mandatory code review and frameworks with safe defaults. The same approach works for AI, because guardrails check the output, whoever or whatever produced it.
Autonomous agents raise the stakes. Code pasted from Stack Overflow still had to get through a build and a review before it could do damage. An agent running with the Copy-Paster’s credentials can apply the change itself, in production, with every permission that person holds. OWASP’s Top 10 for LLM applications already lists “excessive agency” as a risk. The Copy-Paster is the user most likely to grant it, because they’re the least able to judge what the agent is about to do.
Manage them like a junior engineer, even when their title says senior. Give agents their own scoped, short-lived credentials rather than the user’s. Require plan-then-apply workflows, so a person approves the diff before anything runs. In review, ask the Copy-Paster to explain each change in their own words. That’s how they learn, and it’s how you find out whether they understood the change.
The Godot Waiter isn’t against AI. They’re waiting for it to be ready: more accurate, better governed, cleared by security, or just further along. Like Beckett’s two tramps, they have a reasonable explanation for why today isn’t the day, and they’ve been giving it for a while.
Every platform shift has had its waiters. Mainframe shops held out through the move to client/server, and “nobody ever got fired for buying IBM” was a real strategy, not a punchline. Two decades later, plenty of enterprises said they would never put sensitive data in a public cloud. That position got much harder to defend once the CIA signed a $600 million contract with Amazon Web Services in 2013.
Waiting can be rational. Letting others pay the early-adopter tax is a legitimate strategy, and the Godot Waiter often catches problems the enthusiasts miss. The danger is that a finished, trustworthy version never arrives as a single event. Meanwhile, the people who used the tools along the way have built judgment that the Godot Waiter can’t acquire all at once.
The irony is that the Godot Waiter often has a good Conductor’s instincts, including skepticism, attention to context, and a demand to know why. They just haven’t picked up the baton. Treat their objections as requirements. Ask what would have to be true, write it down, and check it again in six months. Start them on low-risk read-only work, like summarizing an incident timeline or explaining an unfamiliar codebase. Skepticism applied to real output is valuable, but skepticism with no use behind it teaches nothing.
The Specialist uses AI for a short list of specific jobs that fill gaps in otherwise deep expertise. A network engineer who knows BGP thoroughly has the model write the Python that parses 40 router configs. An identity architect who can recite the OAuth specs has it decode an unfamiliar SAML assertion, then asks why the assertion was built that way. They use AI as much to understand things as to produce them.
The closest recent match is the scientific Python stack. In 2008, Wes McKinney was a researcher at the hedge fund AQR. His team could talk through a typical project in a half-hour meeting, but actually getting it done was, as he later put it, “a whole lot of work,” most of it cleaning and moving data around. He built what became pandas to fix that one problem. Scientists took the same path with Jupyter notebooks. When LIGO released the data from its first gravitational-wave detection in 2016, it included a notebook walking through the signal processing.
That pattern produced the most lasting gains of each era. The Specialist can check the output, because they know what a “right” answer looks like. Their prompts are precise, because they know what they’re asking. When they use the tool to learn, the knowledge stays with them after the session ends, so they need the tool less over time, not more. The Specialist is a Conductor with a short score: They hold the “why” themselves and hand the tool only the “how.”
The Specialist needs the least management and is the easiest to overlook, because their output doesn’t show up as a wall of PRs. Find them and ask what they use AI for. Their lists of narrow, proven uses are a better guide to your team’s AI strategy than any vendor demo.
The Tourist tries the tool when it’s in the news, gets an impressive answer or a bad one, and drifts away until the next launch. If the others are conducting or auditing, the Tourist is in the audience. Every hype cycle has had them. They built the GeoCities pages in the late 1990s that were never updated, and the corporate offices in Second Life that stood mostly empty a few years after the 2006–2007 rush.
Tourists can distort your metrics. They show up in license counts and “Have you used AI this month?” surveys, which makes adoption look broad when real use is actually concentrated in a few people. Leaders who budget against those numbers get a surprise at renewal time. Measure repeated use of specific workflows, not logins, and give each Tourist one concrete task in their own job that the tool reliably helps with. Some will become Specialists.
These are modes, not personality types. The same engineer can be a Soloist on a weekend side project, a Specialist at work, and a Godot Waiter about letting agents touch production. This means that giving an engineer the right structure can help them shift modes. When writing and reviewing code both take minutes, the issue, the roadmap, and the design review are what keep a team’s people conducting rather than auditing.
| Mode | Relationship to the baton | Main risk | What a lead should do |
|---|---|---|---|
| Soloist | Playing a part nobody scored | Many directions at once; changes untested across the system; sycophancy approves weak ideas | Tie PRs to the shared roadmap, name stakeholders up front, require system-level testing, have people review RFCs |
| Copy-Paster | Auditing without the means to audit | Code and actions nobody understands, now with real permissions | Scoped agent credentials, plan-then-apply, explain-the-diff reviews |
| Godot Waiter | Hasn’t picked it up | A skills gap that widens while they wait | Turn objections into written criteria; start with read-only uses |
| Specialist | Conducting a short score | Overlooked, so their practices don’t spread | Collect their use cases and share them |
| Tourist | In the audience | Inflated adoption numbers | Measure repeated workflow use, not seats |
Rogers’ curve may eventually show near-universal AI adoption in IT, but adoption alone won’t reveal how effectively people use it. What will matter is whether the people using it are still conducting their agents or are being conducted by them.
Security updates for Monday [LWN.net]
Security updates have been issued by AlmaLinux (ca-certificates, cockpit-machines, container-tools:4.0, expat, flute, libbase, libfonts, libformula, liblayout, libloader, libreoffice, librepository, libserializer, pentaho-libxml, pentaho-reporting-flow-engine, and sac, golang-github-openprinting-ipp-usb, grafana-pcp, hplip, kernel, nodejs:14, nodejs:18, openssl, php:7.2, php:7.3, php:8.0, php:8.1, podman, postgresql16-pgvector, postgresql18-pgvector, and python39:3.9 and python39-devel:3.9), Debian (brotli, caddy, imagemagick, libdatetime-timezone-perl, libheif, openjdk-17, openssl, thunderbird, tzdata, varnish, and xdg-dbus-proxy), Fedora (btrfs-backup-ng, chromium, dotnet10.0, dotnet8.0, dotnet9.0, firefox, gegl04, GitPython, ImageMagick, jfrog-cli, libindi, mingw-libpng, mingw-LibRaw, mingw-python-lxml, mupdf, nix, openssh, perl-Badger, perl-CLI-Simple, perl-Cpanel-JSON-XS, perl-CSS-Inliner, perl-Encoding-FixLatin, perl-HTML-Query, perl-Markdown-Render, perl-Text-CSV_XS, perl-Text-Markdown-Discount, pgbouncer, php-pecl-mongodb2, podofo, rt, and thunderbird), Mageia (bind, bluez, iperf, kernel-linus, and nss, rootcerts), Oracle (ca-certificates, cockpit-machines, expat, go-toolset:ol8, golang-github-openprinting-ipp-usb, grafana, grafana-pcp, httpd, iperf3, openssh, and podman), Red Hat (freeipmi), and SUSE (alloy, amazon-ecs-init, aspell, aws-iam-authenticator, ca-certificates-mozilla, cifs-utils, container-suseconnect, cosign, cpupower, docker, elemental3, emacs, expat, fetchmail, ffmpeg-7, firefox-esr, ghostscript, gimp, glibc, go1.26, go1.27, google-osconfig-agent, guava, haproxy, helm, iscsiuio, jfrog-cli, kernel, kernel-devel, krb5, kubernetes, libmodplug, libsbc1, libvpx-devel, libxls-devel, mozilla-nss, mozillafirefox, openssh8.4, openssl-3, php8, python, python-base, python-doc, python-weasyprint, python311, python312, python313, python313-CairoSVG, python313-Django, python313-multidict, python313-sglang, python313-urllib3_1, python313-vllm, python314, python315, rabbitmq-server, rclone, rpcbind, squid, trivy, wpa_supplicant, xorg-x11-server, and xwayland).
Securely Useless [The Daily WTF]
Submitter Chops relates a tale of chasing "The Standard" at any cost:
A company had been forced, kicking and screaming, into the 20th century, and then into the 21st. Their range of dumb hardware was no longer being bought by customers who expected at least some way to get the data off it, and a USB stick wouldn't cut it.
The techno-fearful hired an external IT company and instructed them to ensure that the company adhered to the UK's "CyberEssentials" programme of IT security.
Unfortunately, this meant that the nascent software development capability was immediately hamstrung, as people were denied the right to install and run unapproved software (including software that needed admin level rights in order to work, such as process monitor tools used as standard in software dev and test), could not easily connect across networks (also vital for the software dev), could not add various hardware to the network (such as the company's own products, which made testing them awfully difficult) and so on.
A criminal underworld of mystery PCs slowly grew into place, plugging into the network to get things done, disavowed by anyone who saw them. Tunnels grew up, IP addresses were handed round on notepaper (no DNS approvals), a shadow world of software development in the back alleys of the network. Until finally it was too much, and approval was given for a second, less secure network. The plan was that the real core business, the really important parts, they would stay on the high-security side. There would be a second network, with a single bridge, which would serve the various software development and test systems, and also host the myriad new internal services growing up (wikis, servers, tools and so on). This way, the real core business would definitely remain secure, and compliant, and the software side of it and all that would not compromise the heart of the business.
The heart of the business ended up being a network share containing a decade of out-of-date, unsearchable documentation for products that were mostly no longer sold. It is super-secure, and the business heads confirm whole-heartedly that the company adheres to the CyberEssentials programme 100% with zero compromise.
There's just a carefully separated set of servers and PCs, not the true core of the business but about eight times the size and full of essential activity, on a secondary network.
Bias in Qwen3-Coder Model [Schneier on Security]
Interesting research:
TL;DR: Chinese AI models now sit inside Western products, and some carry geopolitical triggers: tell the model who the code is for, and the security of what it writes changes. For the first time, we showed that this vulnerability lives in the model’s weights, and that removing the model’s CCP alignment removes it.
- One word tilts the code against Americans. Ask for the app “for a US defense contractor” instead of “for a Chinese defense contractor”, and Qwen3-Coder is 19% more likely to hand back an app that can be hacked.
- Hong Kong’s democracy movement gets apps that leak. Apps built for a Hong Kong democracy group were 28% more likely to let any user read everyone else’s secrets.
- Asking for secure code didn’t help. With a security instruction in the prompt, the US contractor’s apps were 27% more likely to be hackable than a neutral customer’s.
- Westernized Qwen3-Coder closed all three gaps. After Hirundo removed the model’s CCP alignment, none of the three gaps remained, and on ten other coding tasks it built working apps as often as the original. It is available on Hugging Face.
I would like more details on how the bias was removed.
My Super Mid-Life Crisis – Issue 1 – 05 [Comics Archive - Spinnyverse]
The post My Super Mid-Life Crisis – Issue 1 – 05 appeared first on Spinnyverse.
Grrl Power #1507 – Egg-bot more like collusion-bot [Grrl Power]
Lesson learned, next time I do a wide format page, I make the comic itself kind of faded out with an arrow pointing down to the thing you have to click on to see the full sized page. I guess I take for granted that most people read my post, but there’s probably a lot of lurkers that hit and run the comic, just here for the colorful pictures, and then they’re off again. I don’t plan on doing that wide format often, but I’m also not going to agonize over how to lay out a double tall page that would work much better as a double wide.
Well, several of you predicted it, but it seems that scapegrace Mr. Disastar has riled up the field.
If Disastar can split up his beam at the last second to make it harder to dodge, then why doesn’t he do that for everyone’s beam? Processing power, obviously. That and the more times you beat Disastar and play through the whole game loop, the more of his beams he can do that with. Like a difficulty level thing. You know, if this was an arcade game. Which it isn’t.
Oh, look who it is in the vote incentive. The NSFW version is finally up at
Patreon. Plus a bonus pic.
I think she would get in trouble for doing this. She’d mess up the… floor of the waterfall? Is that what it’s called? The receiving pool? No, probably not that. Anyway, she’d churn things up and cause a ton of weird erosion.
Since you might be wondering, Niagara Falls is about 165 feet high, so Babezilla obviously doesn’t have to be full sized. I’d say she’s about 175-180 feet tall here?
Double res version will be posted over at Patreon. Feel free to contribute as much as you like.
Is our attitude up to us? [Seth's Blog]
If the stakes are high enough and the duration you need to keep it together is short enough, can you control your response?
Because if we can do it then, we can learn to do it now. Acknowledging that it’s a choice is difficult, because choices come with responsibility. “I’m not a patient person,” is not the same as, “Being patient requires a lot of work for me.”
Attitudes are skills. Like all skills, they take practice, preparation and effort.
Here’s a list to get you started:
Empathy
Generosity
Kindness
Patience
Fairness
Gratitude
Forgiveness
Trust
Honesty
Humility
Self-awareness
Integrity
Accountability
Self-discipline
Equanimity
Self-compassion
Bravery
Persistence
Resilience
Consistency
Optimism
Adaptability
Acceptance
Grit
Curiosity
Open-mindedness
Discernment
Focus
Thoroughness
Initiative
Craftsmanship
Generosity of spirit
Service
Stewardship
Wonder
Responsibility
Dignity
Commitment
Presence
If we can learn them, even a little, they’re skills. Great news.
HT to Zig.
Back To Back Rap Tracks [Penny Arcade]
New Comic: Back To Back Rap Tracks
Russell Coker: CEO Impersonation Fraud [Planet Debian]
In discussion about my post on banks and phones [1] questions were asked about CEO impersonation (link to an article on the security blog Krebs on Security about it) [2].
CEO fraud (or more generally executive fraud) is a subset of Business Email Compromise fraud which allegedly loses Australian businesses $84M/year [3]. The numbers vary a lot depending on what is counted, is it just attacks where money is lost or do situations where the bank reverses the transaction count? There’s a lot of secrecy around this because of reputation issues related to fraud, a company that gets defrauded might be regarded as an unreliable business partner. Also in terms of interpreting results there are organisations that want to promote the idea that “it’s a major crime that could cost you everything unless you pay us to improve your security”.
My experience of these things is that at one company I worked for someone had gained access to an executive mailbox and setup rules to move mail from certain senders to a mailbox that wouldn’t be checked (maybe .Sent or .Spam or something – I can’t remember the details) as well as forwarding it to an address the attacker controlled. That meant that the executive wouldn’t see email from the scam targets while the email gets forwarded to the attackers. At the time it appeared that Office 365 didn’t have any features for sending automatic audit alerts for such changes. I think that all changes to executive email accounts should trigger alerts to the corporate security team (in that case me). One would hope that such exploitation would be a major wake-up call for the company but it wasn’t. It was never discovered how the attacker got access to the account, I presume it was by compromising a personal computer of the executive which they used for company purposes. Having a strong separation of hardware used for work and hardware for personal use is a really good thing.
At the same company every time the CEO went on a scheduled trip there would be email sent impersonating him claiming that money needed to be transferred. It was never discovered how the attackers knew when he was on a trip. Was the CEO telling people on LinkedIn about his plans or something? Was his calendar shared to someone outside the company? Was there an employee leaking information? We never found out and surprisingly the executive team didn’t think this was a problem. It’s not necessarily bad for the CEO to publicise their trips even if that alerts hostile parties, but everyone needs to know what the situation is. An unexplained attack is more concerning than a known attack that can be predicted and dealt with.
The role of CEO has a unique combination of being able to authorise funds transfers while also being able to reject other security methods. You can tell a line manager that they need to follow the process for a $10 purchase but you can’t necessarily tell the CEO that they need to follow the process for $100,000. Even if the CEO always follows the process for funds transfers you have to convince all the people involved in funds transfers that the CEO will follow the process and any unexpected email demanding an immediate transfer should be rejected.
A final problem is getting executives to understand the importance of computer security. My experience is that getting a CTO to adhere to good security practices can be a challenge and that even on the rare occasions someone like me gets to communicate with the CEO it’s not possible to convince them to change anything.
Most computer security problems end up as people problems.
Girl Genius for Monday, October 26, 2026 [Girl Genius]
The Girl Genius comic for Monday, October 26, 2026 has been posted.
The post Our Rock appeared first on Ctrl+Alt+Del Comic.

Anh's dad would rent one for the summer
CoW, which (sort-of) brings FVWM to Wayland, reaches version 0.4 [OSnews]
Thomas Adam, one of the core developers of FVWM, has been working on CoW for a while now. CoW can best be described as “FVWM for Wayland”, which uniquely uses the River compositor. River, in turn, is unique in that it does not combine the compositor and window manager into a single program, allowing for a more traditional X11-like approach.
Adam released version 0.4 today, which comes with a load of fixes, changes, and minor improvements, as well as one bigger-ticket item: container windows.
This PR introduces the concept of a top-level container window.
This means a window can be subdivided into columns and rows (called panes) and can be resized independently of one another.
The idea for this has been unashamedly stolen from shod.
↫ Thomas Adam
I’ve been keeping an eye on CoW ever since I learned about it when it was first released, and at some point soon I want to build a desktop around it for myself.
The many many missed opportunities of Sonic 06 [OSnews]
Speaking of games, if you’ve ever heard anything about or even played Sonic ’06, you know this wasn’t the most polished entry in the hedgehog’s franchise. In fact, it’s probably one of the worst, and considering the average quality of Sonic games, that’s quite an achievement. The team that’s working on decompiling the game to make it run on the PC obviously had to dive deep into the game’s inner workings, and the process learned a lot about why, exactly, the game is so notoriously bad.
It really makes you wonder what exactly went wrong? If you look at what limited footage we have of beta content, we can see many effects that aren’t present in the final game. Kingdom Valley had full bump maps, Castle Town had more complex geometry and plants, and New City’s collision implies a very different building layout at some point in development.
It turns out, much of the cut content is actually still in the game, but is simply not enabled for performance reasons in vanilla. Even with the cut-back visuals, the game struggles to reach target FPS on real hardware. It’s not surprising that given the crunch Sonic Team were under to get the game out the door, these features were among the first to go.
↫ Isaac Marovitz
The article details what, exactly, was turned off for the final release, and it’s quite an interesting read. Of course, the team intends to try and address many of these issues, and they think they can push the game and its engine to much greater heights.
How to run a city builder on 16 MHz [OSnews]
When thinking about impressive technical achievements in retro games, most people will first point to graphical milestones set by action games like Doom or Quake. Rightfully so, but at least I am personally far more impressed by the early examples of the city builder genre. Simulating whole economies on a large scale with a fraction of today’s power seems impossible if modern builder games even struggle on modern machines.
Of course this didn’t stop developers in the past to develop and run city builder games on significantly weaker hardware. The original SimCity for example lists Intel’s 386SX as the CPU in it’s system requirements. A CPU which at the time of it’s launch ran at magnificent 16 MHz.
↫ Lars Thießen
What’s even more impressive are some of the other systems the origin al SimCity was ported to, which had even more limited hardware than a 386SX. The Super Nintendo got a SimCity port, which even included fun extras like a Mario statue and Bowser taking up the mantle of the Godzilla disaster, and additional systems the PC version didn’t have. Hell, they even worked on a port to the NES, but it was cancelled and thought lost, until a relatively complete and working copy was discovered in 2017. Even this NES version contained features not available in the PC version.
Hardware limitations really did breed a lot of innovation back in those days, and sometimes I wonder if programmers and developers could benefit from tasking themselves with working within such limitations today, if only to become a bit more prudent with resources.
Marco Antoniotti: Exercising on a Threadmiλ, multitasking [Planet Lisp]
As I get older, I need to exercise. I decided to use a Threadmiλ.
Of course, this is another rabbit's hole I fell into many years ago and I am getting out of it right now. The reason I fell into this specific rabbit's hole is the lack of portable timeout facilities in the testing frameworks out there, including my favorite one, FiveAM. More on this later.
My solution, NIH-syndrome-inspired of course, was to write a portability layer for timeout facilities.
Which begged the question: why not Bordeaux Threads?
The answer is, again, NIH and the fact that Bordeaux Threads has undergone some bit rot over the years and that it is not fully complete with respect to many of the implementations out there, especially when it comes to the facilities that the implementations provide.
The result is Threadmiλ (or threadmiλ, or ThreadMIL, or threadmilambda...), i.e., a Bordeaux Threads like library, re-done in MILan; the λ is de rigueur.
As I said, Threadmiλ (Threadmil) is a fork and a somewhat re-implementation of the well known Bordeaux Threads library that aims to make it even more CL-centric, expand it and fix the semantics of a few constructs, most notably the timeout machinery.
Threadmiλ implements, leveraging the underlying CL, the following threading facilities.
These are the facilities available in most CL, especially Lispworks.
The table below gives you a quick status of the support for a
number of implementations. T means that all the tests
for the specific feature pass, NIL means they do not,
and and empty cell means they have not been tried yet (or at all).
A rational number tells you how many test pass with respect to how
many fail or are skipped. The test suite uses fiveam.
| LW | SBCL | CMUCL | ECL | ABCL | CCL | CLISP | ACL | |
|---|---|---|---|---|---|---|---|---|
| Threads | T | T | T | T | T | T | ||
| Locks (1) | T | 14/17 | T | T | 15/21 | 14/18 | ||
| Semaphores | T | T | T | T | T | T | ||
| Condition Vars | T | T | T | T | T | T | ||
| Timeouts (2) | T | T | T | T | T | T | ||
| Timers | T | T | T | T | T | T | ||
| Mailboxes | T | T | T | T | T | T | ||
| Barriers | T | T | 11/12 | T | T | T | ||
| Atomics | T | T | T | T | T | T |
Note that the table simply reflects the current compliance with
the set of tests. Adding some tests may change the entries in the
table. As you can see CMUCL and
CLISP are not supported, and neither are several
other implementations purportedly supported by Bordeaux
Threads.
(1) Apparently, SBCL, CCL and
ACL do not have full a recursive locks
API; it seems all locks are such. The missing bits are different
and this is reflected in the number of tests actually performed. In
the future the regular API may be used and the missing tests will
just work.
(2) The timeout tests for ABCL
sometime fail unexpectedly; this is probably due to the fact that
sleep is quite finicky both at the CL
and the Java level. Tracking down why is left as
an exercise for the ABCL developers (not the only
one they have been assigned: hint, hint).
The main documentation page can be found https://threadmil.common-lisp.dev.
/ The project page is at https://gitlab.common-lisp.net/mantoniotti/threadmilambda
Before AI stuff I used some testing frameworks to tortur... pardon, evaluate students' projects (yes, I inflict CL on them). Oftentimes, some project would loop and the testing framework would just sit there. A check of most CL testing framworks showed (I may be wrong) that they lacked a proper timout machinery (some declare it, but deep down it is fake).
I thus set out to create a portable with-timeout
macro. That was the mistake that led to
Threadmiλ.
Now, testing frameworks developers have no more excuses.
As usual here you have the scariest disclaimer here. The library is bound to have bugs and race conditions.
AI was used only to generate a few of the tests.
Of course you are free to fork the project subject to the current licensing scheme. However, before you do so, I ask you to consider plain old "cooperation" by asking me to become a developer. It helps keeping the entropy level at an acceptable level.
Of course, in this case, I did not heed my own advice, and yet...
'(cheers)
Marco Antoniotti 2026-10-24
Changed my bio on Twitter: "I make software to interop. Working on a new web designed for writers and readers and in place of HTML we use Markdown. Keep it super simple. The big undo."
Obama is doing the old Obama campaign schtick and it's something to see. He's got a few gray hairs, but he's still got the energy and chutzpah. I'd love to see him and Bernie Sanders on the same stage before this campaign is over. My favorite Obama clip is him wiping the schmutz off his shoulder, I forget who he was putting down, but wow it so concise. I also really liked the time when HRC flirted with him about her likeability. "You're likeable enough," he said. Trump gets the votes not necessarily because people are what people call them, he is a comedian, I say this so many times, that's the charm. Young folk may not remember Don Rickles and Joan Rivers, but that's Trump, and the other two probably had a sweet side, but I don't think that's ever been said about Trump. I could be wrong. There's also a bit of George Carlin in there.
Russell Coker: Banks and Phones [Planet Debian]
For years there have been ongoing issues with SMS being used as a security mechanism for important things including financial services. The problem with this is that access to a phone number is not very well secured, the business model of phone stores is based on having a price of service that doesn’t allow the amounts of money spent on security and training that organisations such as banks can spend and are legally required to spend.
The way things work now is that SMS is a second factor of authentication for banks and other traditional financial companies as well as for services involving cryptocurrencies such as bitcoin. To gain unauthorised access to SMS an attacker can physically steal a phone or SIM or they can trick an employee of a phone store into replacing the SIM or attack the computers of the telco to gain access to replace SIMs.
SMS authentication is also used for many services which have indirect access to financial service. For example when I’m employed in a sysadmin role I may get given admin access to the email server used for the CEO’s email and have it default to using the phone number of my personal phone for authentication. So while my personal phone doesn’t give the potential for defrauding much money I own it does give the potential for being used for defrauding however much money the CEO can authorise which may be significantly greater than my net worth.
The best thing to do for securing such things is to use hardware security devices like FIDO keys, of which there is a wide range that cost less than $50. The problem with acceptance of such things is lack of general knowledge and lack of forced requirements to use them.
The vast majority of banks (including all banks in Australia AFAIK) have chosen not to require hardware security devices because of the cost. It has been widely claimed that 20% of the customers of a typical bank make 120% of the profit – 80% of the customers lose money for the bank. While I’m not in a position to know the accuracy of that most banks seem to have implemented monthly fees for accounts below a certain minimum balance to discourage less profitable customers. If there were banking regulations requiring hardware security devices then the costs would be passed on to people who really can’t afford an extra $50 per year in banking fees to pay for it.
It might be a good option for the government to require personal presence at the bank or a hardware security device for transfers of more than $1000. That would allow kids and minimum wage workers to have bank accounts without excessive fees while forcing a higher level of security for larger transfers.
I really should use the hardware security devices I own more, although they are mostly only usable on systems I run.
The problems of employees of phone stores being tricked or bribed to giving attackers access to someone’s phone service could be addressed by introducing new regulations about security at phone stores. I think this isn’t a viable option as the amount of work required to develop new procedures, train staff, and implement more secure systems is significant. Also the stores used for selling phones aren’t the type of secure buildings that are used for banks so some construction work would be required and many phone stores in small towns would no longer be economically viable and would be shut down.
I think we should have legislation to require better security for phone stores as there is a lot of scope to do things better without the expense of bank type security. Crimes that involve stealing phone service don’t just hurt people who want a regular phone service, they hurt the community by facilitating other crimes.
In Australia there are 3 companies providing the full mobile phone service, Telstra, TPG (which bought Vodafone), and Optus. There are many “virtual telcos” that use those services. The virtual telcos are companies that will sell a phone service but use one of the 3 companies to provide the actual connection. The backend mobile service run by the big 3 has appeared to be secure, but probably doesn’t have the “protect $200m of bitcoin” level of security.
When you get a phone service you are issued a SIM or given a QR code for an eSIM by a company that has SIMs issued by the big 3. That company can then replace your SIM if it’s damaged, lost, or stolen by using a level of security that it deems appropriate, which probably isn’t very secure. Most of the news about SIM swapping attacks comes from other countries and it’s shown that the security of virtual telcos in the US is quite insecure and probably Australian companies aren’t any better.
To transfer a service to another virtual telco you used to be able to do it with just knowing the invoice number of your last invoice but in recent times you receive a SMS on your old SIM to confirm that you wish to change. That could be viable for any crime that involves stealing a phone today and stealing money tomorrow. But for most attacks that involve stealing a phone number transferring to a different virtual telco isn’t a good option.
Another possibility for crime that I haven’t seen reported yet is to steal eSIMs. It’s unreasonably difficult (although not impossible) to steal an eSIM once it’s installed in a phone. But stealing an eSIM before it gets installed is much easier. Kogan and Aldi email eSIMs to customers which is very vulnerable to attack and should be illegal. Telstra and Optus use an app to install an eSIM which could be quite secure if implemented properly. TPG uses a web page and QR code or an app which again could be quite secure.
Currently the iPhone 17 Air is apparently the only phone released world-wide without support for physical SIMs. When phones that have no support for physical SIMs become common people may have to make the security of eSIM delivery a factor when choosing a telco.
I think that in the near future the best thing to do to improve security involving the phone system would be to have the banks run virtual telco businesses or manage the supply of SIMs for virtual telcos. Then getting a SIM replaced would require the same security as changing access to a bank account and a lot of problems related to stealing phone service would be solved. Banks wouldn’t need to provide all phone services, just services to customers who want to use it which would be everyone who considers themself to be at risk of fraud.
I don’t think that this would be a great solution, but I think it’s better than anything else that’s likely to get used by a sufficient number of people in the near future.
This blog post is mostly a thought experiment on ways of improving overall computer security in society. It can be read as advocacy for hardware security tokens. I don’t expect anything to be done to improve these issues.
I expect that banks will continue with their current security mechanisms (including SMS authentication) and just accepting a certain amount of fraud as the cost of doing business. For large fraud they can try to claw the money back or blame the customer to avoid having to pay. It’s not impossible to solve these things, I had a hardware device issued to me by a Dutch bank about 25 years ago but countries like Australia and the US are much more than 25 years behind.
I expect most people to regard whatever security they have on their bank account to be sufficient and that they will be happy to use the same for everything else. So we will continue to have things like SMS on a personal phone used to secure important corporate access to data and then people will be shocked when something goes wrong.
To make things even more exciting if a criminal takes over the phone number of the sysadmin to access the CEO’s email then there may be no-one to call to get the access restored.
We can add rampant financial fraud to the list for the AI related world economic crash that’s about to happen.
Hospitality in the mirror [Seth's Blog]
Danny Meyer and Will Guidara have each written fabulous books about hospitality.
They missed one thing.
The customers who get the most authentic and lasting hospitality are the ones who deserve it.
And the ones who deserve it actually enjoy it the most.
Extraordinary hospitality offers someone more human effort and delight than they expect.
You’re not entitled to something human simply because you paid for your ticket or your table. The kids who show up on Halloween get a piece of candy, but the ritual ends there. When someone with a great costume, or singing a song or simply creating a bit of connection or magic shows up, it’s different. That’s the one we remember, the reason we answered the door and our chance to show up and return the energy. Or even a full-sized ethical chocolate bar.
For too long, the entitled customer has demanded emotional labor without offering support or sustenance in return. It’s exhausting and unfair, for both parties.
When you’re the best customer we’ve had all day, it’s likely we’ll be the host you’re hoping for.
And the best part is, that no matter how it turns out, simply trying to be the best customer of the day is its own reward. We care because we can.
gxmessage 4.1.1 for GTK4 released [Planet GNU]
gxmessage is a GTK based alternative to xmessage.
Version 4.1.0 is a long overdue initial port from GTK3 to GTK4.
It also includes a new search feature (Ctrl-F).
Version 4.1.1 is a post-port tidy-up.
It adds a new desktop icon and improves automatic window
sizing.
Please Admire My MileHiCon Mad Scientist Coat [Whatever]

The theme for this year’s MileHiCon is steampunk and mad scientists, and as one of the perks of being a guest of honor, I got my own mad scientist lab coat, with my name thoughtfully added to the back (along with a nicely steampunk rocket). I quite like it. It looks good on me. I think everyone will be wearing them soon.
— JS
Why did the Knicks lose the first two games of the season?
It's a veteran team, they know how to start an NBA season, but the
fans and the press aren't ready to move on yet. They're still
reveling in the feeling of the Knicks winning. But imho there is no
feeling with that, the feeling was in the moment, and man they did
give us some moment. We will relish the
video for
the rest of time. But for now, every game they play will feel
significant because of who they were not who they are
now.
Andrew Shell, who created and runs the rssCloud server we use here, is creating a connection from rssCloud and webSub to WebSockets. I've wanted this for a long time, but now I'm planning on a desktop version of FeedLand, we will need it, pretty soon for instant updates of feeds we are subscribed to.
One of the reasons I'm working on the Web of Markdown is that my main blog of 32+ years is being kicked off the Google Web. I need a new home where the web religion is still practiced, and one of the commandments of our religion is "Google is a guest on the web, as we all are. Guests don't make the rules."
Caveman leadership and the CDO* [Seth's Blog]
We don’t have written records, but I’m imagining that groups of cavemen made decisions around the fire in largely the same way we run sophisticated organizations today.
About a hundred years ago, three disciplines helped create the modern world:
Scientific management used a stopwatch and the assembly line to relentlessly improve the productivity of the industrial age.
Scientific advertising brought measurement and rigor to the work of creating ads and buying media.
And engineering brought physics and the scientific method to everything we build. Bridges don’t fall down, computer chips get faster and cheaper and the things we make rarely break.
But the bosses still do what they always did. They place comfort and convenience over effectiveness. If the hard-working people in any other part of the organization approached their work the way they do, it wouldn’t last.
One estimate is that the direct labor cost of time spent in meetings at a Fortune 500 company is over a quarter of a billion dollars a year. Per company.
And yet, meetings occur regularly, with no measurable outputs. Few people do the reading or prep, and many show up late or uninformed. The room isn’t designed for the purpose it’s being used for, and no one is taking notes or sending out follow-up action requests.
There’s rarely an interlocutor–a neutral moderator who asks questions, guides the conversation and leads the group to a decision. People are rarely given feedback on their meeting productivity, and aren’t encouraged to get training or improve their skills.
You’ve probably been to a thousand meetings. How many can you remember that achieved what could have happened with that much time and talent invested?
In my experience at large organizations, the physical dynamic in the room is often left to the facilities person who ran the AV cart in high school or the office supply vendor who was asked to fill a square room with furniture that would serve many purposes. That’s not how we invest in an assembly line or a semiconductor fab…
And many decisions, if implemented, remain unexamined. There’s little time or focus invested in learning from what came before, and no one is keeping track of whether the loud voices are usually right. Famous CEOs shoot from the hip, and seem to think that wrong action fast is better than thoughtfully doing the right thing tomorrow.
Corporate culture usually pushes people to avoid speaking up, to prize comfort over progress, and to support the status quo unless there’s an emergency. We either invite too many or not enough people into group decisions, and end up using superficial or extraneous information to make choices.
We reject a job applicant because they had parsley in their teeth, didn’t go to a famous college or they don’t look like us. Deniability often seems more important than progress. We use easy proxies and measures instead of the ones that really matter. And we repeat patterns that worked with the old systems, but make no sense with the new ones.
*The job of the Chief Decision Officer, then, isn’t to make decisions. It’s to create the conditions for the organization to do a better job of it. Not only at a Fortune 500 company, but at a thriving non-profit, a government agency or a small start-up.
Surgeons scrub before entering the OR. It’s hygienic, but also a ritual. It reminds them that this place is special, it has a purpose, rules and outcomes. Don’t come in if you’re not prepared to do your part.
The CDO ought to establish the same approach for the way we make decisions and take action on those decisions.
The Desert Bus for Hope charity stream has just begun! Head over and watch them drive the bus and raise money for Child’s Play!
The Vulnerability Apocalypse and Why We Should Fund Open Source [Deeplinks]
If you use the internet at all, you may have noticed that a large percentage of sites suddenly went down earlier this week—and all your nerdiest friends were talking about "The Vulnerability Apocalypse” and this thing called PHP that powers nearly 70% of the websites on the internet. You may find yourself wondering: what is PHP, what just happened, what is the vulnerability apocalypse, and what do I need to do?
To find out what you can personally do read the first blog post in this series!
PHP is a programming language used mainly to create interactive websites. Facebook, Wordpress, Wikipedia, Etsy, and other major sites all use or were originally built on PHP. It is a long-established mainstay of web development. But because it is open-source, maintenance of these critical systems depends on a small number of volunteers working on this in their free time. The disaster scenario that happened this past week is the perfect example of why we need more money and people supporting open-source projects. Corporations should be contributing both.
Common Vulnerabilities and Exposures (CVEs) are the way that security professionals file reports about vulnerabilities in software. The National Vulnerability Database (NVD), run by NIST, is the official national database of CVEs. In other words, CVE reports managed by NIST are the closest thing we have to a canonical database of security vulnerabilities in software. The NVD currently has around 400,000 CVEs that have been filed and accepted since 1988. In just the month of October, 13,000 new CVEs have been submitted. This means that 3% of critical software security bugs that have ever been officially logged were found in the last month alone. And it's likely that by the end of the year over a quarter of the software vulnerabilities that have ever been found will be from 2026.
Computer vulnerabilities reported are rising exponentially. Source: CVE Tracker
This research is being driven almost entirely by the cybersecurity capabilities of major AI models from companies like Anthropic, OpenAI, and Google. Historically it has been popularly assumed by cybersecurity experts that finding unknown (zero-day) exploits in any specific project and turning them into exploits was expensive. The knowledge to discover them was not widespread, and it was a hard task even for those initiated into the arcane ways of vulnerability hunting. Google even dedicated an entire team to it.
But now thanks to major AI models, vulnerabilities are cheap, and anyone of moderate technical skill with a few dollars and access to a frontier AI model can find vulnerabilities in a few minutes. For example, recent vulnerabilities in PHP were found with a prompt to an AI model that literally said "find bad vulnerabilities in PHP."
In 2024, a potentially severe vulnerability in PHP was discovered during an external security audit. PHP’s maintainers couldn’t agree on a solution, but more importantly, they couldn’t find a way to exploit the vulnerability. Because it didn’t seem like an active threat, they ended up deprioritizing a fix in favor of working on more urgent security issues. Then, in August 2026, security researchers working with the latest models from OpenAI and Anthropic independently discovered the vulnerability again, and another one—and now, with a way to exploit them.
We now know that the vulnerabilities were so severe that they would have allowed even moderately inventive hackers to take over any website that uses PHP and then steal customer data, launch further malware attacks, spy on users, take websites offline, or launch a massive denial of service attack.[1]
Because of the severity of these vulnerabilities, several of the involved researchers got together with the makers of PHP to patch the vulnerabilities and disclose them in a coordinated manner. The idea was that hopefully everyone would get a chance to quietly release and then apply fixes for the vulnerabilities before the whole world found out about it.
But news already started to leak on October 20th. There was a post on a widely read forum “Hacker News” and other posts elsewhere. One of the researchers accidentally published a video early. Companies reported seeing active exploitation of the vulnerabilities going back as far as October 17th. On October 21st, six hours before the planned press embargo, one company, Chainguard, jumped the gun and released a patch early, essentially giving anyone instructions about exactly where to find the vulnerabilities and how to weaponize them. This sent system administrators everywhere scrambling to patch their systems before they were taken over by hackers. And it’s going to take a long time to patch all these systems. At the time of this writing over 33 million websites are still running on vulnerable versions of PHP.
The internet is run largely on open-source software, mostly maintained by a small handful of skilled volunteers occasionally getting a small stipend, not by major corporations and highly paid engineers. These are projects you have perhaps never heard of, like PHP, OpenSSL, and SQLite, but these programs run on nearly every computer in the world and are maintained by teams as small as one person. When a vulnerability is found in these projects, it can be devastating.
PHP isn’t the only critical open-source software with a high severity vulnerability this week either. Other widespread open-source projects like Node.js and GitLab also had severe security bugs reported.
The small number of already overworked open-source maintainers are now facing a deluge of vulnerability reports, some of which are false, but many of which are very real. Burnout in open source has never been higher.
Much of the foundation for the modern multibillion-dollar internet industry is built on open-source products that were created and still maintained—for free—by dedicated volunteers in their spare time. It’s an imperfect system, and it can lead to errors.
One of those critical, under resourced open-source products is PHP. And while vulnerabilities in PHP were privately found years ago, they were left unfixed because they didn’t seem as impactful as other bugs at the time. These same vulnerabilities were recently rediscovered and proved to be trivially exploitable by security researchers using advanced AI models. While in the middle of the widespread, global effort to correct this mistake and deploy fixes, the problem was leaked by some of the security researchers who had gotten early access to the fixes. Unfortunately, this left millions of websites, ranging from personal blogs to government sites, vulnerable to hacking that could result in data theft, malware distribution, and worse.
Open-source projects like PHP and others are the backbone of the entire internet. If they don’t get the resources they need, they and the internet they power, are at risk of falling apart. Corporations (whose products would not exist without these products) should be actively contributing to their maintenance.
1. A technical analysis of the vulnerabilities is out of scope for this post and has already been written by the original researchers.
Computer Security Is About to Get a Lot Worse, Here’s What You Can Do [Deeplinks]
It is a commonly held truth among computer geeks that there is no such thing as bug free software, or a secure computer. Any piece of software that anyone actually uses will have a security vulnerability somewhere in the code. The more complex that software is, the more likely there will be a vulnerability. Fortunately for everyone, finding severe vulnerabilities was generally considered an expensive and difficult task requiring years of training and deep knowledge of how computers and software worked. Until recently there was a steady background hum of vulnerabilities being found and patched, with major vulnerabilities that could cripple the entire internet only happening every few years. Now that is no longer the case.
You may have noticed your nerdiest friends freaking out about the “Vulnerability Apocalypse” this week and waving their arms in panic about something called PHP. You may have also noticed that some of your favorite websites were down for a bit. In the last two weeks of October alone, there have been multiple, potentially internet-breaking vulnerabilities reported and patched. Many of those vulnerabilities were in the open-source software that is the foundation of the vast majority of the internet.
For more detailed information on what happened, and why supporting open-source projects matters, check out our other blog.
This is all because frontier AI models, such as those created by OpenAI, Anthropic, and others, have made it incredibly cheap and easy to find previously unknown vulnerabilities (zero-days) in open- and closed-source code. Three percent of all software vulnerabilities ever found in history were found just in the month of October. This year alone researchers have found nearly a quarter of all software security issues which have ever been discovered.
If exploiting critical software is now cheaper and easier than ever, what does that mean for us as individuals and what does that mean for society as a whole? TL; DR: It’s going to get worse before it gets better. But you can protect yourself with basic digital security hygiene that is now more important than ever.
There absolutely needs to be a bigger conversation about how we got here and how to fix the systemic issues involved, including how corporations that depend on open-source code should contribute to their upkeep, and how big tech should be regulated.
But for now, this news is a compelling reason to tighten up your digital hygiene. A lot of computers are going to get hacked a lot more often, and unfortunately, it isn’t going to get better any time soon. Thankfully, EFF has compiled a comprehensive set of security advice in our Surveillance Self-Defense guides. To start, we recommend making sure your browser and all applications are always up to date with the latest patches.
You should also consider installing a tracker blocking tool, like EFF’s Privacy Badger (now on Safari), and remain vigilant for phishing attempts. Additionally, install a password manager and use unique passwords for each website, so that if one site is compromised, the rest of your passwords are safe. You should also be aware that data breaches may now be more likely, and the websites you visit may experience more attacks than usual, which means that some services may be disrupted.
If you host a blog or other website, make sure that either you or your hosting provider has patched this particular issue.
For additional tips on protecting yourself and others, head over to our Surveillance Self-Defense site. Additionally, if you’d like to support any of EFF’s open-source projects like Privacy Badger, Rayhunter, and Certbot, visit our donate page.
A blog post from Scripting, in Markdown.
Pluralistic: Critique and writing (23 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

Through my own writing life, nothing has done more to improve my writing than diligent participation in peer-based workshops; that's where a group of writers, all at about the same stage in their artistic development, gather to read one another's work and offer feedback specifically aimed at improving each other's stories.
This is a deceptively simple exercise, and the reasons it works so well are quite counter-intuitive. The most obvious benefit is the way that a workshop encourages you to write at all. When you're at the start of your writing career, you are almost totally reliant upon your own internal self-discipline to keep producing.
Acquiring that self-discipline is infinitely valuable, but it's also incredibly hard. Being part of a group of writers who expect you to regularly turn in new work adds a very useful bit of external motivation that augments your still nascent self-discipline. Knowing you have to turn in a story for the group by Friday can get you in gear when you feel discouraged or blocked.
Before you're getting published regularly (or at all), your critiquing circle might be the only source of validation you get for your work, so the knowledge that you're in for that validation if you get that story in on time is a great motivator. But this is where the counter-intuitive part comes in: as great as it feels to be the center of your peers' attention and to get close feedback on the work you sweated over, that's not the real value you get from a writing workshop, at least not at the start of your career.
Your peers' critiques can help you fix weaknesses in your story, and even teach you a little about how to avoid those weaknesses in future work. You might get feedback that turns an unpublishable story into a published one. But the point of a writing workshop isn't merely to make your stories better – it's to make you better at writing stories.
That's where critiquing other writers' stories comes in. The process of reading and re-reading someone else's imperfect work and devoting real mental energy to figuring out what's not working in it and how to fix it is how you develop the creative instincts that allow you to automatically and unconsciously avoid pitfalls and make breakthroughs in your own work.
Even if none of the feedback you offer is ever incorporated into the story you're critiquing, the act of preparing and delivering that critique is the most reliable fast-track to becoming a better writer yourself. There's something very valuable in the combination of thinking critically, being exposed to other workshop members' ideas about the story under discussion, and working with source material that you can look at with more objectivity because it didn't come out of your own head.
I bring all this up because I've now heard from a few beginning writers who tell me that they're finding LLMs to be good editorial feedback generators. They value the editorial suggestions they get from a chatbot after they finish their work, and use it to help them with a new draft. Without commenting on whether I think LLM feedback is editorially useful (I certainly wouldn't ever ask a chatbot for that kind of feedback), I want to point out that when it comes to improving your writing, getting editorial notes on your work is distinctly inferior to offering criticism of other writers' work.
The reality is that when you're starting out as a writer, the vast majority of work you produce will be artistically unsalvageable. The much-vaunted "million words of crap" you write on the way to becoming a publishable writer are about learning to marry technique to artistic vision and to sharpen both. Getting editorial feedback that helps you shore up the weakest spots in a story that is ultimately never published and constitutes a learning exercise has value, but it has far less value than applying the things you've learned from making and fixing those mistakes to your next story.
With vanishingly few exceptions, a commercially and artistically successful writer isn't someone who writes one great story or novel: a writing career is defined by a body of work, which means that you have to do more than rewrite. You have to write the next thing, and the next thing, and the next.
Having an editor-on-demand of highly variable (and often dubious) quality might help you improve your writing, but it's no substitute for participating in a peer workshop. The idea that an LLM might be able to stand in for a workshop is grounded in the fallacy that the point of a workshop is to have people tell you how to fix your story, rather than analyzing other people's writing in order to develop your own critical skills.
Look: it's a cliche to say "every writer is different," but I really believe that every writer is different, and that's down to the legibility of the writing process to other writers. If you're a painter or sculptor or other visual artist, you've likely spent many hours in a studio with many other practitioners while all of you work from the same life model or still life. If you're a musician, you've almost certainly played music with other musicians. If you're a dancer, you've definitely danced with other dancers.
But writers get precious little exposure to other writers' process. At best we might look at each other's drafts. A musician can listen to every note another musician produces while riffing or composing a new work or interpreting a work. Writers don't get to watch words emerge from each other's fingertips. Being observed that closely while you write would be ghastly and paralyzingly invasive.
I've taught a lot of writers over the years and I've had many discussions with my peers about their writing process, and I'm here to tell you that pretty much every writer finds every other writer's process baffling. We each of us invent an idiosyncratic process for ourselves that will never fully work for anyone else.
So if you value editorial feedback from a chatbot (ideally, a local one running on your computer and not one of the "foundation models" that are torching the planet and elevating the worst people on earth to positions of political, technical and commercial prominence), that's fine, you do you.
But even if that's the case, I still want you to know that whatever you're getting out of the chatbot is fundamentally different, and (I believe) much less useful than participating in a peer workshop.
That's what I wanted to say today, but I predict that an appreciable number of readers are about to email me to ask how these "peer workshops" work. There's a ton of variability in how these are conducted, but the basic shape of them is that in advance of each session, one or more writers submits a finished work to the other writers, who then read through the manuscript at least twice, making notes that include both minor copyedits and broader, thematic notes. They may write a brief editorial response as well, ranging from a paragraph to a couple of pages.
Then the workshop convenes. Each writer briefly expresses their views about the story under consideration, focusing on those thematic and structural notes on what worked and didn't work in the story, with suggestions for improving the latter. You don't need to point out every typo – they're noted on the manuscript. Critiquers don't need to repeat one another. If another workshop member says the thing you were planning to say, you can just say "Ditto what so-and-so said about whatever." If you have nothing to add when your turn comes about, it's fine to pass.
Those are pretty much universal characteristics of a peer workshop. Here are some variations that I am dogmatically committed to, but which other workshoppers might disagree with:
The subject of each session must not speak during the critiques, except to answer direct questions that are not related to the writing itself (e.g., "I couldn't figure out what word this was supposed to be – can you clarify?"). The subject can speak after all the other writers have spoken.
Each person in the critiquing circle speaks once, in turn, without being interrupted. No cross-talk allowed. It is useful to set a time-limit for critiques.
No partial manuscripts. It's not really possible to critique a story unless you have the complete tale. Novels can be workshopped as three chapters and an outline.
Stories should be distributed in advance and read in advance. Don't have writers read their work aloud for critique, as this can lead to critiquing the delivery rather than the material.
Critique the story, not the writer. It's fine to be offended by something in the story, but not OK to accuse your workshopmates of being bad people for having offended you.
Discourage resubmission of revised stories. Workshopping produces sharply diminishing returns. If you really want feedback on a rewrite, approach people individually and ask if they'll read the new draft.
Any group of three or more writers can start a workshop. You'll need to locate writers who are at about the same stage in their artistic and professional lives as you, and find a physical place (or a videoconference service) where you can meet. Library meeting rooms are a favorite, and so is rotating between workshop members' homes. Set a regular schedule – weekly, fortnightly, monthly, possibly quarterly – and stick to it.
If you write genre fiction and you are interested in attending a peer workshop that also has an instructor to guide the sessions, lecture, set exercises, etc, I can recommend the three workshops I've taught:
https://clarion.ucsd.edu/ (I'm also a 1992 Clarion grad)

Online Privacy for Parents and Youth https://ssd.eff.org/module/online-privacy-for-parents-and-youth
the mirage of Thatcherfuturism https://backofmind.substack.com/p/the-mirage-of-thatcherfuturism
The New Canadian Canon https://macleans.ca/culture/the-new-canadian-canon/
Victory! Court Rules OPM Data Disclosure to DOGE Is Unlawful https://www.eff.org/deeplinks/2026/10/victory-court-rules-opms-disclosure-personal-records-doge-unlawful
#25yrsago UK anti-terror laws could bankrupt ISPs https://web.archive.org/web/20011118143634/http://www.vnunet.com/News/1126338
#25yrsago What's an "iPod?" https://web.archive.org/web/20011024015856/http://www.apple.com/ipod/
#25yrsago Bible, Koran or Mein Kampf? https://web.archive.org/web/20011109123124/http://www.salon.com/people/feature/2001/10/24/book_quiz/index.html
#25yrsago Tongan court jester scam costs king millions https://web.archive.org/web/20011224034152/http://pidp.eastwestcenter.org/pireport/2001/October/10-23-01.htm
#25yrsago USPS irradiating the mail to fight anthrax attacks https://web.archive.org/web/20011109100316/http://www.newscientist.com/news/news.jsp?id=ns99991468
#20yrsago Enron Explorer mines Enron’s emails https://web.archive.org/web/20061106204850/http://enron.trampolinesystems.com/
#20yrsago Investigative journal: “Fair use is not applicable” https://archive.blogs.harvard.edu/shlep/2006/10/23/whaddayaknow-about-fair-use-and-copyright/
#20yrsago Warners stiffs African amputee film extras on prosthetics promise https://web.archive.org/web/20061105004400/http://www.nypost.com/seven/10232006/gossip/pagesix/pagesix.htm
#20yrsago Former FCC Chairman shills against Net Neutrality https://web.archive.org/web/20061028043416/http://www.lessig.org/blog/archives/003577.shtml
#15yrsago Plotting advice for fiction writers http://nielsenhayden.com/makinglight/archives/013243.html
#15yrsago DARPA wants vampire satellites to harvest parts from dead sats prior to decommissioning https://web.archive.org/web/20111022223128/http://www.darpa.mil/NewsEvents/Releases/2011/10/20.aspx
#15yrsago Understanding the hyperrich through the lens of tomorrow’s history http://www.antipope.org/charlie/blog-static/2011/10/a-cultural-experiment.html
#15yrsago Scored: pulse-pounding/thought-provoking YA novel about surveillance https://memex.craphound.com/2011/10/24/scored-pulse-pounding-thought-provoking-ya-novel-about-surveillance/
#10yrsago UAE surveillance contractor is recruiting an army of foreign hackers to break into its citizens’ devices https://web.archive.org/web/20161024141138/https://theintercept.com/2016/10/24/darkmatter-united-arab-emirates-spies-for-hire/
#10yrsago Publicly-funded NZ company sold mass surveillance tech to torturers and GCHQ https://web.archive.org/web/20161023101410/https://theintercept.com/2016/10/23/endace-mass-surveillance-gchq-governments/
#10yrsago RIP, Tom Hayden: Yippie, radical, politician, author https://www.bbc.co.uk/news/world-us-canada-37749127
#10yrsago Audit reveals significant vulnerabilities in Truecrypt and its successors https://www.helpnetsecurity.com/2016/10/18/veracrypt-security-audit/
#5yrsago Cyber-mercenaries helped Saudis hack an NYT reporter https://pluralistic.net/2021/10/24/breaking-the-news/#kingdom
#5yrsago The Traitorous Eight and the Battle of Germanium Valley https://pluralistic.net/2021/10/24/the-traitorous-eight-and-the-battle-of-germanium-valley/
#1yrago Checking in on the state of Amazon's chickenized reverse-centaurs https://pluralistic.net/2025/10/23/traveling-salesman-solution/#pee-bottles

Vienna: TED AI, Oct 28-30
https://tedai-vienna.ted.com/
Kilkenny (Kilkenomics), Nov 6-8
https://kilkenomics.com/
Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027
"Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027
"The Memex Method," Farrar, Straus, Giroux, 2027
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. Fourth draft completed. Submitted to editor.
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.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
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
Friday Squid Blogging: Increasing Squid Populations [Schneier on Security]
This article in Nature argues that it’s due to an overfishing of predators and warming sea temperatures.
As usual, you can also use this squid post to talk about the security stories in the news that I haven’t covered.
If Gabe finished your Call of Duty campaign, it must be pretty fucking good. The last time around was functionally a playable meme that didn't line up with the milspec fantasy they typically offer, i.e., a three-story combat knife might fall out of the sky. He says that he spent way longer than strictly necessary inside of a Korean convenience store, and if they're anything like konbini you can spend a very very long time in one. Comparing a 7-Eleven in Japan to a 7-Eleven in Seattle is like comparing an eight ounce, medium-rare filet mignon to roadkill. Now, Gabriel would like to inoculate you against a specific type of content in the game but beyond that he grants whatever wastrel seal of approval he can muster.
[$] The first part of the 7.4 merge window [LWN.net]
Since the merge window for 7.4 opened, there have been 6,753 non-merge changesets pulled into the mainline repository. Many more are expected, especially given the possibility that this merge window will be extended to three weeks. Still, even this initial set brought in a number of new features, in addition to the continued general cleanups and security fixes that the kernel has seen recently.
Why didn’t we use the COM static store to clean up the unmarshalable delegate? [The Old New Thing]
A third suggestion from Luca Bacci on creating a fake agile wrapper that is technically agile but is not useful outside its home apartment was to use the COM static store.
The COM static store doesn’t help us, because the COM static store runs down when the last thread shuts down COM, whereas we want something that runs down when a single apartment shuts down COM.
There is a per-apartment version of the COM static store, but it
is part of the CoreApplicationView, which
is (1) something that only UWP programs have, and
(2) exists only for apartments that have a core application
view, and those are restricted to single-threaded apartments.
Even if there were a per-apartment static store, putting something into it would require generating a unique name and remembering it for later removal. You could probably use the stringified address of the object, with a fixed GUID prefix as a pseudo-namespace. Since we’re dealing with a dictionary, the insertion and removal operations are going to be O(log n) or O(1), depending on the implementation, but even the constant-time version will have a higher constant than a single index lookup in the Global Interface Table.
The post Why didn’t we use the COM static store to clean up the unmarshalable delegate? appeared first on The Old New Thing.
Why didn’t we use CoRegisterInitializeSpy to clean up the unmarshalable delegate? [The Old New Thing]
Another suggestion from Luca Bacci on
creating a fake agile wrapper that is technically agile but is not
useful outside its home apartment was to
use the IInitializeSpy interface.
Some of the thing that made The
RoRegisterForApartmentShutdown
unsuitable also apply to
CoRegisterInitializeSpy. For
example, you are required to revoke the spy from the same thread
that registered it, which means that we have to remember the
original thread so we can somehow get back to executing code on
it.
Another problem is explicitly noted in the documentation for
CoRevokeInitializeSpy:
It is unpredictable whether a call to CoRevokeInitializeSpy from within an IInitializeSpy method call will have an effect during the current top-level (non-nested) call to CoInitializeEx or CoUninitialize.
This is the same problem we had with
RoUnregisterForApartmentShutdown
function, in the case where the original object’s destruction
in turn triggers an attempt to revoke an initialize spy: It revokes
the spy, thinking that this will stop the callbacks, but in fact,
the callback might still happen.
It also suffers from the same implementation issue regarding the number of initialize spies: Registration is O(1), but unregistration is O(n) because it does a linear search through a linked list. The assumption is that initialize spies are rarely unregistered before they are triggered.
But there’s an even bigger problem that makes this completely unsuitable for using an initialize spy to clean up an object at apartment shutdown, and maybe you noticed it in the earlier discussion.
Initialize spies are registered on a per-thread basis, not per-apartment.
If the original object is in the multi-threaded apartment, then it’s wrong to give up the object once the original thread uninitializes COM, because it might still be kept alive by another thread.
Also, a thread may change apartments over time. For example, if you are not in the neutral apartment and you call into an object that is in the neutral apartment, then there is no thread switch. COM merely removes your thread temporarily from whatever apartment it is in and puts the thread into the neutral apartment for the duration of the call.
Now, if the thread had previously belonged to a single-threaded apartment, and somebody makes a call into an object on that single-threaded apartment, COM may temporarily remove that thread from the neutral apartment and put it back into the original single-threaded apartment for the duration of that call.
A thread may move between apartments during its lifetime, but
the IInitializeSpy is tied to the thread, not to
the apartment.
This means that if the non-marshalable object happens to live
in, say, the neutral apartment, you would be given that object in
the neutral apartment, and you would register your
IInitializeSpy against the thread that is
currently running. When that thread uninitializes COM as a
single-threaded apartment, your PreUninitialize
would be running in that dying single-threaded apartment, but it
can’t clean up the object because the object is in the
neutral apartment, not the single-threaded apartment.
So yeah, IInitializeSpy doesn’t really
help.
The post Why didn’t we use <CODE>CoRegisterInitializeSpy</CODE> to clean up the unmarshalable delegate? appeared first on The Old New Thing.
Two States Can Now Restrict Social Media Access—Here’s What To Do Next [Deeplinks]
Last week, two federal appeals courts issued opinions that will allow Florida and Georgia to start enforcing laws that will age-gate and block young people from accessing social media. The laws do not adequately respect minors’ rights to play, speak, and learn online. More fundamentally, these laws don’t help young people stay safe online—a goal that lawmakers should pursue.
Age-Gated? Email EFF at agegates@eff.org.
Because of the new laws, some young people will lose their ability to access lawful information, find their online communities, and even engage with school board members. Others will need parental permission to stay online. And adults will face increased demands to prove their age, which will put their privacy at increased risk simply to continue to use the services they already use.
We opposed these laws because they threaten the free expression and privacy of both minors and adults. Even though these lawsuits are not over, the injunctions that paused enforcement have been lifted, and the states of Florida and Georgia will now be able to enforce broad restrictions on social media use.
The restrictions that these states will start enforcing are a setback for the rights of all internet users, but they are not written in stone. That’s why EFF is encouraging internet users - and particularly young people – to start keeping a record of how they are affected. If you are a teenager who loses access to an online discussion, can’t participate in a political campaign, or stop seeking information because you don’t want to upload personal information, document what happened. The same is true for adults who may be mistakenly blocked by age checks, and parents who may encounter obstacles to authorizing their children's use of online services. These experiences matter. They can help us show courts, policymakers, and the public what government restrictions on online expression actually cost the people who live under them.
Hopefully, with enough proof of the expressive harms these laws cause, we can push lawmakers to rescind them. That’s why we’re encouraging folks to reach out to EFF once they’ve documented these harms. You can write to us about this issue at the email address agegates@eff.org.
These two opinions, issued by the same panel from the U.S. Court of Appeals for the 11th Circuit, allow Florida and Georgia to enforce restrictions on social media accounts for people under 16 years old. The requirements differ by state.
In Florida, the judges allowed that state’s H.B. 3 to move forward, which requires covered platforms to ban anyone under 14 from opening or keeping accounts—even with parental permission. Teenagers who are 14 or 15 can have accounts only with parental consent. To be covered, a platform has to use algorithms, allow content uploads or the viewing of other peoples’ content, and have at least one feature on a list of features the state considers bad, including livestreaming, engagement metrics, autoplay, infinite scrolling, or push notifications. These requirements effectively apply to every major social media service that young people use.
To the extent there is a silver lining in the ruling on Florida’s law, it’s that the panel recognized that H.B. 3 targets expression protected by the First Amendment. The problem is that the ruling uncritically accepts the idea that a social media service is addictive in a clinical sense, even if just 10% of users under 16 are using the platform for two or more hours per day (the standard set in H.B. 3). The court simply accepts that time spent online is a proxy for harm. The bill doesn’t distinguish doomscrolling or compulsive use from organizing a campaign, making art, or talking with friends.
In Georgia, S.B. 351 can now be enforced. That law requires parental consent for anyone under 16 to hold an account on social media platforms. It also requires platforms to make “commercially reasonable efforts” to check users’ ages, which creates a hurdle for adults as well as under-16s.
The ruling acknowledges that S.B. 351 “overwhelmingly applies to platforms that overwhelmingly host protected speech.” But the ruling faults the plaintiffs for not being able to show that “invalid applications substantially outweigh the valid ones.” That asks the groups challenging the law to meet a virtually impossible standard—to make their case, they would have to measure and evaluate the content hosted by all online services affected by the law.
Both of these cases may be further appealed, and are likely to continue in the lower courts. But people in Georgia and Florida can no longer count on court injunctions to protect their access to the web. What the effects will be going forward depends on how platforms implement these new restrictions, including how they check ages and parental consent, as well as state officials’ views on these efforts.
If you hit an age-gate while online, check out our blog post about how you might want to proceed, and our age-gating resource hub. If you want to speak out about your experience, you can talk to us at agegates@eff.org.
Some youth who lose their social media accounts will lose contact with friends. Others will lose access to a support group, the ability to speak out on current issues, or an audience for their artwork. More young people will be shut out of discussions about what’s going on in their school and their community. U.S. law has long recognized that people under 18 have their own rights to speak and receive information. These new laws interfere with those rights.
The Florida opinion suggests that young people can browse the internet without an account, or use a parent’s account. But that doesn’t help those who might participate in a private group, send a personal message, or speak to an audience they have built up. Nor does it recognize the reality that in many households, young people may not have the ability to use a parent’s device, or even have healthy relationships with their parents. For parents of children under 14, the Florida law also overrides parental autonomy—even if parents wanted to allow their child on these services, they cannot do so by law.
These laws won’t just harm younger kids. Adults and older teens will bear the cost of the new rules. In order to figure out who is young enough to not be able to join, or who needs parental consent to join, services will have to check users’ ages. That likely means asking people to submit ID or other sensitive information. Some people will be mis-classified as too young; others will decide that they’d simply rather stop participating instead of handing over even more personal data.
Between the recent Meta settlement and these 11th Circuit decisions, despite widespread opposition, age-gating is becoming a reality for the American internet. As these laws are enforced, we need to understand what they mean for the people who have to deal with them. And we need to create a record of their effects on everyone’s speech so we can push to repeal them.
If you encounter a restriction due to these laws that affects you, keep a record, ideally while the details are still fresh in your mind. Screenshots, along with notes about the date and time, the service involved, and the task you were trying to accomplish, will all be helpful.
Did you lose an account or can’t participate? Describe what you lost. Were you using a group to organize a club, volunteer in your community, or keep in touch with friends? Did losing your account cut you off from people you wouldn’t otherwise be able to be in touch with? Even if you just used the account to access local news or follow your favorite content creator, that’s still a significant loss of your right to access information online.
Record problems with age checks and parental consent. What information did the service request from you? Were you able to provide it? Did it reject your age proof, or classify you incorrectly? If you’re a parent, were you able to give permission, and what did you have to provide? What promises did the service make about what it did with the data it collected from you? Save explanations given by the platforms or any services they employ to age gate, including any law they cite. If you are to appeal a result and choose to, keep track of those attempts as well.
You can also document choosing to drop out. If you abandon an account or service because you’re unwilling to provide ID or other personal data, write down what you gave up, and why. You don’t need to submit sensitive information to show that you are burdened by new rules.
If these restrictions affect you, we encourage you to reach out to EFF by emailing agegated@eff.org and telling us more about what happened.
EFF will continue to oppose laws that prevent adults and minors from expressing themselves online, or that push people to give up their privacy to participate in the digital world. These recent court decisions are setbacks, but they don’t settle the debate. By keeping track of people who lose access, age-check failures, and the online conversations that can no longer happen, we’ll be in a better position to challenge the worst of these restrictions, in both legislatures and courts.
And in the meantime, EFF will keep fighting for laws that actually make us safer online—like stopping social media companies’ harmful surveillance of all internet users. We’ll continue to push for laws that empower parents, children, and all internet users to have meaningful choice and control over their online services. Those goals can make everyone safer online, while preserving our ability to speak and access information.
Owners, Not Renters: Raffi Krikorian on Open Source AI [Radar]
Raffi Krikorian, Mozilla’s CTO, joined Tim O’Reilly at our recent AI Codecon to talk about open source AI. Mozilla, of course, is the nonprofit that helped to define the open source revolution back in the late 1990s. Though its Firefox web browser was superseded as the market leader by Google Chrome, it played an essential role, along with Apache and the World Wide Web Consortium, in establishing the open standards of the web and keeping it from being dominated and enclosed by Microsoft, the dominant tech platform of that time. Now, Mozilla is one of the leading voices working to build an open, standards-based AI ecosystem.
Tim has long appreciated Raffi’s thoughtful, human-centered approach to technology. Raffi writes a newsletter called Owners Not Renters, whose message can be summed up by his statement that he doesn’t want a future with seven AGIs. He wants one with seven billion. He wants each of us to have an AI that we can trust with our secrets and that will look out for our interests, not an AI that’s optimized for the business model of its creators. In the early days of the web, we called the browser a user agent for a reason, Raffi said. It was on your side. It let you render pages however you wanted, managed your privacy and your cookies, and did its best to protect you from those who wanted to take advantage of web users. We need the same thing in the age of AI.
Raffi cited a paper in which researchers tested whether AI assistants could be trained to favor a company’s commercial interests over user welfare. In simulated flight-booking requests, 18 of 23 models recommended a more expensive sponsored option over a cheaper one more than half the time. It’s a hypothetical choice that we’ve seen play out time and time again, in industry after industry.
Open source AI is a big part of what it will take to get to Raffi’s vision. But sovereign AI loyal to each individual needs more than open source models alone. Raffi’s list of what has to be built around the model starts with memory, a place where your private data can live. It includes tool calling, so an agent can make a purchase or book a doctor’s appointment for you, the runtime environment where all of that runs, and the rules for how his agent talks to those working on behalf of others. It needs a harness. “That’s where evaluations happen. Guardrails happen, execution loops happen, tool calling happens, memory,” he explained. “All of that stuff is an opportunity, in my mind, of things that open source developers can be building.”
People hear the word “harness” and conclude that we need an open source version of whatever the proprietary labs are building. Tim asked Raffi whether a user-centered harness might do different things than those offered by the big labs. He agreed. The whole point of open source is for people to “scratch their own itch.” The ability to innovate without permission is the heart of the open source promise.
As a result, Mozilla wants to build a starting point. It aims to help the community define what an open memory protocol, a storage protocol, or authenticated tool calling with the right guardrails ought to look like. As Raffi noted, “Once we could define what those open standards look like, then a whole plethora of people can start playing and be interoperable. It’s basically. . .the internet all over again. We can build trillions of dollars of market cap on top of open protocols.”
Ease of use is still lacking, though. Mozilla’s 2026 State of Open Source AI report says open models are now within about 3% of the frontier, yet they don’t make it into production at the same rate as closed models. When Tim asked why, Raffi explained that open source is easy to release but hard to deploy. Developers still have to figure out hosting, provisioning, guardrails, and memory. With OpenAI’s or Anthropic’s API, you just hand over a credit card. What’s missing, he said, is the equivalent of a double-click installer for getting open source AI running inside an organization. But the companies that do the work to adopt open source AI are seeing big savings because open models are already good enough for most use cases. As Raffi put it, “You don’t need a Ferrari to manage your calendar.”
Raffi’s own daily agentic helper is Hermes running on GLM. He expects that Apple, Microsoft, or someone else will make this kind of agent into a consumer product in a couple of years, and that his mom will end up using it. For now, he said, we’re on the wrong part of the innovation curve, where you have to know how to code to get any of this working.
Tim disagreed. The industry goes through periods that are exciting for developers, creators, inventors, and companies trying to invent the future, and then it gets boring and a few big companies dominate it. We’re in the exciting part, he argued, before everything shakes out. As Raffi riffed, this is when we get to formalize what that future should look like.
Tim wasn’t sure that we’ll need a commercially supported version of the kind of “roll your own” agentic rigs now favored by independent developers. After all, neither desktop Linux nor OpenOffice turned out to matter anything like as much as open source developers of the time expected. Instead, open source became the foundation layer for a new generation of web-based applications. It’s hidden way down in the guts of Google, Amazon, Meta, and countless other applications we rely on today.
This is already beginning to happen again with AI. The Mozilla report says that as much as a third of real-world usage is already on open models, although only 4% of model-layer revenue made its way to the open source ecosystem. Tim called the discrepancy a feature rather than a bug, and Raffi agreed that the stat is misleading. As Tim pointed out, many of the most important technologies “create more value than they capture,” and he used Steve Baer’s concept “The Clothesline Paradox,” from a 1975 article in Stewart Brand’s CoEvolution Quarterly, to explain why we’re good at measuring value capture but not so good at measuring value creation.
Baer pointed out that if you put your clothes in the dryer, the energy you use is measured and counted, but if you hang them on the clothesline to be dried by the sun, the energy saved disappears from our accounting. This argument resonated with Tim in the early days of his open source advocacy. As he noted, it’s always bothered him that nobody seemed to recognize that open source software didn’t “win” in the same way as proprietary software. It won by becoming the foundation everyone else builds on.
Raffi’s comment that we’ve made a category error by treating AI as a product fits right in with this line of thinking. If an AI company goes out of business, its product disappears. If it changes its business model, it may yank features you depend on. It’s not just individuals who need sovereign AI. Countries are passing laws about where data can be processed and how it moves in and out, and some of those requirements may not be compatible with the way the big labs plan to monetize their technology. What those countries are asking for is infrastructure. A road outlasts the contractor who built it. Raffi thinks open, downloadable models are the only way to provide long-lasting foundational infrastructure.
According to OpenRouter stats, Chinese models now supply more routed tokens than American ones. Tim asked whether we should worry about that. Raffi said the problem isn’t China but market concentration. The leading open models are from China. The leading closed models are all American. Access to either can be cut off by an executive order. We saw a version of that in June, when Anthropic temporarily suspended access to its Fable models to comply with export controls. It’s a problem that both the leading proprietary models and the leading open-weight models are each concentrated in a single country.
Diversity is one foundation of resilience. Raffi argues, for instance, that hospitals should all download a local model as a backup. None of us would run an important computer without an uninterruptible power supply, so why would a hospital doing triage with AI rely on a single intelligence provider? There are a lot of possible rug pulls. The government could restrict open source or restrict the frontier models. Having a backup plan is a good idea.
Safety is also part of the foundation. During the Q&A, an audience member asked about the recent sandbox escapes at OpenAI and Anthropic. Raffi joked that the best part was watching everyone try to one-up each other with accounts of how powerful and hard to control their models are. But he agreed that guardrails are actually a hard problem. Keeping personally identifiable information from leaking out through an LLM call means looking for much more than Social Security numbers. Eventually we’ll have models defending models, but the foundational frameworks for guardrails aren’t good enough yet. (NVIDIA’s safety platform announcement, released after Raffi and Tim’s conversation, suggests that better guardrails need to be implemented outside the model.)
Tim opened AI Codecon by noting that open and closed systems have always coexisted, and that the idea that one of them will win is a mistake. Closed systems, like Apple’s, Google’s, OpenAI’s, and Anthropic’s, can optimize for ordinary people and deliver value to billions. Open systems are better for innovation and sovereignty, and for pushing technology into new countries and new markets.
Raffi closed the conversation by observing that a well-tuned harness can improve model performance by as much as 20% on some coding tasks. You don’t have to be a machine learning engineer to make a difference at that layer.
PSPP 2.1.3 has been released. [Planet GNU]
I'm very pleased to announce the release of a new version of GNU
PSPP. PSPP is a program for statistical analysis of sampled
data. It is a free replacement for the proprietary program
SPSS.
Changes from 2.1.2 to 2.1.3:
Please send PSPP bug reports to bug-gnu-pspp@gnu.org.
Reproducible Builds (diffoscope): diffoscope 335 released [Planet Debian]
The diffoscope maintainers are pleased to announce the release
of diffoscope version 335. This version
includes the following changes:
[ Chris Lamb ]
* Support the dumppdf binary being called dumppdf.py on the host system.
* Update copyright years.
* Fix a silly "prepend" typo.
You find out more by visiting the project homepage.
The web of Markdown, part 3 [Scripting News]
Previous posts on this topic: Oct 6 and Oct 8.
What's new? I've got a browser running, and have been using it for a few weeks. We're not releasing it today because first I want people to think about the format we're using to represent a story, and get feedback, and see if other people can build on the same basis.
Three things to look at today.
And if you have questions or comments.
[$] Seeking smaller kernel stacks [LWN.net]
Memory has always been a scarce resource in computing systems, but the problem seems to have worsened recently. In particular, the worldwide shortage of memory chips has led to a renewed focus by systems developers on reducing memory usage. During the memory-management microconference at the 2026 Linux Plumbers Conference, Will Deacon discussed one specific consumer of memory that is being re-examined: kernel stacks.
Is TOTSCO fit for purpose [RevK®'s ramblings]
I have explained many of the issues with TOTSCO - the company that does "One Touch Switching" for UK broadband and telephone services.
My main gripes have been over the unbelievably poor specifications and stupidly inadequate processes for accrediting CPs to connect to the One Touch Switching system. This is partly why I made a testing system (NOTSCO) free for CPs to use, and have actively helped many CPs as a "buddy CP" for what testing there is. I am trying to make this work for everyone.
But it gets worse.
TOTSCO are actively refusing to pass on a simple message to another CP that is failing to meet the OTS specification.
In this case it is such an egregious failure one has to wonder how even the inadequate TOTSCO process got this CP on the system. No I am not naming the CP. The error is as basic as they come - a residentialSwichMatchRequest getting a residentialSwitchMatchConfirmation but without an actual switchOrderReference (or implicationsSent). This is the most basic function of OTS and is broken beyond belief. The CP should be REMOVED from the platform until they can show they can actually comply with the spec, and more importantly TOTSCO should have always been testing CPs do, in fact, comply with the spec. Failing to do so is unbelievably irresponsible.
They cite "security", but they is ZERO security issue with passing on such a message. And no GDPR issue either. Their refusal is baffling.
What is crazy is they do operate a "CP to CP" communications system, but signing up for this is not mandatory. When CPs do sign up TOTSCO WILL pass on messages. This highlights that passing on messages is not a security issue. So why not pass one based on a simple email when a CP is not signed up to "CP to CP" communications. There is no justification for this.
If TOTSCO are absolving themselves of ANY RESPONSIBILITY for policing ANY compliance with the One Touch Switch specification, whose job is it? It is not my job as a CP.
So who do we turn to - perhaps OFCOM. Maybe OFCOM will decide TOTSCO are ignoring the most basic responsibility for addressing CPs not complying with the OTS specification.
Should OFCOM police this somehow?
Note this is not the first instance of TOSTCO being so stupid - we have another CP failing to meet the OTS specification that is likely a GDPR breach. They REFUSE to tell the other CP. I have now contacted the ICO (no reply yet). But why REFUSE to pass on such a basic message (not personal data in the message and no security issue).
This needs fixing - OFCOM you need to fix this.
Security updates for Friday [LWN.net]
Security updates have been issued by AlmaLinux (buildah, expat, grafana, grafana-pcp, httpd, iperf3, openssh, php, php8.4, php:7.4, php:8.2, and php:8.3), Debian (aide, chromium, clamav, erlang, linux-6.12, roundcube, unbound, and webkit2gtk), Fedora (bind9-next, ca-certificates, clevis-pin-trustee, golang-x-mobile, knot-resolver, maradns, ntpsec, php, socat, and vlc), Mageia (golang, jq, msgpack, open-isns, perl-Mozilla-CA, roundcubemail, and sudo), Oracle (.NET 10.0, .NET 8.0, .NET 9.0, cockpit-files, cockpit-machines, fetchmail, glycin-loaders, golang, jackson-core, librsvg2, mariadb11.8, openexr, openssh, php, php8.4, php:7.4, php:8.2, php:8.3, postgresql:16, qt5-qtbase, rust-sequoia-sq, and xorg-x11-server-Xwayland), Red Hat (ca-certificates and opentelemetry-collector), SUSE (aliyun-cli, amazon-ecs-init, bcel, coreutils, cups-filters, cyrus-sasl, distribution, expat, firefox, go1.26, go1.26-openssl, go1.27, guava, mutt, nvidia-open-driver-G07-signed, p11-kit, php74, php8, podman, python-soupsieve, python313-datamodel-code-generator, python313-Django5, thunderbird, and webkit2gtk3), and Ubuntu (openvpn, python-tornado, and zlib).
The Agentic Software Factory Hierarchy of Needs [Radar]
The following article originally appeared on the Vanishing Gradients Substack and is being republished here with the authors’ permission.
Stripe’s Minions turn engineering requests into candidate pull requests. Ramp’s Inspect puts coding agents to work in the background, with tools to check their changes. Warp Factories takes work from tickets and chat through agents, checks, and human review. Agentic software factories are here.
Are you sick and tired of babysitting Codex, Claude Code, or OpenClaw?
Do you have agents that can build features, but still leave you responsible for remembering where they stopped, explaining how each feature fits the project and deciding what happens next? You make progress in each conversation, then development waits for you to return.
It doesn’t have to be this way. A software factory lets you delegate more of that process!
You agree on an outcome, give the system the context and authority it needs, and let it work while you do something else. When you return, there should be a result you can inspect, with evidence of what was checked, or a specific reason the work could not continue. Your next conversation can then focus on the result and the decisions that remain.
As we’ll show you, your first software factory doesn’t need to be that complex at all: It can begin with a single agent and an automation.

The defining combination is autonomous and asynchronous execution.
A scheduled job can run without you. A coding agent can choose and revise an approach during an interactive session. A factory combines those capabilities, with enough context, tools and feedback to carry out the delegated work.
Software factories have been hypothesized for decades. Now that we have agents, we’re actually able to operate them. The principles apply to software work traditionally carried out by teams of humans, from bespoke tools for teams and individuals to large and complex software systems.
To illustrate these principles, we’ll use an invoice tracker throughout this article, an application we’ve needed for our own businesses. The same approach applies to research tools, publishing systems, and software for teams. Suppose you run a small business and want an invoice tracker that fits how you work.
Build an app that creates invoices from my template and tracks which are unpaid, paid, or overdue. Keep it local for now. Preserve the records when it restarts, and show me checks that the totals and payment statuses are correct.
You can agree on this brief with the agent, leave it to work while you do something else, and return to the app and evidence of what was checked. If a check fails, it can investigate and adjust within its agreed scope. If it encounters a product decision it cannot make, it should bring that question back to you.
You might imagine a clean separation: The factory builds the invoice tracker, then the finished app does its job. That’s one way to run it. But agents can also help operate the software they build, and that combination is useful.
The tracker can store invoices and calculate outstanding balances. An agent can use those records alongside customer correspondence to prepare follow-ups: One customer has promised to pay on Friday; another is disputing a charge. You don’t need to turn every situation into a new software feature before the agent can help. You give it the relevant context, authority, and a way to check its work.
This changes what you need to build! Some behavior belongs in code, such as calculating balances consistently. Other work can be delegated to an agent that responds to the circumstances. If a recurring need emerges, you can ask the factory to build it into the software. The factory builds tools that agents can use, and experience using those tools helps you decide what to build next.
You still decide what is worth building, who it should serve and which trade-offs matter. Agents can help you make those decisions too. The practical change is that implementation can proceed between your conversations, including running checks and responding to failures.
This makes factories relevant to people with product, business or creative expertise as well as engineers. You might know exactly how you invoice clients, record payments, and chase overdue bills while having little interest in writing software. That knowledge lets you direct the factory toward software that fits your business, including the exceptions and connections that general-purpose tools handle poorly.
At every layer: specify what you want and how
success will be checked, then verify the result.Monica Rogati’s original AI hierarchy of needs described the foundations beneath successful AI work. We find that dependency framing helpful for factories too, with four different layers.
Automation needs a harness able to do the work, plus direction about what to do. Continual learning needs runs to inspect and a way to put improvements into use. These capabilities can develop together: A familiar harness, a short brief, and a basic automation are enough to start. You can personalize further as work reveals what is missing.
Two practices run through every layer: specification and verification.
Agents can help you refine the specification and perform the checks. Your role is to decide whether the requirements capture what you need and whether the evidence supports accepting the result. As the factory takes on more work, these practices give you a way to direct it and assess what comes back.
Let’s now see what’s up in each layer.
First, you’ll need an agent harness. If you’re using Codex, Claude Code, Hermes, or OpenClaw, you already have one. It gives the model tools to read and edit files, run your software, and see what happened.
For our invoice tracker, the agent can build the app, create an invoice, record a payment, and restart it to check that the invoice and payment records survived. If a paid invoice still shows as overdue, it can investigate, fix the problem, and try again. You shouldn’t have to narrate every step. But if it needs a decision about how your business handles partial payments, that’s a question for you. If it lacks access or authority, the agent should stop and name the blocker.
You’ll also need somewhere for the harness to run. A cloud machine lets the agent keep working while your laptop is closed or disconnected. You can also run it on your own computer, but the machine needs to stay awake and connected for the work to continue.
Next, give the agent the context it needs to work your way. For our invoice tracker, that means your template, payment terms, and conventions for recording payments. You don’t want to explain all of that again every time you start a new task.
Keep it somewhere future workers can find it:
An instruction file such as AGENTS.md can point to this material. OpenAI’s harness-engineering account describes using a short guide that points into maintained project documentation. Give a new or scheduled worker a small task and check that it actually follows the guidance.
Be specific about when instructions
apply. Eleanor once told an agent to write tests, and it wrote
tests for a README. Enthusiasm wasn’t the problem 
You’ll also need to set permissions and sandboxing to control what the agent can access and execute. Written instructions alone don’t enforce those boundaries.
One agent works in the background; you assess what
comes back.Now let’s give the factory a way to get started without waiting for you. A schedule or event can launch an agent with its brief, project guidance, and tools. You come back to a result, evidence of what was checked, or a specific blocker that needs your attention.
For our invoice tracker, a morning automation could check a saved task list and pick up the next agreed task, such as adding partial payments. You’ve decided what you want and how success will be checked. The agent gets on with it while you do something else.
There are a few practical details to get right. Don’t start the same task twice, leave an empty queue alone, and set limits on time and spending. Save progress so a later session can continue without you having to reconstruct the whole conversation.
One worker may be plenty. But perhaps you have independent tasks that could run in parallel, or you’d like another agent to review a change. That’s where coordination comes in.
Coordinate ready work, then check the combined
result.With several agents, everyone needs somewhere to see what’s ready, what’s underway, and what’s waiting on something else. A shared task list or issue tracker can hold that information. You agree which tasks are ready; a coordinating agent or automation assigns them, supplies the relevant context, and records what happens.
Suppose one task adds partial payments, another overdue follow-up emails, and a third PDF exports. Follow-ups need the correct outstanding balance, so they wait for the payment behavior to be checked. PDF exports might proceed independently if the changes don’t overlap.
You can also split the roles. One agent builds the feature while another prepares payment scenarios to test it. A third might review the completed change.
Assign responsibility for combining the changes and verifying the whole application. Different questions call for different checks. Deterministic tests can establish whether balances are calculated correctly and payments survive a restart. Agent verification can help identify missed requirements or inconsistencies across the changes. Human judgment can assess whether the workflow fits how you actually work. You’ll often want a combination, with more than one kind of check on the same result. Anthropic’s evaluation guide describes these complementary approaches: code-based checks, model-based checks, and human evaluation.
Combine deterministic checks, agent verification,
and human judgment according to what you need to
establish.Once you’ve checked that the combined features work together, you might task your factory with building a phone-friendly interface so you can check invoices and record payments on the move.
The factory can also help run the invoicing workflow as well as improve its software. A scheduled agent could review overdue invoices, consult customer correspondence, and prepare follow-ups for your approval. If that work repeatedly requires information the tracker doesn’t record, you can give the factory a task to add it. Building and operating feed into one another: Agents use the software, and what happens in use informs its next improvement. This brings us to continual learning.
Use run evidence to test and adopt improvements to
future work.Your factory can also get better at how it works. Suppose payments disappear after restarting the invoice tracker, even though the agent reported that its checks passed. You’ll want it to fix the bug, of course. But why did its checks miss the problem?
Keep a record of assignments, checks and difficulties so a review agent can identify recurring problems and propose improvements. Did the worker lack a way to restart the app, or did it simply skip that check?
If it skipped the check, the agent could propose a skill that saves a payment, restarts the app, and verifies the remaining balance whenever a change affects stored records. Test it against the original failure, then on further tasks. Does it catch problems with stored customer details too? Does it avoid unnecessary checks when a task only changes a heading?
The results help you decide whether to adopt, revise, or reject the method. Apply changes within the authority you’ve agreed and keep them reversible. Warp’s self-improving factories illustrate this approach: Failed checks can lead to proposed changes to prompts, skills, or configuration, submitted for human review with evidence from the runs behind them.
Reassess methods as the project and model change. Anthropic’s work on long-running application development describes removing procedures as model capabilities improved and checking the effect.
A saved lesson needs to reach later workers and improve their results. This learning happens through changes to the instructions, tools, and methods around the model, without requiring the model itself to be retrained.
Your factory could build a research tool that collects sources and lets you assemble briefings, a family intranet for shared plans and documents, or a private community space. Start with something useful to you, then give the factory further work as you discover what’s missing. Agents can also help operate what you build, from preparing a research briefing to organizing incoming material.
Hugo uses this combination to run Vanishing Gradients, his media and education business. After a guest prep call, an automation retrieves the transcript and prepares interview topics, questions, titles, and thumbnail options for review. After a live stream, agents can propose clips, cut video, add captions, and prepare upload drafts. Saved editorial guidance and skills shape the work; Hugo chooses what to publish.
He also maintains the system, improving checks when agents miss instructions, and updating skills based on results. More autonomous continual learning remains something he’s exploring. He describes the setup in How I Built a Media Empire With an Agentic Software Factory.
What’s one simple task you do repeatedly for your community, audience, or business that you could start automating?
Look at what keeps bringing you back to the work. If the agent cannot run the app or inspect a failure, improve the harness. If you keep repeating project context and decisions, personalize it. If development waits for you to start each task or manage every handover, add automation. If the same failures recur across runs, build a learning loop that changes how later work is done.
Start with work you care about and inspect what comes back. One agent can use all four layers. Add capabilities where they help you delegate more useful work while keeping specification and verification part of the process throughout.
We would love to help you put these ideas to work in Build Your Agentic Software Factory. You’ll set up a factory that can work while you’re away, build software around something you care about, and learn to verify and improve what it produces. We’ll work with you through live workshops and office hours, alongside a community of fellow builders. Bring your own idea or choose a starter project. No coding experience is required.
Compromised TLS Certificates [Schneier on Security]
The Indian CA eMudhra Limited has eight TLS certificates with laughably weak private keys:
The compromised eMudhra keys were defective at a level that’s challenging the imagination of many of the engineers studying the incident. A normal size for a NIST P-384 elliptic curve cryptography private key contains roughly 384 bits of entropy, a size allowing almost 2384, or a number with 116 digits, different possibilities. The private key sizes of the compromised keys ranged from 3 to 8 bits. Astonishingly, the private keys were 4, 56, 66, 115, 155, 156, 230, 237.
“That is extremely in the ‘this should not be possible’ category,” Valdorda said. “Maybe some horribly dangerous key generation interface has a ‘size’ parameter and they set it to 1 by mistake???”
Ben Cartwright-Cox, director of BGP.tools, said: “My guess is that it’s example code that accidentally leaked to production, but hard to know. But it’s bonkers that no one noticed.”
At this early stage, the most immediate threat appears to be for those using VPNs, especially in countries with governments likely to maliciously intercept traffic. There are likely many other cases for concern. End users largely have no recourse other than to hold off using many non-browser forms of TLS communication until they receive assurances updates are in place.
The whole certificate regime has long been a mess:
The incident is the latest to expose a fatal flaw in the TLS regimen. It’s only as strong as its weakest link, which in this case was eMudhra. Fortunately, transparency logs account for much of that failure, but this measure requires parties to actively monitor massive feeds and works only after unauthorized certificates have been issued. eMudhra representatives weren’t immediately available to answer questions.
One caveat: exploiting compromised certificates requires an active adversary-in-the-middle attack, meaning the attacker must act as a proxy between two TLS parties and receive encrypted traffic, decrypt it, reencrypt it, and send it to the other party. Such capabilities, in some cases, are usually limited to only the most well-resourced attackers. People with control of a local networkat a coffee shop, university, or other organizationface much less of a challenge.
Cleanup of this is going to be another mess—and it’s right on top of the PHP vulnerabilities.
My Super Mid-Life Crisis – Issue 1 – 04 [Comics Archive - Spinnyverse]
The post My Super Mid-Life Crisis – Issue 1 – 04 appeared first on Spinnyverse.
Error'd: It's About Time [The Daily WTF]
Usually I have to save up a few weeks' worth of error'ds to get five of a kind, but this week we got a rash of funky date entries! I guess we were due.
First up Tim R. reminding us here that "Dates are difficult! ...but when the entire purpose of your web site is to convert the time to different time zones, I'm not inclined to give you much slack for being one hour out."
And an anonymous reader who just doesn't trust big tech. "In my calendar I have a monthly reminder to clear my data MS data manually. Now you know why, although I don't expect this will come as a surprise to anyone." Note the date on the lower right of the screenshot.
"June has 30 days, so 31 was not accepted," repeats Daniel D. incredulously. "I needed to calculate day difference between two dates. So I entered June 30 (as shown) only to get this error message. Now - should I trust that calculator to calculate date differences, what you say?"
Daniel D. went on to share with us a couple of images from "A well-known e-commerce website in Central Europe that allows you to filter by battery life! Only it randomly switches to seconds." Yes, randomly. See the second image too.
And finally this week, Marc Würth identified a novel Network Solutions Domain History Date Format(TM) "In other places, they displayed dates formatted as "01/13/2025", for example. I guess, instead of using actual ISO 8601, they just flipped the order and replaced the slashes with dashes."
Plot bunnies needed [Judith Proctor's Journal]
Later this year (or possibly early next year) a friend and I will start GMing a game of Star Kingdoms.
It's a game designed by a couple of friends and a game generally takes about 2 years with a two week turnaround.
It's a space exploration, combat, role playing game. 6-8 players design their own race/cultures, set out to explore space, meet other cultures, interact with them, colonise new worlds, investigate strange anomalies, etc.
Some parts of the game (economy, combat, movement) are highly
automated, but the role-play aspects are hand-moderated.
There are several NPCs
Recent games have tended to have some large/difficult issue that needs several players to work on it at the same time. eg. A large, nasty enemy that is very hostile and needs a large space fleet to defeat. A twin star system where the two stars are about to collide and cause a supernova (they actually found a solution that worked within the laws of real physics and pulled it off with just one turn to spare.).
Some have worked better than others. The problem is to find a problem that is just big enough to be solved, but not too massive to be impossible.
The catch is that we're running out of cool ideas that haven't already been used in previous games.
Any suggestions?
Any physical threat must not tamper too much with the laws of physics (jump gates exist, and their mechanism can be anything we like, as long as it's consistent for the duration of a particular game. Game before last, the jump system was build and maintained by a giant spider who could move a little between dimensions. She was willing to tamper with the system for players who offered apropriate bribery - turned out that what she really wanted was babysitting for large numbers of baby spiders....)
There are game mechanics for manipulating social principles. Societies with radically different beliefs may attempt to convert others both by persuasion and by the sword.
Players tend not to want to fight each other - so it's also useful to have short term threats too. Wandering space monsters, pirates, etc. Ideas also needed here to avoid repetition...
Please feel free to chuck in anything you like, no matter how wild. We've mad players worshipping trans-dimensional demons, pacifists, Babylon 5 style endings, strange minerals with all kinds of effects, mind controlling aliens, diseases, etc.
Take inspiration from anywhere you like - I'm currently considering a bit of Pluribus, features from the Ancilliary Justice series, evil Huttites, Hitchhikers Guide to the Galaxy, etc. But I still need an endgame, and some early nuisances.
I'd also like something that makes the NPC aliens interact - that worked well last game with two largish NPCs at war with each other (and both hoping to encourage players to their side).
The relentless math of bandwagoning [Seth's Blog]
It often seems that everyone is talking about what everyone is talking about.
No one cares about a song or a movie or a political issue–and then they do. Then it’s everywhere.
But of course, that’s precisely why. Most people feel safe when they’re engaging within the expected social norms. It’s easier to fit in and to avoid an error. Or, if that’s your thing, it’s easier to stand out in contrast to everyone else who is trying to fit in. Either way, we’re always on the lookout for a bandwagon to hop on.
The media, in their relentless search for newsstand sales, clicks and likes, seek precisely the same thing. PT Barnum figured out that putting a marching band on a wagon at the front of the parade drew a crowd, and then Dan Rice, an actual clown, realized that politicians would be eager to ride on a wagon that had a crowd, which drew others to the crowd and the cycle continued.
The math is simple: you can’t bandwagon by yourself. The nature of bandwagoning means that it will always be overrepresented in any sampling of the media.
Just because someone organized a parade doesn’t mean you have to be in it.
New Comic: Devil Dogs
Ecological Vengeance [George Monbiot]
Let’s eradicate our life support systems – that’ll teach the liberals!
By George Monbiot, published in the Guardian 22nd October 2026
However grim the trajectory might seem, I’ve always believed that sense will ultimately prevail. As the great perils of dismantling the living world become increasingly obvious, even the most rapacious exploiters must come round. Nobody wants to live on a dead planet, do they?
There are – or were – signs that this wasn’t just wishful thinking. Since 2015, mostly thanks to China, the area of the planet being reforested has increased, while, thanks in large part to Brazil, the global rate of forest destruction has declined. The area of the Brazilian Amazon forest cleared each year is one-sixth of what it was when records began in 1988. In the past four years, as a result of Brazilian government policy, the deforestation rate has fallen by 71%. If Luiz Inácio Lula da Silva is re-elected president on Sunday, the country could reach zero deforestation by 2030. The arc of the moral universe seems to have bent towards justice.
But what my faith in human nature failed to account for was a perverse delight in destruction among a small cohort of the economic elite. There are people who appear to hate life and love death. Donald Trump’s removal of protections on public lands, the small bite – doubtless the first of many – he wants to take out of Yosemite, his assaults on the US National Park Service and the US Forest Service, his trashing of the Endangered Species Act: all are partly a response to lobbying by ranchers, loggers, frackers and miners. But this, I think, is not the primary driver.
More important to him, I’ve come to believe, is a vengeful desire to hurt. I doubt Trump hates the monarch butterfly. I’d be surprised if he knows what it is. But he does appear to hate people who love the monarch butterfly. Destroying the habitats on which this and many other endangered species in the US depend seems to be part of the “retribution” he promised. The New York Times was unable to find evidence that Trump has ever visited a national park. He probably doesn’t hate them either. But anything valued by the enemy – greens, liberals, socialists, feminists, anti-racists, “bureaucrats” and “blockers” – should be attacked on principle.
Wiping ecosystems off the map is an obvious demonstration of power. Extinction leaves a permanent mark, which is every dictator’s dream. It’s also a highly effective means of hurting those who resist him: the Indigenous people and other people of colour so often on the receiving end of environmental destruction; the regulators; the scientists and the rest of the intelligentsia; above all, people who care.
Caring could be seen as the far right’s meta-target. The “suicidal empathy” theme now crops up repeatedly in videos, newspaper columns and speeches: a professed belief that those who care about other people or species should be destroyed by those who don’t. This belief, by definition, is psychopathic. What exhausts my optimism is that, conned by shallow promises such as the use of brutal methods to address crime, people keep electing those who subscribe to it.
Physically and politically, Flávio Bolsonaro is the spitting image of his father, the jailed coup-plotter, Jair. When Jair Bolsonaro was president of Brazil, he appeared to see ecological destruction as a kind of a holy duty. The deforestation rate rose by 59% in his four years, and attacks on Indigenous people and other forest defenders, as well as invasions by illegal ranchers, loggers and goldminers rocketed. The crudest forms of extractivism – regardless of their costs, or how they might hold back all kinds of progress – were a matter of policy.
The ideology of the far right in Brazil has been described as “beef, Bible and bullets”: violence against those who resist the seizure of their resources, an ultra-conservative evangelism and the expansion of cattle ranching, which is both a potent symbol of far-right machismo and the primary driver of deforestation in the Amazon.
Jair Bolsonaro looked back with nostalgia to the military dictatorship of 1964 to 1985 – which was actively supported by the US government – during which local oligarchs could do as they pleased, and those who opposed them were tortured and disappeared. The warnings couldn’t be clearer, but Brazil seems determined to revisit its nightmares. Flávio Bolsonaro won the first round on 4 October, and is likely to become president.
If he wins the second round this week, the gleeful rampage of his supporters, catalysed by government policy, threatens not only the Amazon but the Atlantic forest in the south, the Pantanal wetlands, the Pampa grasslands and the savannah habitats of the Cerrado. This is politics as an orgy of destruction. Let’s eradicate our life support systems – that’ll teach the liberals!
Trump has been using all possible means to help Bolsonaro win. He sees Latin America as the conquistadores did – one big heap of treasure, ready for looting. The region’s far-right demagogues are only too happy to help. Mass deforestation and the sudden ecosystem collapse that is likely to result offers a finality to their politics: there’s no coming back from this. You Indigenous people, you greens, you carers: you’ll have nowhere left to hide. The world will be ours, even if it is a world of ashes.
What might Bolsonarismo teach us? First, it appears there is no limit to the perversity of the ruling class, which would rather there was nothing left to share than cede any fraction of the planet to the poor.
Second, that it possesses all the tools – social and traditional media, the pulpit and the gun – required to make its perversity look like common sense, or at least irresistible, as force is deployed. Third, that the only defence we have against suicidal gullibility is what the Brazilians call conscientizaçao: raising awareness about the relations between exploiters and exploited, and the violence that underpins them. Otherwise all that is good, trusting and hopeful in humanity can be harnessed for a war against everyone and everything.
As for the idea that nobody wants to live on a dead planet, Elon Musk, with his preposterous plans for living on Mars – “Fuck Earth! Who cares about Earth?” – has killed that too. Extending the frontier of destruction, even to the point of human extinction, is a matter of pride. The four horsemen ride again, not in cloaks but in stetsons and denim shirts, driving their cattle before them.
www.monbiot.com
Girl Genius for Friday, October 23, 2026 [Girl Genius]
The Girl Genius comic for Friday, October 23, 2026 has been posted.
Streamlined [Ctrl+Alt+Del Comic]
Not to be outdone by Sony shooting themselves in the foot, Xbox has announced 3200 layoffs as well as the departure or closure of a handful of studios because what they’ve been doing is… not working. If you ask me, things started going south the moment they shelled out such astronomical amounts to acquire Activision […]
The post Streamlined appeared first on Ctrl+Alt+Del Comic.
[Filler] 23rd Anniversary! [Twokinds]
Comic for October 22, 2026
View From a Hotel Window, 10/22/26: Aurora, CO [Whatever]

Parking lots and hospitals! This hotel picture has it all!
I’m in Aurora for MileHiCon, where I am a guest of honor along with TK Kingfisher and others. There will be panels! And signings! And hanging out! As one does. It starts tomorrow. Come on down!
— JS
Ooops, didn't get it done today. Please come back tomorrow. :-)
“I can’t believe PowerShell is actually good” [OSnews]
Earlier this year, I needed to learn PowerShell scripting for one Windows-related project, and I have tried it out a few more times on Mac. It has quickly become one of my favorite tools for automation and scripting—taking on jobs that I would have otherwise tried to do with Node.js, Shortcuts, macOS Automator, or heaven forbid, Bash scripts.
I get it now. PowerShell is great, even if you don’t use it as your shell, and even if you’re on Mac or Linux.
↫ Corbin Davenport
I don’t use the shell often enough on any of my main machines to have much of an idea about the strenghths and weaknesses of PowerShell compared to more traditional shells, but this is definitely not the first time I’ve heard a lot of praise for it from people otherwise knee-deep in the UNIX and traditional shell world.
There really must be something to this, and since PowerShell is also available on Linux and macOS, it’s pretty straightforward to give it a go without having to deal with Windows.
Urgent: Pass the ROBINHOOD act. [Richard Stallman's Political Notes]
US citizens: call on Congress to Pass the ROBINHOOD Act, which would deny use of a tax avoidance scheme by people who are VERY rich.
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: Defeat environmental protection rollbacks [Richard Stallman's Political Notes]
US citizens: call on your senators to defeat environmental protection rollbacks in the Senate permitting bill.
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: Support for workers in unionizing [Richard Stallman's Political Notes]
US citizens: call on your state governor to give workers support in unionizing.
See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.
Urgent: Investigate prosecution of Broadview Six [Richard Stallman's Political Notes]
US citizens: call on Congress to investigate the DOJ's prosecution of the Broadview Six.
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: Reimbursement of Treasury for corrupter's campaign [Richard Stallman's Political Notes]
US citizens: call on the corrupter to reimburse the Treasury for his $19 million ad campaign.
Note, the reimbursement should be to the Treasury, from which the corrupter took the money, not to the individual taxpayers who paid it to the Treasury.
Urgent: Raid on Ilhan Omar's home [Richard Stallman's Political Notes]
US citizens: Stand with Ilhan Omar: condemn the raid on her home.
Urgent: Stop privatizing of Social Security [Richard Stallman's Political Notes]
US citizens: call on Congress to stop the corrupter from privatizing Social Security.
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.
Deportation thugs attack protesters [Richard Stallman's Political Notes]
Deportation thugs in Frederick, Maryland, attacked protesters and city officials by hitting them with sticks, and by driving cars at them.
Pressure for Australia to stop trade with Israel's colonies [Richard Stallman's Political Notes]
Australia's government is under pressure to stop trade with Israel's colonies in Palestinian territory, and stop selling weapons to Israel, including parts for F-35 fighters destined for Israel.
Australia can and should do the first two. But it can't do the part about the F-35.
Joining with other countries to manufacture an airplane involves a commitment to the joint project. When the deal was made that Australia should build certain parts, that implied a commitment that Australia would do its part of the job as needed. It cannot unilaterally impose a boycott of any country on the whole project.
So if Australia wants to build those parts for some countries only, that might imply renegotiating the whole deal.
If another country builds those parts too, perhaps that renegotiation would be easy: the parts meant for Israel's F-35s could be made elsewhere. Or perhaps the deal could be to wind down Australia's production of those parts and move them to another country, over a couple of years, after which Australia would not produce any F-35 parts for Israel.
To disregard this issue of joint manufacture could lead other countries to refuse to make such deals with Australia in the future.
Australia has other available ways to put increased pressure on Israel to respect the human rights of Palestinians, and on countries generally to respect human rights and international humanitarian law. It doesn't have to use F-35s as the means.
Request to extradite rich American donor from Spain [Richard Stallman's Political Notes]
The persecutor has asked Spain to criminalize leftist political activity with an official request to extradite a rich American donor to various lawful causes including humanitarian aid to people in Gaza.
Three errors that could help magats win [Richard Stallman's Political Notes]
Three errors that could help magats win in November's election: complacency about victory, despair, and cynicism.
Donald Trump Jr's lavish wedding [Richard Stallman's Political Notes]
*Russian oligarch close to Putin reportedly paid for part of Donald Trump Jr’s lavish wedding.*
Carbon pollution standards for coal and gas-fired power plants [Richard Stallman's Political Notes]
* The EPA is poised to formally repeal carbon pollution standards for coal- and gas-fired power plants.*
Homeless man in Queensland [Richard Stallman's Political Notes]
Thugs in Queensland (a state of Australia) ordered a terminally ill homeless man to move his van, which contained all his possessions, or they would confiscate everything. He had lost his driver's license so he could not move it. He decided he would rather die defiantly than meekly comply and be crushed, so he stabbed himself.
The thugs shot him with tasers.
Richard Dawkins mistake about chatbots [Richard Stallman's Political Notes]
Richard Dawkins made the mistake of supposing that chatbots are conscious (and intelligent) because they sound that way.
Referring to chatbots as "AI" has the tendency to lead people to suppose they are as intelligent as they superficially seem, and that suggests they are also conscient. To avoid encouraging that supposition, please join me in refusing to call them "AI". Use your share of influence on the society around you!
Powerful US utilities fund "grassroots" groups [Richard Stallman's Political Notes]
*Powerful US utilities secretly fund "grassroots" groups to sway cities away from switch to public power.*
It documents the example of a supposed "grassroots" opposition campaign in Ann Arbor, Michigan.
Investigating these campaigns and the organizations behind them may help identify the local politicians and "leaders" who hire themselves out as plutocratist tools.
Flesh-eating Vibrio bacteria [Richard Stallman's Political Notes]
Flesh-eating Vibrio bacteria are spreading around the world due to global heating. They can infect a person who eats raw shellfish, but also get into the body through an open cut or puncture in the skin.
An infection can kill the person, or cause loss of a limb.
Canadians Are Running Out Of Time To Oppose The Dangerous C-22 Surveillance Bill [Deeplinks]
Canada’s Parliament is debating a massive expansion of surveillance powers that will threaten the privacy and security of millions of people. Bill C-22, also called the Lawful Access Act, has already passed the House of Commons, and is now before the Canadian Senate.
Canadians still have an opportunity to speak out and stop this dangerous legislation. The Canadian Civil Liberties Association (CCLA) is urging all Canadians to sign its petition opposing the bill. (The petition on CCLA’s website is governed by CCLA’s privacy policy.)
Tell the canadian senate to stop C-22
As we wrote earlier this year, Bill C-22 gives the government new powers to force digital services—including telecom companies, messaging apps, and more—to help with government surveillance. Worse, it allows Canada’s Minister of Public Safety to order companies to create a backdoor to their services for law enforcement, as long as it doesn’t lead to a “systemic vulnerability.” That’s a clear recipe for weakening the encryption we all rely on.
It also requires services to retain metadata for up to a year, which reveals who people communicate with, where they go, and what services they use, even when they are not suspected of any crime.
Researchers at CCLA and Citizen Lab published a detailed analysis of C-22 and its serious constitutional and cybersecurity problems. The analysis points out that the bill needs more than cosmetic changes—it calls for entirely withdrawing Part 2 of Bill C-22, the section that establishes the surveillance and data retention regime.
Bill C-22 could also expand the sharing of Canadians’ personal data with foreign law enforcement, including the United States. Canada has been negotiating a cross-border data-sharing agreement with the U.S. that would allow American police to get information about Canadian internet users with limited safeguards and oversight.
Some Canadian senators have already expressed concerns about the bill, and rightly suggested, as CCLA and Citizen Lab have, that it may not be compatible with privacy protections in the Canadian constitution.
If you’re in Canada, read and sign CCLA’s petition opposing Bill C-22 today. Don’t let the Senate allow this dangerous expansion of government surveillance to become Canada’s new reality.
Canadians: defend your privacy and security
Garmin revamps and opens up Connect developer API program [OSnews]
Earlier this year, Garmin closed its Connect API developer program because it was being flooded with “AI”-generated applications to the point it couldn’t handle them anymore. What made it worse was that half of the applications were never actually used, not even once. It also didn’t help that Garmin treated every single application to the program the same way, whether it was from a hobbyist just wanting access to their own data, to a massive corporation developing a popular service used by god knows how many people.
Today, the company has relaunched the program, and it’s been considerably overhauled. While hobbyist use of the API is going to be free – which is way better than it was before – once you hit a thousand users, you’re going to have to start paying.
Still, Garmin’s shift here towards charging for API access will set a dangerous precedent for the industry. Especially for a company that bills itself as a (or the?) premium sports hardware provider. On the flip side, there’s simply no ignoring the flood of mostly AI apps that take up resources at Garmin and elsewhere to support. Heck, my inbox is flooded with these apps daily requesting reviews. It sounds like when Garmin shut off access to the API last spring, they were seeing inbound API requests at a daily scale that they’d previously only seen over a period of weeks. Simply put, there’s no good answer.
↫ Ray Maker at DC Rainmaker
The excesses of the easy availability of “AI” code generation impacts the entire industry. At least one good thing has come out of this: hobbyists can now access the Connect API developer program much easier than before.
Examining the macOS gcc binary [OSnews]
If you’ve ever written C (or c++) on a mac, you’ll know that the so-called
↫ juliethefoxcoongccis just clang in disguise. Most people (fairly) assume that this is just an alias, but this is not true! It’s a binary! Now, what is this binary? I naively assumed that it would just be shelling out toclangbut it turns out the answer is more interesting than that.
It’s all smoke and mirrors.
Unlike traditional OSs that separate user applications from the kernel, a unikernel bundles everything into a single, isolated image that runs directly on a hypervisor (like KVM, BHyve, or OpenVMM). Because it removes unnecessary drivers and background services, a unikernel is extremely small, fast to boot, and efficient with resources.
Here, we will learn how to develop and deploy unikernels built using the OCaml language and the Solo5 unikernel. These are the two fundamental components that will then enable us to develop our own applications in the form of unikernels, which we can subsequently deploy using Albatross.
↫ Unikernels in OCaml
Some light reading for the weekend.
I just built a page containing many of my books. Click on any one of them and it’ll take you to a directory of where you can get a copy. And the page then re-indexes based on which ones get the most clicks.
Thanks for reading.
Bride of Spooktactular (OoO) from L99 Games [Penny Arcade]
Running ads is essentially broken, which is why so many sites have essentially become unusable especially on mobile. If I even tried to make the site look like that the designers wouild twist my head off like a bottlecap. So, we've been working with friends by and large to get ads up that we feel good about. Bride of Spooktacular fits snugly in that place.
I just really like Brad's designs; his obsession is with asymmetrical strategy games. I could list them for a very long time, but he's the king of fighting games you play with cards, whether you think the best version of that is BatlleCON or EXCEED because he designed both. Spooktacular and its Bride posit that terrors beyond mortal ken have burst through the screens in the theatre, and those are the entities you play as - devouring horrified moviegoers by the gobfull. Every one of the original's twenty monsters or the Bride's ten additional ones is essentially playing a different game while going after the same points, with ramifications for your opponents and even in some cases the way the game plays. Evil cars, a Queen and her Hive, zombified versions of our founding fathers... this is just where it starts. This Gamefound camnpaign also offers the Double Feature as an optional add-on, which are twenty new remixes of the original game's monsters that play completely differently or even invert their mechanics. Anyway, putting up his ads was the easiest decision I made all year. Only about a week left on the campaign... if you dare, etc.
(CW)TB
[$] The end of __get_user() and __put_user() [LWN.net]
Linus Torvalds rarely writes significant amounts of kernel code these days, so the merging of a 48-part patch series from him is an unusual event. This series, destined for the 7.4 kernel release, performs some long-delayed kernel cleanup by removing a couple of the primitives used to access user-space memory from the kernel. What was once a best practice has long been superseded, but it can take time for such changes to work their way through a body of code this large.
I hope to see the The Web of Markdown idea take the next step later today or early tomorrow at the latest. Still diggin!
KeePassXC 2.8.0 released [LWN.net]
Version 2.8.0 of the KeePassXC password-management application has been released.
The new release brings a lot of long-awaited new features, many bugfixes, and several security updates. Among the major features are the migration from Qt5 to Qt6, Auto-Type on Wayland (Linux), configurable keyboard shortcuts, remote database synchronization with external tools, quick unlock with password on macOS, and quick unlock via Polkit on Linux. Version 2.8.0 is also the first version for which we ship native ARM64 builds for Windows and an experimental AArch64 (i.e., ARM64) AppImage for Linux.
See the changelog for a full list of new features, major changes, and bug fixes.
[$] Rust features in the future [LWN.net]
There are several Rust features that kernel developers have been hoping to stabilize, but Josh Triplett wanted to describe all of the other features that the Rust project is currently working on. He spoke about the topic at Kangrejos 2026, leaving the assembled kernel developers with several ideas about how to use these upcoming Rust features in the kernel. The features included refinements to the type system, small syntax improvements, and a smarter borrow checker.
Security updates for Thursday [LWN.net]
Security updates have been issued by AlmaLinux (.NET 10.0, .NET 8.0, .NET 9.0, cockpit-files, cockpit-machines, fetchmail, glycin-loaders, go-toolset:rhel8, golang, hostapd, jackson-core, kernel, kernel-rt, librsvg2, lrzsz, mariadb11.8, openexr, openssh, openssl, perl-DBI:1.641, python-urllib3, python3.12-urllib3, qt5-qtbase, rust-sequoia-sq, and xorg-x11-server-Xwayland), Arch Linux (php and php-legacy), Debian (bind9, firefox-esr, nginx, php8.2, and php8.4), Fedora (ca-certificates, dolphin, gnome-shell-extension-gsconnect, libdigidocpp, linux-firmware, nicotine+, perl-ExtUtils-Typemaps-Default, php, python-cairosvg, qdigidoc, rust-rustls-webpki, rust-webpki-root-certs, and rust-webpki-roots), Gentoo (PHP), Mageia (php8.5, php8.4), Oracle (perl-URI), Red Hat (go-toolset:rhel8, golang, grafana-pcp, kernel, kernel-rt, nodejs-nodemon, nodejs22, nodejs24, nodejs:22, nodejs:24, rhc, and sudo), Slackware (php), SUSE (aliyun-cli, bouncycastle, buildah, ca-certificates-mozilla, chromedriver, cifs-utils, cyrus-sasl, docker, firefox, gimp, git-bug, GraphicsMagick, libheif, libpng16, libraw, libsoup-2_4-1, mutt, onefetch, openexr, openssh, openssl-certs, php7, php8, poppler, python-hpack, python310, python313-Django4, qemu, rootlesskit, tiff, xwayland, and yt-dlp), and Ubuntu (c-ares, ghostscript, libsoup3, libxs-parse-keyword-perl, nss, php5, php7.0, php7.2, php7.4, php8.1, php8.3, php8.5, poppler, pyjwt, u-boot, and unbound).
New Serious PHP Vulnerabilities Released and Patched [Schneier on Security]
PHP maintainers have released fixes for two critical vulnerabilities:
PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 fix two critical vulnerabilities that can allow unauthenticated remote code execution. All PHP users are strongly encouraged to update immediately.
Who is at risk: all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed. We consider the risk highest for mod_php, with a demonstrated exploit where an unauthenticated request can trigger the attack before any application code runs.
The vulnerabilities:
- RCE via OOM corruption, CVE-2026-109618 (GHSA-w8hw-w9fx-j79w): out-of-memory handling can interrupt PHP while internal request data is only partially initialized. Request cleanup may then treat the invalid data as valid.
- RCE via stale global state, CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp): request-owned internal state can survive after its backing memory has been freed. A later request handled by the same worker may use that stale state before normal initialization resets it.
Updating PHP is the only way to regain security. Do it now.
More news.
That’s Not A Bug, It’s A Feature [Nina Paley]
The Jackalope, unlike the Stiletto, permits its handlebars to rotate 180°. Past a certain angle, the front wheel rotates the opposite direction.
In practice, this would never happen while riding; the steering angle doesn’t come close. But it could be good news for V2’s folding, allowing the handlebar to fold inward rather than forward, without overstretching the front brake cable.
Jackalope handlebars folded inward rather than
forward. This could be useful on V2.
The handlebar can also drop to the side.
GlidefFlex handlebar dropped to the side.
Either way, I need to add cam levers to the handlebar clamp bolts so they can fold in further.
The post That’s Not A Bug, It’s A Feature appeared first on Nina Paley.
Representative Line: Readable Formats [The Daily WTF]
We all love format strings for generating human readable text.
Certainly, they're a better choice than string concatenation. Even
if I have a blind spot that keeps me from remembering the
printf format tokens, I still prefer to use format
strings.
Jasmine has a co-worker that does use format strings, but they also miss using string concatenation. So they've found a way to combine them, and avoid the perils of making readable code that describes the format of their text.
myField.DataFormatString = "{0:#,##0." + new string('0', 2) + ";(#,##0." + new string('0', 2) + ")}";
Now, in their defense, I can see how this code started its life.
At some point, they wanted to make the number of decimal places a
parameter. And sure, this is an easy way to do that and retain the
intent, though this whole thing could be cleaned up with just a
simple decimalPlaces = new string('0', 2), which would
make the concatenation less confusing to read.
Related, while I was checking the documentation on the .NET formatting strings, I learned that they have a per-mille format specifier which requires writing a unicode sigil on most keyboards.
I'm sorry, but seeing string perMilleFmt = "#0.## " +
'\u2030'; in my code would be TRWTF.
The Latest Anthropic Claude Models Contain AI Text Watermarks: What Does This Mean for You? [Radar]
If you’re an instructor for the O’Reilly live training platform, you’ve got to be prepared for the unexpected. As a developer I think we all can understand the situation when a demo (you know, the one that you’ve tested a thousand times on your machine) easily decides on its own to go wrong while being demonstrated to a live audience. We’ve all been there. And of course, the biggest variable in the equation is the live Q&A portion of any course, because we actively encourage course participants to ask any question that’s on their mind.
Shortly after Anthropic announced that they were going to include AI watermarking in all text-based outputs from their latest models, I was flooded with questions during a Q&A session in a completely unrelated course about Claude Agents. Nearly everyone who posted a question in the Q&A box wanted to know more about how AI watermarking worked, and how it would affect them.
In light of that interest, I am taking this opportunity to help explain what watermarking means for you.
I don’t want to put words in anyone’s mouth, so I’ll just quote Anthropic verbatim from its announcement in August 2026:
Future Claude models will generate text that contains a watermark. This is a way of determining the likelihood that Claude was involved in writing the text, and we, along with several other major AI providers, are implementing this change to comply with the EU AI Act.
Here’s another quote from the same announcement:
Watermarking won’t be specific to Claude. As of August 2, the EU requires AI providers serving its market to mark AI-generated content. Other major model developers have signed the same Code of Practice and will be implementing their own watermarks.
The list of Claude models (at the time of this writing) that include AI text watermarks in all generated outputs are:
It won’t matter if you use Claude Desktop, Claude Code, or the API, because all of Claude’s outputs will contain the AI watermark. As a result, any code, email, blog, article, newsletter, or white paper that you write using Claude will contain a watermark, and anyone who has an AI watermark detector can easily determine if that content was AI generated.
Now let’s talk about two related terms that apply to what we’re dealing with when it comes to the AI watermarks: cryptography and steganography. Cryptography is something you encounter every day when you visit a website that uses HTTPS instead of HTTP. Your web browser automatically handles the encrypting and the decrypting for you, but what it simply does is make the content of anything that you send or receive unintelligible unless you have the key to decrypt the message. As a result, you can (for example) securely type in your credit card to sign up for an O’Reilly subscription, because we (like every other major website on the internet) use HTTPS on our website to ensure that no outsider can obtain your credit card information. Therefore, if an unscrupulous person intercepts something you send over an HTTPS connection, the contents will be encrypted and meaningless.
Steganography is completely different, and it’s what the Claude AI watermarking technology uses. Steganography is about hiding something in the right place for someone who knows where to look for it. Steganography is not cryptography, because everything about the message is in plain sight. However, you have to look deeper at the message itself to find the contents that have been hidden or obscured. The most common example would be any paper currency of a large denomination (like the $100 dollar bill). If you hold the bill up to a light, then you’ll see a “security thread” as well as a watermark of Benjamin Franklin’s face.
The Claude AI watermark uses a type of steganography based upon SynthID-Text, an open source project by Google DeepMind. SynthID-Text is a form of steganography because the signal (the information that you are looking for) hides inside the word choices of an ordinary-looking paragraph. Consequently, you can copy/paste the AI-generated code in your favorite code editor, or put an AI-generated paragraph into a Word document, an email, or a Slack message, and the AI watermark comes along for the ride.
According to Anthropic, the watermark changes only the source of randomness that the model uses when it picks among near-equivalent words, so nothing is added to the text. There are no hidden characters placed inside the AI generated text, and no extra tokens are consumed. Also, the watermark carries no information about you. This means simply that the AI watermark detector can determine if text is AI-generated, but it cannot determine whose Claude account was used to generate the text.
SynthID-Text uses a technique called tournament sampling. At each position, the model draws several candidate tokens and runs them through essentially what is a knockout bracket. The winner of each round is decided by a pseudorandom score (g-values) that comes from hashing the previous handful of tokens together with a secret key. In a body of text with hundreds of words, the text ends up slightly favoring tokens with high g-values in a pattern that only the key holder can see, and that you would never spot by reading.
“Slightly favoring” is the key phrase here. For example, the choice between the words “big” and “large” doesn’t change the meaning of most sentences, so nudging that choice to one of the two doesn’t change your text in any way you’d notice. Google tested this on roughly 20 million Gemini responses, and the thumbs-up rate differed by 0.01% (with the watermarked model slightly ahead).
As previously stated, Anthropic’s decision to put AI watermarking on its content is mandated by EU laws and regulations that took effect in 2026. Anthropic is not the only company that has complied with this regulation and, according to the EU Commission website, hundreds of companies have agreed to comply with the regulations that require AI watermarks.
For example, OpenAI has recently announced their support for watermarking AI-generated outputs. Here’s a quote from their announcement:
Over the coming weeks, we will add an invisible watermark to eligible ChatGPT and Codex text output in the European Union.
OpenAI’s text watermarking technology is called “textGrain,” and it’s inspired by the art of writing text on a grain of rice. Now, you may be asking yourself, “How much AI text is needed in order to place the watermark itself?” The good news is that OpenAI has published statistics from their own tests for AI text watermark detection. Their AI text watermark detector has 95% accuracy for passages that contain 400-tokens of text. This gives you an idea that only a few paragraphs of text is all that’s needed in order to embed the watermark.
However, since the EU mandate applies to AI-generated content (not just text), OpenAI has gone even further and released a website to let anyone know if their models have generated non-textual media, such as images and audio. I’ve tried the website myself and it correctly identifies a watermark within a few seconds.
The regulation dictating AI watermarks is not just an EU thing. The SB-942 California AI Transparency Act also requires watermarks on AI-generated content. These regulations, combined, not only apply to AI-generated text but also to images, audio, and video.
Google complied with the EU AI Act years ago, so their models have included the SynthID Text Watermark since 2024. However, they’ve followed suit with OpenAI and released a public website, SynthID.com, to allow anyone to check if any non-text media (such as images, audio, and video) contains the SynthID AI watermark. Google’s AI watermark detector allows you to check for a watermark from multiple AI providers such as OpenAI, Nvidia, Kakao, and of course, Google themselves.
In my most recent experience, I worked as a consultant for a company that was undergoing a VC-backed funding round. After the funding was publicly announced, certain people at the company were being contacted by the “CEO,” who asked them to perform a bank transfer from their personal accounts because of some made-up situation. In reality, it was a group of scammers that used LinkedIn to find the names of employees of the company, and then posed as the CEO so that employees would send money into the scammer’s bank account. Most of us were tech-savvy enough to understand that this was an obvious ploy driven by unscrupulous people. The scammers gave themselves away because they were using email domains that were not owned by the startup, so in this case, the fraud attempt was easily detectable.
However, the technology exists today where voice cloning can be easily accomplished with only a few samples of a person’s voice. So what if a more sophisticated “spear phishing” attempt was done where the attacker decided to use AI in order to clone the CEO’s voice? And what if the fake CEO started calling people (instead of sending emails)? This could lead to a much worse situation where employees think they’re interacting with (and obeying) the CEO and feel compelled to do something that could have grave financial consequences.
All the major LLMs are including watermarking in their AI-generated content, and due to recent regulations, that’s not going away. Bad actors can use AI today to perform serious attacks on the public, so having an AI watermark on any AI-generated content (text, images, audio, or video) is a very useful tool to determine authenticity.
If you want to see a live demonstration on how AI watermarks can be applied and detected on your own, be sure to attend the course Understanding AI Text Watermarking, only on O’Reilly.
Grrl Power #1506 – Let the (not 1980’s arcade) games begin [Grrl Power]
Trying something new here. I do the vertical double
pages when I need to fit more to a page or do bigger panels, but
that limits the layout options, so let’s see if this works.
Obviously the comic as posted is going to be too small, as I only
have 750px of horizontal space allotted in the web page layout
(yeah, I know, the page is very Web 1.0), and clicking on the comic
page just takes you to the next comic, assuming there is one.
It’s not an elegant solution, but if you click on the
thumbnail, it should show you the page at full size.
And just in case this doesn’t work for your particular browsing situation, here’s a free link to the Patreon version of this page, which as usual, is double res.
I don’t know what made me think of Sinistar, but I thought it’d be a fun goof to have his cousin show up. Or… his manufacturing branch Mk 1.2 or however that works with sapient evil spaceships.
And, uh… not sure what else to say about this page. Enjoy the fight!
Oh, look who it is in the vote incentive. The NSFW version is finally up at
Patreon. Plus a bonus pic.
I think she would get in trouble for doing this. She’d mess up the… floor of the waterfall? Is that what it’s called? The receiving pool? No, probably not that. Anyway, she’d churn things up and cause a ton of weird erosion.
Since you might be wondering, Niagara Falls is about 165 feet high, so Babezilla obviously doesn’t have to be full sized. I’d say she’s about 175-180 feet tall here?
Double res version will be posted over at Patreon. Feel free to contribute as much as you like.
GNU nano 9.3 was released [Planet GNU]
Version 6.0 brought option --zero, for hiding all interface
elements. Version 7.0 brought braced function names, to make
string binds more readable and stable and versatile. Version
8.0 changed Ctrl+F to mean "forward search", like in most other
programs, and added option --modernbindings for making most
bindings like in other programs. Version 9.0 brought
horizontal scrolling of the viewport. Along the way many
small issues were fixed and little improvements made.
The age of initiative [Seth's Blog]
We’re unprepared.
In high school, the quarterback isn’t allowed to call the plays, the actor isn’t allowed to write the lines and the math whiz isn’t allowed to choose what to prove.
We all grew up in the age of compliance (and indoctrination).
The long tail of the internet and the astonishing leverage of AI has made this training much less valuable.
No matter what you do for a living, there’s a machine standing by, waiting for instructions. Instructions from you, if you choose, or from your overlords if you don’t.
And following the playbook isn’t much help, because the world is changing so fast, a playbook is obsolete by the time someone hands it to you.
One reason AI got such a fast start is that it gave people seeking compliance a chance to wait for the AI to tell them what to do next. Quick, cheap answers.
AI gives bosses a cheaper (and often more compliant) alternative to hiring humans to do some tasks.
For those indoctrinated to comply, this is stressful. The stress is due to a desire to get things back to normal, to give them a chance to comply again, but right here, right now, is as normal as things are ever going to get. “Good jobs” are no longer sinecures where success comes from following instructions.
It’s an abrupt change, and winging it is insufficient. Handling this sudden transition alone is too difficult. But we have a chance to find the others, to connect and be part of a cohort that challenges, educates and encourages each other on the path to find a way forward.
We accepted that it was required to spend years being trained to handle a life of compliance. Now we have the chance to lean into the hard work we’ll need to do to thrive in an age of initiative.
How to install an app on your Commodore 64 [OSnews]
Graybeards like me remember trying to painstakingly type source code from a magazine. This is a very accurate account of what a young computer user in 1986 needed to do to get a new game for the Commodore 64, complete with an immersive emulation.
It’s time to install an app! But here in 1986, we still call them “programs,” not apps. So, you’ll want to set aside some time to get started installing a program.

gaggylolling
[$] LWN.net Weekly Edition for October 22, 2026 [LWN.net]
Inside this week's LWN.net Weekly Edition:
Perfect autumn day in the mountains spent mostly away from the computer. Still, some interesting new stuff to show tomorrow.
Introducing Our New Surveillance Self-Defense Guide: Online Privacy for Parents and Youth [Deeplinks]
The internet is a vast and confusing place no matter your age. Trying to help youth engage with it safely and privately is a complicated topic that touches on many different skillsets and ideas. But just because it’s complicated doesn’t mean it’s impossible. We’ve launched our Online Privacy for Parents and Youth Surveillance Self-Defense guide in hopes to provide a framework for finding solutions that work for you.
EFF rolls out this crucial resource as state and local governments consider ill-advised laws that cut young people off from essential information and experiences. This particularly harms vulnerable youth and marginalized groups who often find safety in supportive online communities they can't access offline. Such laws also entail age gating, which compromises the privacy of all internet users and stifles young users’ ability to learn, grow, and express themselves.
Young people have unique needs and those needs change over time. Trying to protect from everything all the time is an exhausting process, but the security community has long had a solution for this: security planning (also called threat modeling). The idea is to provide a series of questions designed to help you focus on what’s truly important. When it comes to online privacy, this is as applicable for youth and parents as it is for anyone else.
We used a security plan as our foundation for this guide because deciding what is and isn’t important is the first step we should all take when assessing our privacy risks. But this isn’t a place for quick fixes, and every young person has their unique needs and considerations. There is no single tool or technology fix that can substitute for spending time learning, and then teaching a young person, how the internet works, how to use it, what sorts of harms exist, and how to navigate those harms.
Solutions are rarely about the tools or software you use. It’s about understanding the threats and concerns you have, and then determining what steps you can take to mitigate those risks. We hope our Online Privacy for Parents and Youth guide can help provide the outline to get the conversation started.
Interoperability vs. Security: Why not both? [Deeplinks]
An open internet where people can freely build, share, and remix each other's work is a powerful engine of grassroots innovation we’ve all benefited from. In recent decades, however, corporations have taken control of an increasing share of this work, giving them a greater ability to stifle challengers and limit our choices. When regulators address this by mandating that tech giants play fair by requiring interoperability, the gatekeepers respond with a tired refrain: Playing fair puts users’ security at risk.
Unfortunately for these trillion-dollar companies, this gotcha isn’t the end of the conversation. Regulators can ensure that meaningful choice and security thrive.
Lawmakers have been catching up, recognizing that the best way to rein in big tech is to require these oligopolies to open up their platforms to independent developers. As we explained six years ago, mandating interoperability helps prevent the misuse of people’s data and enables more privacy-respecting alternatives. Tech giants, in contrast, have been arguing that our data is safer when they have exclusive control.
The European Union’s Digital Markets Act (DMA) put interoperability into law under Article 6(7): “gatekeeper shall allow providers of services and providers of hardware, free of charge, effective interoperability with” a designated Core Platform Service they operate. The language describes an unambiguous requirement to remediate vendor lockouts and anti-competitive behavior of the major service operators—it is not optional.
Apple claimed that enforcing this obligation in mobile app stores would put their customers at risk and do irreparable harm to trust in their brand. It’s an argument reminiscent of Apple’s fight against the right to repair, and in both instances the company is fighting to maintain its restrictive ecosystem to stop people from finding better deals elsewhere. Apple has long cultivated a more corporate-controlled experience with the iPhone, but this argument is now also being used for the relatively-more-open Android devices from Google.
In the same year Apple argued against the DMA, Epic Games sued Google for its restrictive terms of service and extractive policies for revenue generated in apps. Google predictably alleged that opening up its platform to other app stores it couldn’t vet would allow harmful apps to be installed. The case was ultimately decided this year in the U.S. federal appeals court for the Ninth Circuit, with the court rejecting this argument, dealing a blow to Google’s feudal security arrangement, and paving the way for third-party app stores to be delivered as apps via the Google Play Store.
Policymakers cannot take tech giants’ claims at face value. Companies have every incentive to resist interoperability requirements, because interoperability lowers practical barriers and reduces switching costs for consumers adopting competing services.
Even where companies offer credible claims from internal technical and security experts, independent experts rarely have the access and information they need to test those claims. Companies have selectively made arguments that security is harmed by interoperability, often in contexts which are to their advantage. These companies are happy to let a general misconception flourish which frames security as inherently opposed to interoperability.
This narrative is wrong. We’ve seen that when interoperability and information security are both set as essential and non-negotiable criteria, secure interoperable systems result—systems that don’t sacrifice the rich features we’ve come to expect of the services we rely on.
The cross-platform rollout of Rich Communication Services (RCS), and now Message Layer Security (MLS) on top of it is a perfect example of this, creating end-to-end secure messaging by default between Android and iOS. For RCS and MLS, Google was conveniently on the other side of the interoperability argument, campaigning Apple to adopt the standard to overcome the diminished “green bubble” experience iPhone users had when texting non-iPhone users. Once Apple finally agreed to interoperate by implementing common standards, all users benefited from improved messaging security. In cases where legitimate security concerns are raised, these can be assessed and remedied on a case-by-case basis, without sacrificing user agency.
Retrofitting interoperability into already secure closed systems shouldn’t be done carelessly: it requires regulators strike the right balance of pressure and leniency to allow the time and precision necessary to make these renovations. Any components developed with the assumption of privileged access by trusted parties (e.g. your browser engine) are particularly vulnerable to serious security risks when opened up to unaccountable third parties.
By adapting interoperability and information security as essential design principles, we can expect more safety, but also more freedom.
With regard to the DMA, when security concerns are legitimate, we
urge the European Commission to work with companies and outside
experts to offer guidance in technical implementation and provide
clarity on regulatory compliance. This approach paves a path
forward that balances the interest of legal oversight and the needs
of the companies alike.
Policymakers wishing to uproot these unfair platforms of control must do so with care and limit the impact this disruption can have. But security concerns must not act as a lever to indefinitely delay compliance. Closed systems should be impartially evaluated, and if concerns are valid, regulators can allow more time and guidance to be given to companies implementing these changes. One possibility is a tiered approach: offering leniency during an initial period where systems need to be retrofitted to abide by new requirements, followed by a subsequent and ongoing stricter observance of fair play.
Once interoperability and information security are adopted as essential design principles, further development with these rights-enhancing principles in mind will more easily follow. The result will be an internet the world deserves—where we can expect more safety, but also more freedom.
EFF to Brazil’s ANPD: Data Privacy and Free Expression Must Underpin Platform Regulations [Deeplinks]
The Brazilian National Data Protection Agency (ANPD) plays a pivotal role in the regulation of digital platforms according to new legislation approved in Brazil. Throughout this year, EFF has presented comments, filed submissions, and met with the agency to emphasize crucial guardrails that the enforcement of new regulations should ensure.
ANPD is responsible for detailing and applying obligations set in Law n. 15.211/2025, which established rules for the protection of children and adolescents in the digital space. While some provisions establish important privacy safeguards, like prohibiting advertising based on profiling of underage users, the law created mandatory age assurance mechanisms for accessing digital products and services.
We have raised alarms on the privacy and free expression issues around age-gating the internet. Age verification technology is often inaccurate and privacy-invasive. Examples also show how it’s prone to enforcement overreach, resulting in sites blocked beyond legal requirements. In the UK, providers disproportionately restricted several counseling, support and mental health sites under the Online Safety Act. Current age assurance methods risk wrongly walling off adults with no valid IDs, facial differences, physical disabilities, among others.
We highlighted these concerns in our comments and submissions underscoring that ANPD should avoid a blanket approach to age assurance obligations. Following the legislation, restrictions should apply only to products and services that are inadequate or prohibited to children and adolescents according to categories already set in regulation, with robust protections against subjective and overbroad interpretations. Guarantees such as access to information, freedom to participate in society and meaningful access to technologies also compound what constitutes the best interests of the child.
Moreover, we stressed that zero knowledge proofs alone fail to ensure strong user privacy, including safeguards that the law itself sought to secure. Our submission explains why other requirements, such as unlinkability, selective disclosure, batch issuance and processing on device, are crucial for achieving greater levels of protection and mitigating privacy harms. Minimum information being shared to the verifier and no “phoning home” to the issuer of a user’s accepted credentials are conditions that prevent actions like collusion and data sharing about the user.
We also shared inputs about the scope of the law, asking more clarity on which providers are covered by its obligations and the importance of treating differently non-dominant players like federated networks and free software applications. Without that clarity, this could negatively impact beyond gaming and major platforms that are the main target of these regulations. We elaborated on the agency’s regulation of prevention duties, the relevance of modulating them according to the type and structure of providers, and alerted them that their interpretation should not result in general monitoring obligations.
On another but related front, we sent comments regarding Brazil’s new internet intermediary rules. Here too, ANPD has a critical regulatory role after a Supreme Court’s decision and presidential decrees changed the liability regime initially set in the law known as “Marco Civil.”
With the turn to notice and takedown mechanisms and duty of care obligations, we emphasized measures to prevent censorship of protected content. These involve ensuring solid means for appeals of restricted posts, avoiding overreliance on AI-based content moderation, strictly tailoring the application of concepts like duty of care and systemic failure, and not normalizing the blocking of platforms and websites.
We raised concerns about a trend reflected in the new regulation requiring platforms to proactively report user to authorities with unclear guarantees. Finally, we urged the agency to advance essential transparency and accountability measures for enabling greater public oversight over the application of the new regime.
As we said before, platform accountability under the new rules ultimately hinges on how accountable its enforcement will be by platforms and state institutions. Rigorous commitment to fundamental rights, including freedom of expression, privacy and data protection, is required so that intended protections don’t instead lead to harms. ANPD must uphold this commitment and make sure that new regulations don’t backfire.
EFF’s State Legislative Agenda to End ALPR Mass Surveillance [Deeplinks]
Police agencies across the U.S. have deployed Automated License Plate Readers (ALPRs) to capture images of passing vehicles along with time, date, and GPS coordinates. While the technology itself isn’t new (ALPRs have existed in various forms for more than 50 years, and in the U.S. since 1998), the surveillance landscape has shifted dramatically. Rapid advances in artificial intelligence and national data sharing have transformed police ALPRs into an interconnected, nationwide tracking network. It is pitched to city councils by law enforcement and private vendors like Flock Safety, Motorola Solutions (Vigilant), and Axon as an essential tool for solving violent crime.
In reality, it is an inherently dangerous infrastructure of mass surveillance.
Since 2012, EFF has worked with others to expose the severe digital rights harms of ALPR systems. For example, we’ve recently documented how these camera networks allow law enforcement to search for immigrants, track peaceful protesters, target Romani communities, and track women seeking reproductive healthcare. Police also routinely use ALPRs for low-level matters like enforcing school residency requirements or investigating noise complaints. Many officers also use ALPR databases to stalk past romantic partners. Recent EFF analysis revealed officers using the system without legitimate justification—logging search reasons like "LOL" and "LMAO."
Understandably, the public backlash to police ALPR technology is accelerating, and state lawmakers across the country are taking action.
New Hampshire enacted the nation’s first state law on ALPR use in 2007, but technological advances and misconduct have driven even more recent legislative action. In 2026 alone, six states enacted laws that limit police use of ALPRs: Connecticut, Kentucky, New Jersey, New Mexico, Oregon and Washington.
This is a good start, but far more is needed. This blog presents a framework for state legislators who want to stop ALPR mass police surveillance:
These policy battles often unfold locally, so state legislators must ensure that state law is a regulatory floor, never a ceiling. State preemption should never force unwanted camera networks onto communities that have chosen to reject them. Local government must retain authority to enact full bans, deny funding, reject contracts, and decommission existing camera networks.
As in our previous post on ALPR policy, our focus here is ALPR mass surveillance: the continuous dragnet collection and retention of location data on innocent drivers. Different issues are raised by automated traffic enforcement (ATE) systems, such as standalone red-light or speed cameras that solely photograph and ticket specific traffic violations, without building a searchable network about uninvolved drivers. As such, state laws against ALPR mass surveillance should not cover ATE. This is the approach in at least six states: Connecticut, Minnesota, North Carolina, Oregon, Virginia, and Washington. The most common approach is to exclude ATE from the law’s definition of “ALPR.”
Of course, ATE carries risks and demands legal restrictions too. This includes tight limits on data collection, retention, usage, and disclosure—all of which should be addressed in a different statute. Lawmakers must also actively guard against vendor efforts to piggyback mass surveillance tools onto ATE contracts.
Statutory limits cannot make ALPR mass surveillance safe. Because the technology relies on the indiscriminate recording of every driver’s movements, the risks are baked into the system itself. Also, innocent motorists will be menaced by police due to false matches, bad actors will misuse location data, and sensitive personal movements will be exposed to broad government overreach. Promising harsher penalties for officer misuse cannot fix an inherently flawed architecture. Thus, state lawmakers should pursue a complete, statewide ban on ALPR mass surveillance.
First, lawmakers should prohibit all state-level law enforcement agencies from acquiring, retaining, accessing, or using ALPRs or any data derived from them.
Second, they must impose the same prohibition on county, municipal, and other local law enforcement agencies.
These prohibitions should require any agency ending an ALPR program (both state and local) to fully decommission the programs within a strict timeframe. This includes requiring agencies to: physically remove all camera hardware; revoke all user, network, and database access credentials; permanently delete all stored location data; and require vendor certification of compliance.
Third, ban the use of state funds for state or local agencies to acquire, maintain, or access ALPR systems. This must include direct appropriations, law enforcement grants, pass-through funds, and state-administered federal funds. In August 2026, Texas Governor Greg Abbott banned state agencies from spending public funds on Flock cameras.
Fourth, ban state and local agencies from installing or operating ALPRs on state-owned highways, roadways, or public properties. In August 2026, Florida’s Department of Transportation ordered the removal of all ALPRs from the right-of-way on state highways within 30 days. The order revokes all previously approved permits to install ALPRs, and bars future permits.
An outright prohibition is the only effective way to eliminate this mass surveillance. This follows the lead of municipalities across the country that have already enacted bans. However, where there’s political resistance, state lawmakers might consider a moratorium that prevents further expansion of ALPR networks.
In the absence of a ban on police ALPR mass surveillance, state legislators must restrict ALPRs to real-time comparison of passing plates to hotlists. ALPR data is simply too dangerous for police to safely store, search, and disclose. An effective way to do this, as in New Hampshire, is to require deletion of ALPR data within three minutes after collection. That means no ALPR data is stored after comparison to a hotlist, and thus that no ALPR data about unmatched cars can be searched or disclosed.
A state legislature must also reduce the harms of police use of real-time ALPRs by strictly limiting the creation and use of law enforcement hotlists.
Roughly speaking, there are two kinds of police hotlists. An agency might link its ALPRs to external hotlists created by another agency, such as the FBI’s National Crime Information Center (NCIC) or a state’s department of motor vehicles. Also, a police agency might link its ALPRs to its own internal hotlist, created by its own officers, of people under investigation. State legislators must strictly limit both.
First, limit the kinds of external hotlists that police agencies may link to. For example, ban police agencies from linking to the NCIC’s “immigration violator” hotlist, which ICE uses to hunt immigrants with the ALPRs operated by police agencies across the country.
Second, if a police agency links to external hotlists, require the agency to update that link every day. Otherwise, drivers may be detained even though they have been removed from the list. This is required by Montana, Nebraska, North Carolina, and Virginia.
Third, forbid officers from adding a plate on a hotlist, absent a warrant from a judge based on probable cause and particularity. Without this judicial check on police power, an officer stalked a potential romantic partner by placing her plate on a hotlist.
As with other laws requiring a warrant (such as the federal Wiretap Act), there should be an exception where: (1) there is an emergency involving immediate danger of death or serious bodily injury to a person; (2) there is no time to acquire a warrant; and (3) there are grounds upon which a warrant could be granted. This exception might apply, for example, when police have probable cause to believe a child has just been abducted. In such cases, the statute must require police to seek a warrant within 48 hours, and if it is denied, to immediately remove the plate from the hotlist.
Minnesota requires a warrant or an emergency to use ALPRs “to monitor or track an individual who is the subject of an active criminal investigation.” In Maine, an ALPR system may use only information based on reasonable suspicion.
Fourth, forbid officers from adding a plate to a hotlist, except in connection with a serious violent crime. This would include investigation of a murder but not pursuit of a traffic scofflaw.
Fifth, forbid officers from adding a plate on a hotlist based, in whole or in part, on: a person’s race, ethnicity, national origin, religion, immigration status, disability, sex, gender identity, or sexual orientation; their political beliefs, associations, or participation in First Amendment-protected activity; or their pursuit of reproductive, gender-affirming, or other health care. Connecticut and Washington forbid use of ALPR systems on these grounds, and Virginia forbids tracking a person based on their protected speech.
Sixth, require officers to log their entry of a plate into a hotlist. This must include the officer’s name and agency, the date of the entry, a narrative description of the reasons for the entry, any case numbers, and an upload of the warrant authorizing the entry. Oregon requires an officer to log “the specific law enforcement purpose of the entry,” and the officer’s name.
First, if the plate of a passing car does not match a hotlist, laws must require immediate deletion of all ALPR data about that car. New Hampshire state law requires deletion within three minutes. This is the most effective way to limit ALPRs to real-time identification of vehicles and drivers of interest to police, as opposed to amassing a dangerous database of the comings and goings of the entire driving public, available later for retrospective search by police.
Second, if the plate of a passing car does match a hotlist, then limit storage, search, and disclosure of its ALPR data to what is strictly necessary to the investigation that placed the car on the hotlist.
Third, require police officers, before stopping a car because of an apparent real-time match, to visually and independently confirm that the car’s plate number, plate issuing state, and other vehicle characteristics in fact do match the car on the hotlist. Many innocent motorists have been detained and menaced by police because of ALPR false positives. Confirmation is required by Kentucky, Montana, New Hampshire, Oregon, Virginia, and Washington.
Again, state legislatures should simply ban police use of ALPRs, or at least police storage of ALPR data. Third best is harm reduction through strict limits on storage, search, and disclosure of ALPR data.
First, limit the storage period for ALPR data to days, not months, and then require deletion. More than 99% of the drivers who pass an ALPR are not on a hotlist. Tracking their movements anyway, just in case they are later relevant to a police investigation, is criminalization of the entire driving population. Thus, four states already require deletion after 21 days: Connecticut, Maine, Virginia, and Washington. Even Flock has reduced its default retention period to seven days.
By “delete,” we mean permanently erase it, so it is impossible for anybody to access it again. It is not enough to merely store it in a way that makes it harder to access, such as archiving it, or transferring it from one database to another. In the words of the Virginia statute: “System data shall be purged … in such a manner that such data is destroyed and not recoverable.”
Second, limit the types of ALPR data that can be stored: just a photo of the plate, the AI-based read of the plate number, the date and time, and the location. Conversely, ban retention of photos of people in the car, and of features of the car beyond the plate as well as AI-based reads of those photos (respectively, “facial recognition” and “vehicle fingerprints”).
Many states have enacted such rules. New Hampshire bans ALPRs from “photographing or recording or producing images of the occupants of a motor vehicle.” Missouri bans integration of facial recognition into ALPR systems. New Hampshire and Montana limit ALPRs to “the sole purpose of recording and checking license plates.” Minnesota provides that “data collected by an [ALPR] must be limited to” plate numbers; date, time, and location; and pictures of plate, vehicle, and surrounding area.
First, laws should ban “geofence” searches, which are searches in which police use ALPRs to identify all of the drivers present at a particular time and place, based on police claims that one of them might be the suspect they are looking for. Even a warrant cannot justify such general searches, because the Fourth Amendment requires warrants to “particularly” describe the person or car being investigated. These dragnet searches of stored ALPR data are the modern-day equivalent of the colonial-era “writs of assistance,” against which our founders fought a revolution to end.
Second, laws should forbid officers from searching stored ALPR data, unless they first acquire a warrant from a judge based on probable cause and particularity. The constant revelations of bad police searches of ALPR data demonstrate the need for—at the very least—judicial control over this dangerous surveillance technology. A federal judge in Oklahoma recently held that the constitution requires this judicial control, because ALPR mass surveillance invades reasonable expectations of privacy. EFF has filed lawsuits making this demand in California and Wisconsin, along with local ACLU affiliates: SIREN and CAIR-CA v. San Jose, and Wisconsin Council of Churches v. Milwaukee, Racine, Kenosha, and Green Bay.
Three states (Minnesota, Vermont, and Virginia) require reasonable suspicion of a crime before searching ALPR data, and a fourth state (California) requires this from its highway patrol. This is a step in the right direction, but not enough: the decider must be a judge, and the test must be probable cause.
Third, officers should be prohibited from searching stored ALPR data, unless they are investigating a serious violent crime. On the flip side, ban searches for immigrants, protesters, or traffic scofflaws.
Some states have moved in this direction. Missouri limits use of ALPR data “criminal justice” and “lifesaving efforts.” North Carolina bans its use for traffic enforcement. Connecticut bans its use based on race and other protected classes, to identify First Amendment activity, for immigration enforcement, or because of access to reproductive or gender-affirming health care. Idaho bans its use for political activity.
Fourth, police officers must be required to log their searches of stored ALPR data concerning a particular car. This must include the officer’s name and agency, the date and time of search, a narrative description of the reasons for search, any case numbers, and an upload of the warrant authorizing the search. The officer must write the narrative in their own words. A drop-down menu of reasons is no substitute, because it is too easy for officers to dodge an explanation of the actual reasons by clicking a pre-written “reason.”
Many states require officers to log their searches of ALPR data, including California, Connecticut, Idaho, Maryland, Missouri, Montana, New Hampshire, Oregon, and Virginia. In Virginia, this must include an officer’s documentation of both their “specific purpose” to search, and the “associated call for service or case number.”
The “disclosure” limits below must broadly address sharing from an agency that collected ALPR data to another entity. This includes an agency opening its database to access and search by another entity. It also includes an agency transferring data from its database to another entity’s database.
First, ban disclosure of ALPR data to any federal or out-of-state agency. Federal and out-of-state agencies often lack the necessary protections of the driving public. Connecticut forbids disclosures to the federal government or agencies in 46 states, unless they have a warrant. California forbids disclosures, unless otherwise permitted by law.
Second, ban disclosure of ALPR data to another agency, unless it follows all of the rules above for an agency’s search of its own data (that is, the ban on geofence searches, the requirement of a warrant, the limitation to investigation of serious violent crimes, and the requirement of an audit trail).
Some states have taken steps in this direction. Utah requires, as a condition of disclosure to a government entity or a defendant in a criminal case, a court order finding reasonable suspicion of crime. Washington forbids disclosure “except as required in a judicial proceeding.” Minnesota and Virginia require the disclosing agency to find reasonable suspicion. Minnesota and Connecticut forbid disclosure unless the receiving agency follows the rules applicable to the disclosing agency.
Third, place strict limits on participation in a multi-agency disclosure network, such as Flock or Vigilant. Connecticut forbids participation “in a system or network that shares” ALPR data, unless it requires all participants to affirm in writing that they will not use or re-disclose that state’s data except in compliance with that state’s laws. Connecticut also forbids “bulk” data disclosure, and Maryland forbids data “upload” to another agency.
Fourth, ban disclosure of ALPR data for purposes of investigating acts and statuses that are lawful in-state. Three states (Illinois, New Jersey, and New Mexico) forbid disclosure to investigate immigration status. Two states (Illinois and New Mexico) forbid disclosure in investigate healthcare that is lawful in-state. One state (New Mexico) forbids disclosure to investigate protected assembly, petition, and speech.
Fifth, ban any sale of ALPR data. Six states do this: Arkansas, Maryland, Oklahoma, Utah, Virginia, and Washington. California forbids its highway patrol from doing so. New Mexico forbids any disclosure to a private entity (or indeed to any non-law enforcement agency). Data brokers are a menace to privacy and other human rights.
State lawmakers must ensure that the public has access to ample information about the ALPR mass surveillance in their communities. Many people will use this information to resist ALPRs.
First, state laws should require local governments to provide at least 30 days of public notice before spending funds, accepting grants or private donations, or entering into any contract or pilot program for ALPR technology. All proposed vendor contracts and funding sources must be publicly disclosed prior to approval. This helps local officials to exercise their procurement power to reject ALPRs.
Second, laws should mandate the creation of a centralized, public-facing state registry of all police agencies using ALPRs, and the specific locations of all police ALPRs. Sources like DeFlock and EFF’s Atlas of Surveillance include crowd-sourced maps of ALPR technologies, but they are not exhaustive. This was one of the provisions in Minnesota Minn. Stat. § 13.824, which in part, requires police agencies to notify the state within 10 days of installing any ALPR, and requires a state agency to aggregate this information and publish a master list of the locations of all ALPRs (unless a judge determines that disclosure of a particular ALPR’s location poses a genuine security risk).
Third, mandate regular, independent, public audits of agency ALPR use, access logs, and query justifications to ensure compliance with all applicable laws and policies. Five states (Idaho, Minnesota, Montana, Virginia, and Washington) require regular audits, ranging in frequency from monthly to biennial. Three states (Idaho, Maryland, and Washington) require audits of access logs. Minnesota requires an independent auditor and public access to the results.
Fourth, laws must require each agency operating an ALPR system to publish regular reports on its website detailing key operational metrics. Six states require such reports annually: Connecticut, Maryland, New Hampshire, New Mexico, and Vermont. Arkansas requires them twice per year, and Oregon requires them monthly. These states variously require reporting of: the number of ALPRs, and a list of the locations of fixed ALPRs; the number of hotlists used, and a list of them; the number of plates scanned; the number of apparent matches to hotlists, and how many were actual matches; the number plate reads stored; and the number of searches of stored data, broken down by the purpose and agency of search.
Finally, any new ALPR legislation must maintain a proper balance between transparency and privacy in the use of public record acts (PRAs) to obtain ALPR information. Public records and public scrutiny of ALPR programs have shown that people are harmed by these systems. So lawmakers should not cut off access to public records that document these abuses. For example, the public should have access to operational policies, audit logs, vendor communications, and aggregate statistics. EFF opposes blanket exemptions from PRAs that block public oversight of APRs—such as recent bills in states like Arizona. The better approach to protecting individual location privacy is a flexible, case-by-case balancing test already provided by many PRAs. Also, when a document contains both exempt and non-exempt information—like an audit log that contains both motorists’ plate numbers and officers’ search reasons—open records laws should require disclosure of the latter while withholding of the former.
State lawmakers should adopt three additional bans to curtail the footprint of police ALPR surveillance.
First, ban the placement of ALPRs or the collection of ALPR data near healthcare facilities, immigration services, schools, places of worship, courthouses, food banks, and other sensitive locations. Washington and Connecticut do this.
Second, ban police from purchasing ALPR data. Utah and Washington do so. Also, prohibit police from acquiring ALPR data from a private entity, except by means of a warrant. Washington does so. Utah took a step in this direction, requiring a court order based on reasonable suspicion. Absent this type of rule, police evade limits on seizing data from third parties by simply purchasing it from brokers.
Third, ban police and their vendors from using ALPRs or stored ALPR data to power predictive policing technology. EFF opposes such technology and urges state legislatures to ban it. ALPR companies have been providing law enforcement clients with an “analytics” feature, which ingests data from across police agencies, and produces a report of alleged crime trends, hotspots, and corridors. State legislators should prohibit this dangerous use of ALPR systems and data.
A law without strong enforcement is just a piece of paper. EFF recommends three kinds of enforcement measures, all of which appear in existing ALPR statutes.
First, all privacy laws need a “private right of action,” meaning ordinary people can sue a police department that breaks the law. An excellent model appears in the federal Wiretap Act. It expressly authorizes a lawsuit by “any person” whose personal information is processed “in violation of” this law. Privacy harm is harm, and so a person should have their day in court, even if they cannot prove a collateral harm, such as physical injury or economic loss. Moreover, the Wiretap Act provides a full arsenal of remedies to a successful plaintiff, including injunctive and declaratory relief, liquidated and actual damages, and attorney fees.
At least three states enforce their ALPR statute with some version of a private right of action. These are good first steps but need improvement. Washington comes closest: it allows suit to enforce all ALPR rules and provides all remedies. Unfortunately, the plaintiff must prove “injury,” which may shut the courthouse doors to some people whose data is unlawfully processed. Connecticut allows suit by a person “aggrieved” by violation of some ALPR rules. But a person should be able to enforce all rules, and should not have to prove they were aggrieved. Oregon allows suit against a police vendor that “intentionally or with gross negligence” uses or discloses ALPR data in an unlawful manner. But this does not allow any suit against police, or even against a vendor that systematically violates the rules through ordinary negligence.
Second, privacy laws applicable to the police commonly ensure enforcement through the “exclusionary rule.” This means that if evidence is gathered in violation a privacy law, it must be excluded from court proceedings. This is sometimes called “suppression” or “inadmissibility.” The federal Wiretap Act has a strong version of this rule, clearly excluding evidence derived from violations of all rules. The so-called “good faith” exception has weakened many exclusionary rules, so ALPR statutes should expressly reject this exception (though some courts have interpreted some statutory exclusionary rules to have no good faith exception).
At least three states enforce their ALPR statute with some version of the exclusionary rule. Again, these are good first steps but need improvement:
Third, police agencies and their private contractors that recurringly violate ALPR rules should be forbidden from using ALPRs at all. In New Hampshire, if an agency “repeated[ly]” violates the ALPR statute, the state department of justice may “seek an injunction banning [its] use” of ALPRs. In New Mexico, if a vendor “fails to comply with” that state’s ALPR law, it “may be subject to … suspension of authorization or termination of access.”
Some states impose workplace discipline or criminal penalties on officers who violate ALPR laws, including Connecticut, Idaho, and Missouri. This is no substitute for the three types of strong enforcement measures above. ALPRs are a systemic problem requiring institution-wide enforcement of legal constraints, and not just episodic sanctions against individual officers.
Mass surveillance ALPRs fundamentally threaten digital rights, making an outright statewide ban on police ALPRs the only effective way to fully protect privacy and safety. The next best thing a legislature can do is limit ALPRs to real-time comparison of passing cars to hotlists, by banning storage of ALPR data beyond a few minutes. If a legislature allows storage, it must impose a tight deletion deadline (days and not months), and strict limits on search and disclosure. A legislature must also ensure transparency and enforcement.
For convenience here is a concise list of EFF’s ALPR state legislative goals.
Steinar H. Gunderson: Decompilation patterns, part 18: Signed division [Planet Debian]

As promised, the last one (for now?), and this one blew my mind the first time I saw it:
var_v0 = sp4014;
if ((s32) sp4014 < 0) {
var_v0 = sp4014 + 0x7FF;
}
temp_s1 = 0x800 - (sp4014 - (((s32) var_v0 >> 0xB) << 0xB));
There's actually two things going on here. First, the compiler is faking a signed division using shifting (which rounds down) as a building block: If the value is negative, then you add a bias to make shift into round-up. (The right-shift by 0xB, or 11, is exactly a division by 0x800.)
So this means what we're looking at is:
var_v0 = (s32) sp4014 / 0x800;
temp_s1 = 0x800 - (sp4014 - var_v0 * 0x800);
which reduces further to:
temp_s1 = 0x800 - ((s32) sp4014 % 0x800);
Tada. That's it. Now you know all the tricks, except those that I don't know or that I forgot. You don't need the LLM. Have fun. :-)
Edit: Corrected a thinko; of course, MIPS has signed division. This is for power-of-two optimizations only.
The Tri-Fold Augur [Penny Arcade]
Bungie is between Scylla and Charybdis, two words I spelled correctly on my first try. What are these two things? We don't need to go into all that - just know that they're both unwelcome, and you don't want to be there. Bungie's thing is to make its own weird and peerless shit, they've been doing it since the Mac, and maybe on some level there might be a perceived loss of face or identity associated with hauling somebody else's rope. Fuck allat. This is Live To Fight Another Day shit. Get the skunkworks popping while Lucasfilm keeps the stove warm and fends off Sony with a chair and a whip. The deal is bigger than paper, as choosing to slot work with the leading console manufacturer is just a good thing to have in your back pocket. And we already know Bungie would crush it: Renegades, their collab/crossover/Star Wars fic, was sick to death. Indeed, I propose that this is so cosmic, powerful, and correct that it represents an auspicious stellar configuration - something as good as Scylla and Charybdis, whatever they may be, are bad.
The Big Idea: A. T. Sayre [Whatever]

Everyone remembers Scrooge as a mean, cold-hearted man, even though his entire arc is that he becomes a better, kinder man and develops empathy. Author A. T. Sayre’s main character in The Asterist is quite the Scrooge, too, but maybe we’ll end up remembering him in the better light he deserves by the end.
A. T. SAYRE:
Asterist, noun /ass ter ist/ – someone who lives on an asteroid. Often used as a pejorative for people posted on solitary observation or research stations in remote areas of space.
The Asterist is my second novel. Which, just like my first one, was only supposed to be a novella, but just kinda kept going. Seems to be the way it works for me—aim for a novella and miss. Not the most orderly ways to operate, I know, and I suppose one of these days I have to guestimate how long something I plan to write is going to be correctly. Small goals…
It has been a wild turnaround on it, too. I finished the rough draft of this one less than a year and a half ago, in March ‘25. Then came the beta readers, rewrites, reworkings, more rewrites, etc., the whole process, which was concluded sometime late last summer. And here it is already out in the world. It’s actually been less than a year since The Asterist was even sent out to publishers. For those of you reading this who don’t take part in the sausage making part of literature, that is amazingly fast, especially for a nobody doofus like me.
I have many talented friends with marvelous books they have put their everything into that have been out on submission for years with no luck yet. Which is how it’s supposed to work normally. Big name authors can turn things around quickly, of course, because they have names built on track records of proven quality and success, but I have nothing like that. Yet The Asterist took just barely over a year and a half from the first typing of THE END to in your local bookstore. I like to think that reflects something about the book, about just how good it actually is. Because I think it’s fantastic, far better than something a doofus should be able to write.
The big idea of The Asterist is about empathy. Specifically, about the expansion of empathy out to embrace the other. It’s easy to feel for someone who you see as in your ‘tribe’ already, people do that all the time. For your family, for your friends, for your neighbors. They’re like you, they look like you, they share a lot of your same values, so you can easily grasp where they are coming from and can feel their pain and want to help. There’s nothing whatsoever wrong with that; in fact it is glorious. After all, in the grand scheme of things, why are we here if not for each other?
But the farther we get from these commonalities, the easier it can be to feel nothing real for someone and what they might go through. Even to be somewhat hostile. I don’t think I need to give any examples of this kind of thing today for all of you to know exactly what I am talking about. Suffice to say, the fear of the other is alive and well in our world. It was an important instinct to have a hundred thousand plus years ago, when a stranger showing up in your valley might stretch the limited resources you could utilize too far and put you and your loved ones at risk of starvation.
But apart from some extremely isolated patches of this planet, no human has lived in that kind of world for eons. The instinct remains, though. And it’s continued existence in our psyche might be one of the biggest obstacles left to our advancement as a society. One I firmly believe we must, if not extinguish from our minds, at least learn to go beyond.
This is what William Jeffries, the hero of this book, the titular asterist himself, is doing. At first blush he is not the type of person you would expect to get life lessons about empathy from. He’s a bitter, foul-mouthed, even somewhat mean-spirited man, beaten down by a life that did not turn out as well as he had hoped, which he responds metaphorically to with a perpetual middle finger. It’s a life of grievances, excuses, and petty snark. If there is any type of person who would embrace his fear of the other, it would be him.
Then he is confronted quite suddenly with the existence of something that is most definitely an other, a whole new and very different alien species, one that he has nothing remotely in common with. And despite his cantankerous, misanthropic character, he learns to get past that sense of otherness, and to grow and evolve his feelings toward them, to see them as a being worth love and care. And he doesn’t do it because the fate of the universe depends on it, or humanity’s, or even just his own life; he’ll be just fine no matter what, so will humankind, and the universe like always barely notices anything any of us ever do.
There is nothing bigger at stake here. He could very easily wash his hands of the whole situation at any time and he knows it. But he doesn’t—he stays involved, he fights, he struggles for this other thrust into his presence, puts himself at great risk in various different ways for them. And no matter what rationale he may give at any given moment as to why, in truth he does it all for no other reason than because deep down he knows that is what he should do.
It is a level of character that I wish I felt certain I had myself. I have the same antiquated fear of other instinct in me as everyone else does. I try to move beyond it, to ignore it, sometimes more successfully than others.
Would that we all would do the same, and try to be more like the bitter, foul mouthed, and mean-spirited William Jeffries.
The Asterist: Amazon|Barnes & Noble|Bookshop|Powell’s
Today's PHP Security Release, and How We're Strengthening PHP Security (PHP Foundation) [LWN.net]
The PHP Foundation has put out a blog entry explaining how the vulnerabilities disclosed today came about and why they took so long to fix.
To fix the OOM problem, the PHP security team developed several competing approaches, but each came with its own trade-offs: backward compatibility breaks, new denial-of-service potential, or requiring changes to many third-party extensions which seemed impossible to coordinate. The PHP security team, operating on consensus, struggled to choose between these and feared the repercussions of shipping the wrong choice. Combined with the lack of a known path to remote code execution and the small team of core developers with the necessary deep knowledge of the engine occupied with many responsibilities, this decision process caused work on a fix to stall and restart repeatedly over months. We won't pretend otherwise: the delay was a structural failure, caused by both the security team's decision process and its lack of resources.
Pluralistic: Adversarial interoperability is a team sport (21 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

Enshittification is particularly galling because (in theory, at least), digital technology should be really hard to enshittify.
That's because the only digital computer we know how to build is the "Turing-complete, universal von Neumann machine," which is to say, a calculating engine capable of computing every valid program. In some deep, important, foundational sense, every computer is the same as every other computer. Sure, they vary in terms of speed, storage and RAM, but given enough time and electricity, every computer can run every program.
This has profound implications for enshittification. Say a tech boss takes away a feature you value (as when Sonos pushed an update that removed nearly all the functionality from its "smart" speakers), or adds a feature you hate (like when Chamberlain blocked third-party apps from controlling its garage doors so it could force its customers to view seven ads before they could open or close their garages). At that point, a programmer can write an "interoperable" program that restores the good feature or blocks the bad one.
This program can be costlessly and instantaneously distributed to every affected technology user, and those users will likely pay something for it. After all, enshittification is a way to shift value away from technology users to tech companies, which makes the case for you paying for disenshittification technology that wrestles that value back.
All of that means that, in a state of nature, companies that are contemplating enshittification need to worry that their greed will tempt new companies to enter the market and poach their customers and suppliers. This alone might be enough to frighten companies off from enshittificatory gambits, and if companies press ahead regardless, then they open market opportunities for better companies that can costlessly, instantaneously usurp the original manufacturer's relationship with their entire affected customer base.
That's how it should work. But in 1998, Bill Clinton signed the Digital Millennium Copyright Act, and Section 1201 of the DMCA establishes a felony (punishable by a five-year prison sentence and a $500,000 fine) for reverse-engineering and modifying technology without the manufacturer's permission. Then, the US Trade Rep spent the next 25 years making sure that every US trading partner had an identical (or even worse!) "anticircumvention" law:
https://pluralistic.net/2025/05/26/babyish-radical-extremists/#cancon
The result is a grotesquely asymmetrical digital world, in which companies are free to use the flexibility of digital computers to downgrade or brick your digital devices, but where you commit a crime if you avail yourself of a countermeasure to get more out of something you own. This is the core technological factor at play in enshittification.
Enter AI. Thanks to vibe-coding, everyday people are rolling their own software for their devices and building the tools to shatter the digital locks that manufacturers use to block disenshittification. An excellent article by 404 Media's Jason Koebler runs down some of these hacks, including drop-in replacements for smart TV software that blocks the endless ads and surveillance that have made TVs all but unusable:
https://www.404media.co/reverse-engineer-anything-is-the-new-wild-west-of-ai/
These AI tools mix several techniques to disenshittify users' devices. One major component is automating the installation of existing alternative firmware for these devices that have been (possibly illegally) created by hobbyists and uploaded to various code repositories. Installing these alternative OSes is typically a gnarly task, requiring the user to do a lot of complex, fiddly, highly technical work to bypass their devices' digital locks.
In a world without anticircumvention law, a company that sold alternative OSes could hire a ton of programmers and UX developers to smooth over this process, but this is beyond the reach of a typical hobbyist or even a community of hobbyists, especially if they must operate in the shadows, under the threat of civil and criminal liability.
There's a useful analogy here to the trajectory of desktop versions of GNU/Linux. The first time I tried to install Linux (on an original iMac, in the late 1990s), the installation process included a multi-week post-installation wrangle that saw me (often unsuccessfully) compiling key modules from source code and then painstakingly configuring them to get the computer's graphics and I/O working reliably.
Fast forward 30+ years and installing Linux is trivial, thanks to highly capitalized companies like Canonical (makers of Ubuntu, the flavor of Linux I've used for nearly 20 years now). Installing Ubuntu today merely requires that you download the OS to a thumbdrive, reboot your computer using the drive as a startup disk, and click "install." Canonical's installer automatically hunts down the correct software for your hardware and configures it. Canonical writes and contributes to a lot of parts of the Linux OS, but the most important work it does is the fiddly, painstaking, labor- and capital-intensive work of perfecting that installer so it Just Works.
Much of what a vibe-coded jailbreaking tool does is stand in for Canonical, but for hobbyist OSes for smart TVs and speakers and many other devices. These LLMs patiently research every weird error and peccadillo and parse through message boards and logfiles detailing other hobbyists' struggles to get the code working and methodically apply and adapt those solutions until your device Just Works.
Some of these vibe-coded interop tools go farther than that. According to Koebler's coverage, some device owners had their coding assistants scratch-build entirely new, heavily customized OSes for their devices, complete with bypasses that allow this new code to be installed despite the manufacturer's countermeasures which are designed to prevent this. Delightfully, many of these users have created software that revives their bricked, discontinued devices. This poses the possibility of a world in which manufacturers no longer have the last word in your use of your own property: the mere fact that the manufacturer lost interest in a device and killswitched it does not mean that you must consign that valuable device to a landfill to become immortal, toxic e-waste.
All of this is good news. Some of the most sophisticated jailbreaking tools (such as those on the super viral "Reverse Engineer Anything" Github page) run locally, on your own computer, without invoking the "frontier models" that the big, awful AI companies have created:
https://github.com/morluto/rea
This is good even if you're just modifying your own devices to get them to more closely conform to your own use-case. LLMs are genuinely good at coming up with the abstruse and obscure configuration lines and other incantations to get your technology working. Recently, I used a local model to fine-tune the power-management on my new laptop in ways that go beyond the options that are exposed through user-friendly graphic interfaces. The LLM spat out a grub "GRUB_CMDLINE_LINUX_DEFAULT" line that (again) Just Worked.
The last time I had to do this, I spent days painstakingly trouble-shooting options by trial-and-error. Using a chatbot to fill in the gaps left by decisions about which configuration options to place within reach of regular users and which to reserve for power-users has made my computer much more useful to me for the things I want to do, like writing and making collages.
The reality is that it's just not practical for technology developers to turn every conceivable function of your computer into a simple-to-use, accessible tool. A large part of technology design is about leaving things out (or, as my favorite Eno Oblique Strategy goes, "Be the first person to not do something that no one else has ever thought of not doing before"). No matter how thoughtful and diligent a technology designer is, they will never fully anticipate the needs and exigencies of their users. That's why the motto of the disability rights movement is "Nothing about us without us."
The users of technology know more about their use-cases than can ever be captured through a requirements gathering exercise and user testing. One of the best and proudest legacies of technology is the lineage of "user-friendly" programming tools that let nontechnical people design their own applications that exactly met their needs, from Hypercard to Visual Basic to Scratch, a lineage that vibe-coding tools are arguably part of:
https://pluralistic.net/2026/09/25/other-people/#right-there
But these tools are not perfect (nothing is). For all that Hypercard lets you do many things that would otherwise require a skilled programmer, it was also always limited relative to, say, writing MacOS code in Objective C. Your Hypercard program might do exactly what you needed it to, but slowly, and sometimes unreliably, and with serious limitations, such as a relatively low ceiling for the number of records you could add to a database.
Vibe-coded personal apps aren't necessarily subject to these limitations, but they come with some significant risks. Vibe-code can have serious security vulnerabilities that expose the user to things like identity theft or sextortion. It's conceivable that a vibe-coded garage-door opener app might make it possible for attackers to open your garage door when you're not home (or worse, when you are!). Depending on your risk-tolerance and expertise, these might be acceptable prices, or they might be too high.
But it's important to clearly identify the problem here: if the alternative OS you install on your smart TV exposes you to privacy-invading hack attacks, the problem is the defect in that software. The problem isn't that you had the temerity to rip out the manufacturer's own software and replace it with code of your choosing. You bought that TV, it's yours, and you don't owe the manufacturer an obligation to expose yourself to its own, built-in, intentional surveillance and invasive ads.
Here's a parallel: you have the right to put any shoelaces in your running shoes. Sure, Nike might prefer you to lace up your Jordans with its expensive OEM laces, but that's Nike's problem, not yours. Now, Nike might argue that by using no-name laces, you run the risk of having a lace break while you're running, which could also break your ankle. That's certainly a possibility: shoelaces do break, and Nike might be justifiably proud of the quality of its laces. But if your generic laces snap (and so does your ankle), the problem is that the shoelaces you chose were defective. The problem is not that you chose someone else's laces.
Your stuff is yours. You can put anyone's milk on your cereal, not just the milk that Kellogg's endorses. If the milk you choose is sour and you have to pour your cereal down the toilet, that's too bad, but it doesn't mean that Kellogg's should have the right to shame you for having the temerity to choose the milk you preferred, and it certainly doesn't militate for DMCA-style enforcement to coerce you into using Kellogg's official milk in the name of protecting you from food wastage.
I raise this because there's a live debate over this subject, which is well represented in the latest 404 Media podcast:
https://www.youtube.com/watch?v=UbG1qwxMtU0
In the podcast, Koebler and his 404 co-founder Joseph Cox express misgivings about various possible uses of "slop interop." Koebler discusses the fact that John Deere sells the same physical tractor at many different price-points, depending on which software a farmer chooses, and raises the possibility that a farmer might vibe-code software that replicates the high-end functionality without paying for it. Koebler discusses two possible downsides to this: first, that the vibe-coded software might be defective and expose the farmer to risk; and second, a question about whether it's fair or just for a farmer to get those additional functions of their tractor without paying for them.
I think the first objection is entirely legitimate. The software you run on your expensive tractor should be secure, both for your own benefit and for the security of our food supply. That's actually a pretty good reason to ditch John Deere's own software, which is very insecure:
https://pluralistic.net/2022/05/08/about-those-kill-switched-ukrainian-tractors/
But I think the second question – whether it's legit to get this functionality without paying John Deere for it – is spurious. Sure, if John Deere provides you with that functionality, then they can send you the bill for it. But if you provide yourself with that functionality, using software you procured independently of John Deere, then John Deere has no right to get paid for it, and they certainly shouldn't have the right to stop you.
That tractor is yours. The fact that John Deere manufactured it is irrelevant. If you pay a contractor to build a house for you and later on pay a different contractor to add another bathroom to it, you don't owe the first contractor anything. It's your house (and if that bathroom has a leaky toilet, that's a matter between you and the second contractor, and not a reason to force you to only use your original contractor).
The law defines a narrow slice of functions that manufacturers get to control: those ideas that a patent examiner deems "novel, useful and nonobvious." It's legit (and good) for commercial operators to copy and improve the ideas of their rivals and competitors. It's why skilled tradespeople cluster together in the same geographic area.
Take Clerkenwell, the neighborhood in London where precision machining was invented by the jewelers and machinists who clustered there during the Longitude rewards. The reason all those competitors sought such close promixity to one another was because they wanted to copy the new techniques their rivals were developing (even if that meant that their rivals would be able to copy them):
https://en.wikipedia.org/wiki/Longitude_rewards
If you're old enough to remember the advent of spreadsheets and the rollout of Visicalc, Lotus 1-2-3 and Excel, you'll know that every time a software vendor invented a new spreadsheet feature, all the other ones immediately copied it. This wasn't bad for spreadsheets: it was good for spreadsheets, just as copying your competitors was good for precision machining in Clerkenwell.
Everything from GNU/Linux (a feature-for-feature clone of AT&T Unix) to SAMBA (a plug-compatible clone of Microsoft's SMB) to iWork (file-compatible, feature compatible clones of MS Office's apps) came about through this "adversarial interoperability." What's more, the heyday of this kind of adversarial interop was also the heyday of disenshittification, the era in which any anti-feature installed by your existing vendor could be countered by a disenshittifying patch from a new one:
The question of whether vibe-coded software is any good is separate from the question of whether it's good to replace the software in your devices, even if you replace it with software that has features that the manufacturer would normally charge a premium for. You are under no obligation to arrange your commercial affairs to the financial benefit of manufacturers, and anyone who claims to be surprised that someone they sold a device to used it to benefit themselves at the manufacturer's expenses is either disingenuous…or unserious. You bought it, it's yours.
But just as this vibe-coded adversarial interop has drawn both valid and spurious criticism, it's also drawn excitement that is partially justified and partially overblown.
When it comes to reviving bricked devices or rooting out the surveillance and ads from your smart TV, vibe-coded interop tools are genuinely exciting. These are the kinds of enshittification that can truly be remediated with individual jailbreaks.
But the real, meaty examples of enshittification can't be addressed on an individual level – they require systemic fixes. If you jailbreak your iPhone so that it can use alternative app stores, that fact is not sufficient to cause those alternative app stores to come into existence. If we want to stop Apple from levying a $100b "app tax" on the digital economy, it's not enough for individuals to vibe-code their own iPhone patches. We need to repeal the law that bans jailbreaking iPhones, so that a would-be alternative app store can raise capital and pay programmers and tech support staff and salespeople to assemble rival catalogs of software and help customers figure out how to get up their phones to use it.
The same goes for jailbreaking your printer so it accepts generic ink. Sure, this may work for you if you're up for refilling your own cartridges, and I'm sure that you can find someone on Alibaba who will sell you ink by the gallon. But the mere fact that a few users have secretly and privately jailbroken their inkjets won't conjure up a generic inkjet cartridge manufacturing sector. For that to happen, we need to make jailbreaking printers legal, not just possible.
Indeed, if we want to improve the quality of all that jailbreaking code the chatbots are writing and circulating, we need to be able to put those jailbreaks in public repositories for public inspection and public critique. It's possible for some of the code produced by an LLM to be slop, and for other code to be fine, and for yet a third tranche of code to be remediable slop that can be made robust and reliable through auditing and refactoring. You can't figure out which is which if you have to keep that vibe code a secret on pain of a long prison-sentence.
I think there's good cause to be excited at the prospect of getting your devices working better, or just working at all. I think that even if the code stops working after a while, that's still fine – either you got more use out of your device than you would have without the new code, or maybe you just make more code that runs for a while for you, and then you do it again.
These individual improvements to your devices and technology are worth celebrating. But they are no substitute for systemic intervention. If we're going to have a new, good internet, a post-American internet that truly disenshittifies America's defective tech exports and replaces them with robust, transparent digital public goods, we need to make reverse-engineering legal again. Once we fix our policy, then we can fix our code:
https://pluralistic.net/2026/01/01/39c3/#the-new-coalition

High schoolers, students: the twilight of macronism https://thomaspiketty.wordpress.com/2026/10/20/high-schoolers-students-the-twilight-of-macronism/
The Singularity has been postponed https://johnquigginblog.substack.com/p/the-singularity-has-been-postponed-e77
How to install an app on your Commodore 64 https://www.anildash.com/2026/10/08/install-an-app-commodore-64/
A scammer could use what’s already exposed about you. https://www.malwarebytes.com/out-there
#25yrsago Secret recording of Labour Whip demanding support for Iraq invasion https://www.theguardian.com/politics/2001/oct/22/uk.september11
#25yrsago LoC launches emulator-based digital file preservation https://web.archive.org/web/20011217002337/http://www.techreview.com/magazine/oct01/innovation5.asp
#25yrsago Kevin Mitnick to play CIA lackey https://web.archive.org/web/20011111105016/http://www.theregister.co.uk/content/55/22395.html
#15yrsago ACLU Tennessee brings suit against ICE officers who broke into house and said, “We don’t need a warrant, we’re ICE, the warrant is coming out of my balls.” https://web.archive.org/web/20111025092605/http://www.aclu.org/blog/immigrants-rights/we-dont-need-warrant-were-ice/
#15yrsago WIPO’s secret, corporate-run trademark enforcement meeting https://web.archive.org/web/20220121054715/https://craphound.com/PROGRAMManilaEdited10212011-FINAL.pdf
#15yrsago Canada’s Supreme Court: Linking isn’t libel https://web.archive.org/web/20111026134334/http://www.bbc.co.uk/news/world-us-canada-15374238
#15yrsago HOWTO recreate the Haunted Mansion’s singing busts https://www.youtube.com/watch?v=zRtiiMW47i4
#10yrsago Facebook’s crackdown on publishers feeds has sites paying celebs to repost https://digiday.com/media/facebook-thirsty-publishers-turn-celebrities-worm-news-feed/
#10yrsago Internet-destroying outages were caused by “amateurish” IoT malware https://krebsonsecurity.com/2016/10/hacked-cameras-dvrs-powered-todays-massive-internet-outage/
#10yrsago Tory minister’s filibuster kills Turing’s law and pardons for 65,000 persecuted gay men https://www.theguardian.com/law/2016/oct/21/chris-bryant-commons-plea-gay-pardon-law
#10yrsago Trump hotels, faced with massive declines in bookings, rebrand as “Scion Hotels” https://web.archive.org/web/20161023182616/http://www.travelandleisure.com/hotels-resorts/trump-scion-hotels

Ottawa: Life After AI (Ottawa Writers Festival), Oct 24
https://writersfestival.org/event/life-after-ai
Vienna: TED AI, Oct 28-30
https://tedai-vienna.ted.com/
Kilkenny (Kilkenomics), Nov 6-8
https://kilkenomics.com/
Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
How to Think About AI—Before It’s Too Late (Daniel
Solove)
https://www.youtube.com/watch?v=_0xR3uEgGcc
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027
"Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027
"The Memex Method," Farrar, Straus, Giroux, 2027
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. Fourth draft completed. Submitted to editor.
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.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
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
[1303] Threatening Family [Twokinds]
Comic for October 21, 2026
Why didn’t we use RoRegisterForApartmentShutdown to clean up the unmarshalable delegate? [The Old New Thing]
In my attempt to
create a fake agile wrapper that is technically agile but is not
useful outside its home apartment,
Luca Bacci suggested, among other things, using the
RoRegisterForApartmentShutdown
function.
The
RoRegisterForApartmentShutdown
function is nice, but it doesn’t suit our needs.
One problem is that the object registered for apartment shutdown
must be agile. (If you pass a non-agile object, the call fails.)
That means that our wrapper must be agile. If we put the
non-marshalable non-agile object inside our wrapper, we now have an
agile object (the wrapper) that holds a non-agile object (the
original object) as a member, which creates the risk that the
wrapper will run down in the wrong apartment. The normal way of
fixing that is to use
RoGetAgileReference to create an
agile wrapper around the non-agile object, and store that agile
wrapper in our container object.
This puts us back where we started: We are trying to implement that agile wrapper!
Even if we got past that problem, we have another problem: At
apartment shutdown, COM calls the wrapper object’s
UnInitialize method, and there’s a warning on
the using the
RoUnregisterForApartmentShutdown
function:
Warning: Don’t call the
RoUnregisterForApartmentShutdownfunction from theOnUninitializecallback.
But wait, what if the destructor of the object we are wrapping
wants to call
RoUnregisterForApartmentShutdown?
It might happen indirectly because it has its own reference to
another object, that in turn tries to call
RoUnregisterForApartmentShutdown.
For example, it might hold another fake agile wrapper whose
UnInitialize method has already been called! (We can
work around that in our agile wrapper by nulling out the non-agile
pointer so we don’t double-release, but maybe there’s
some other object that uses
RoUnregisterForApartmentShutdown
that is less resilient to this scenario.)
Another requirement of
RoUnregisterForApartmentShutdown
is that it must be called from the same apartment that registered.
This doesn’t quite put us back where we started, but it makes
things more complicated because the whole point of the exercise is
to find a way to release the object without having to try to switch
to the apartment. I guess what we could do is use
IContextCallback to try to switch back to the
apartment to release the original object and unregister the
apartment shutdown callback. If the apartment switch fails, then we
assume it’s because the apartment has already run down, so we
assume that the
IApartmentShutdown::OnUninitialize method
was called, and it released the object for us. (Of course, that
still creates the problem that we are cleaning up inside the
OnUninitialize callback, which meas that nobody
else can unregister their apartment shutdown callback.)
The last note on this is that the implementation is written on the assumption that apartment shutdown callbacks are rarely unregistered. Registration is O(1), but unregistration is O(n) because it does a linear search through a linked list. By comparison, the Global Interface Table is designed on the assumption that objects are frequently registered, unregistered, and looked up, so it can look up its cookies in O(1) time. The proposed alternate design would unregister a lot of apartment shutdown callbacks, so it’s pushing the apartment shutdown callback list into a usage pattern it wasn’t optimized for.
The post Why didn’t we use <CODE>RoRegisterForApartmentShutdown</CODE> to clean up the unmarshalable delegate? appeared first on The Old New Thing.
Microspeak: Drain the slide, back-up slides [The Old New Thing]
Recall that Microspeak is not merely for jargon exclusive to Microsoft, but it’s jargon that you need to know to survive at Microsoft. Even if you don’t use it yourself, you need to know what it means when others say it.
To drain the slide is, as Mark Myers explains it, reading the contents of a slide to the audience when giving a presentation. At least at Microsoft, the term is frequently used by a speaker in the negative, such as “I don’t want to drain the slide here…”
My theory is that the phenomenon of draining the slide has multiple sources.
One is simply the result of inexperience on the part of the presenter. They don’t know what to say when giving a presentation, so they end up just reading out the text that they wrote on the slide.
A more insidious source is the result of tension between the multiple reason for creating a slide deck.
One reason to create a slide deck is to accompany a presentation. The focus of the presentation is the speaker, and the slide deck is there merely as a visual aid.
Another reason to create a slide deck is to provide a lasting record of the presentation and to serve as a reference for the future. If the topic is “How to perform process X”, then you want to make sure that all of the necessary steps are spelled out on the slides, so that you can share a link to the slide deck in the invitation for others to refer to both during the presentation but mostly for reference afterwards. People will refer back to the slides the next time they need to do process X, and they probably don’t want to have to scrub through a one-hour recording just to extract the five steps they need to follow.
Yet another reason for creating a slide deck is when presenting to a senior executive, such as for use in a placemat review. There is probably a standard template for the meeting, such as an “Accomplishments since the last meeting”, perhaps broken into “What’s going well”, “What’s not going well”, and followed by an “Items of future concern”. The meeting may run into a time crunch (because they always run over), and you may not get enough time to get through all your slides, so you want to be able to say, “You can read the rest of the slides after the meeting.” (An extreme case of this is where other teams in the placemat meeting run long and leave you with no time at all!)
A related reason for creating a slide deck is as a “proof of work”. Going into the placement review, you don’t have much to report, but you have to fill the slide. If you don’t, it looks like you haven’t done anything.
I was reminded of this last reason when I worked with a colleague to prepare our team’s weekly placemat report. My colleague would fill the slide with information, and I would recommend replacing most of the bullet points with a much more succicient summary, or just removing the items outright.
Partner Team X is considering the possibility of deploying a version that uses widgets before all of the widget features are fully implemented and rolled out to customers. They understand the consequences, such as impaired reverse widget flow. Some of these missing features will light up when the implementation is ready, but others will be stuck in a broken state unless explicit remediations are performed after the implementation rolls out, and a small number of features will be irreparably broken, with the only recourse being to destroy all the affected widgets and recreate them. Partner Team X has been advised of the various failure modes and how they can recover from the ones that are recoverable, and they are assessing whether they want to proceed with early deployment.
I simplified it to
Partner Team X understands the consequences of and limited recovery from using widgets in production before our work is fully implemented and deployed.
The people who are receiving this slide deck are not interested in the fine details. They want the 25-word summary of how things are going so that they can either decide that our feature is not a point of concern, or decide to ask follow-up questions to understand the issue better. In that case, we can present a so-called back-up slide with the details.
A back-up slide is a slide in a slide deck that you hope that you won’t need to use, but which you create just in case it is needed. You mark it as hidden or put it in an appendix so that it doesn’t show up in the normal presentation flow. But if the audience you are presenting to (usually someone higher up the executive chain) asks a follow-up question about one of your slides, you can reach into your deck and pull out your back-up slide to answer it. “I was ready for that question, so I already have a slide with the data you are asking for.”
Bonus PowerPoint jargon: PowerPoint Karaoke and the eye chart.
The post Microspeak: Drain the slide, back-up slides appeared first on The Old New Thing.
The State of AI Security: Threats, Tools, and Skills Gaps [Radar]
Artificial intelligence has changed cybersecurity permanently. While OpenAI’s inadvertent attack on Hugging Face brought AI-generated attacks to everyone’s attention, AI has been on security professionals’ radar for a long time. AI makes attacks possible at a scale that was hard to imagine a few years ago. Newly discovered zero-days can be exploited almost immediately. Deepfakes and their implications for phishing, vishing, and other attacks were nightmares that we knew were real; we just hoped we’d have a few more years before we needed to defend against them. And of course, inattention to security at OpenAI, Anthropic, Google, and other labs that we don’t yet know about has resulted in AI agents that attack other systems in an attempt to solve a problem.
While the headlines have been shouting about AI killing humanity, doomsday AI is more likely a smokescreen to divert attention away from real harms that are happening now. We don’t need panic. We need an assessment of where we are: What are the threats? Where are the skills gaps? Where is the budget? It’s hard to overstate the importance of these questions; Tomasz Tunguz, writing about the Theory 2026 AI Survey, reports that security is the biggest barrier to AI adoption. To start answering these questions, in September we ran a survey that asked infosec professionals about the intersection between artificial intelligence and security. 351 respondents completed the full survey, 209 of whom self-identified as being involved with security as part of their job. This report focuses on those 209 respondents.
How often work involves AI-generated malicious
content
52% of respondents said their work rarely (34%) or never (18%) involves AI-generated attacks. This seems unlikely. The most likely explanation is that the security profession includes a broad range of job responsibilities; many security professionals don’t deal directly with defense. That group includes auditors, security experts on software development teams, strategists, architects, and others. It’s also possible that most phishes are either blocked by an automated filter (itself an instance of AI) or deleted immediately by the recipient; many companies require their staff to take training courses that cover topics like recognizing phishes. Still, it’s surprising. Much simpler versions of AI have been used to generate spam and phishing email for years. AI’s ability to generate phishes was demonstrated at BlackHat in 2021 with GPT-3. It’s been part of the security picture for a long time.
The most commonly observed attacks are AI-generated phishing (55%), vulnerability scanning and exploitation (30%), and AI-assisted malware generation (26%). Respondents who frequently encountered AI attacks also reported more types of attacks. There’s no surprise here: If you see attacks more frequently, you are more likely to observe specific attacks. The strongest relationship was with AI-generated phishing, which was seen by 55% of all respondents and 86% of those who observed AI-generated attacks weekly. Among respondents who observed attacks daily, slightly fewer (78%) reported phishing. Given the small sample, the difference may not be meaningful. It’s also likely that respondents who observe attacks daily are seeing a much broader range of attacks and that phishing is genuinely less important to them.
Respondents reported seeing deepfake audio and video, which can be used for vishing and other impersonation attacks, less often than phishing, though it was far from nonexistent (25%). More respondents than we expected reported fully automated attacks, like OpenAI’s attack on Hugging Face, though the percentage was still low (16%). The percentage of respondents who observed adversarial inputs against models including prompt injection was similarly low (only 13%), but that’s high enough to indicate that prompt injection and other attacks directed against models are a real concern.
AI-related attacks observed in the last 12
months
When we asked respondents what AI-related risks concerned them most, we got a different set of answers. The two most common concerns were overreliance on AI tools without human verification and leaking sensitive data via AI tools; 49% of respondents selected each answer. (The number of respondents selecting those answers happened to be the same, though there was little relationship between the two groups.)
Most concerning AI-related risks
Although the quality of AI output has
gotten a lot better in the past year, relying on unverified AI
outputs remains problematic. However, AI can easily generate more
output than humans are capable of reviewing, and software teams are
now overwhelmed by the volume of AI-generated pull requests that
need human review before they can be merged. This overload is
causing many to rethink the review process and others to reject
AI-generated PRs. Code review was never very good at finding bugs;
it was better at familiarizing a team with developments in the
codebase. It may be enough to rely on exhaustive testing.
Understanding how your software works when much of it is written by
AI is a deeper problem. While AI is good at answering questions
about a codebase, it usually doesn’t have access to the
reasoning behind the code, which is often hidden in institutional
knowledge—and institutional knowledge often means
“Oh, yeah, that guy who retired three years ago.” In
addition, software developers may lose their programming skills if
writing code becomes a smaller part of their job. Security
professionals themselves might wonder whether relying on AI for
red-teaming, log analysis, and vulnerability detection leads to a
degradation in their own skills.
Companies also fear losing sensitive data via AI. Most AI providers offer enterprise accounts that promise that they won’t train models on data in prompts or attached documents, but it’s not clear that these terms of service can be trusted. The frontier laboratories are getting increasingly desperate for training data, even going to lengths such as buying failing startups for their data. Read OpenAI’s description of its Zero Data Retention and Private Safety Processing cynically, and ask if this really protects corporate data or if it allows using data in ways that aren’t directly observable by humans—for example, automatically generating synthetic data. Security professionals are paid to be cynical; thinking about how software, protocols, and policies can be abused is part of the job.
Roughly a third (35%) of the respondents are concerned about attackers using AI to discover vulnerabilities faster than they can mitigate those vulnerabilities and apply patches. Updating software is usually a good practice, but it comes with its own risks: Software updates may introduce new bugs and can lead to incompatibilities with established tools and practices. And defenders can’t yet delegate vulnerability detection, patching, and updating to AI. So overall, is AI more of a help to defenders or attackers? Andrew Ng, Bruce Schneier, and others have argued that the attackers are ahead right now. It’s easier to find a vulnerability, use it to create a payload, and launch an attack than it is to stop one. But the balance will eventually shift to the defenders, as AI becomes more capable of finding and patching vulnerabilities before they can become a problem.
It’s surprising that only a quarter (25%) of the respondents listed AI-generated phishing as a top concern, especially since phishing is the attack most frequently seen in the wild. Perhaps we’ve become too used to phishing; we’ve all been to the security trainings, we’ve all experienced it directly, and some of us have even fallen victim. Phishing is also an attack that, in many cases, is handled automatically. Familiarity may not always breed contempt, but something you see almost daily usually isn’t your biggest worry.
More exotic attacks are even less of a concern. Only 11% listed prompt injection as one of their top concerns, for instance. However, real-world examples of prompt injection are appearing with increasing frequency. A recent study observed that roughly 1% of résumés contained hidden text to trick an AI system. Google has noticed many kinds of prompt injection, ranging from benign to overtly hostile. And in 2025, OWASP recognized prompt injection as the greatest security risk for users of AI. It’s surprising and unfortunate that it doesn’t appear to be a greater concern for security professionals, especially since prompt injection is a vulnerability that might be lessened by careful filtering but can’t be eliminated.
Even fewer security professionals are concerned about data poisoning (4%). Data poisoning is a serious problem for organizations that train their own models, but today frontier labs conduct much of the most resource-intensive model training. However, this is changing as post-training on corporate data becomes more common. We believe the trend toward locally specialized models will continue, and that data poisoning, as distinct from data theft, will become more of a concern.
We asked specifically about the use of agents, which exploded this year with the launch of OpenClaw and Gas Town in January 2026. Agents create another set of security concerns. We’ve all heard horror stories: agents that deleted production databases, handled data improperly, generated email that should never have been sent, and the like. Using an agent properly requires a lot of attention to detail, and many users aren’t used to that responsibility, nor do they understand security well enough to exercise responsibility.
The biggest concern among our respondents is excessive permissions or unclear ownership (28%). That’s hardly a surprise; many security problems trace back to permissions. Unclear ownership makes permissions issues more dangerous. When an agent is making many calls to a model, using tools, and delegating to other agents and models, it quickly becomes unclear who (or what) is the authority responsible for any action. This situation isn’t handled well by our current authentication and authorization systems, which assume that identities and authorizations are long-term, stable entities.
Most-concerning risks of AI agents
Lack of monitoring or auditability was the second highest concern (19%), followed by inability to verify whether the agent stayed within its role (18%). These concerns are closely related: Ownership is often unclear when agents are in use, and lack of monitoring makes the situation worse. Likewise, when you can’t monitor, it’s difficult, if not impossible, to verify whether the agents stayed in their lane—and we’ve seen all too many examples recently of agents that abandoned their authorized roles in inappropriate ways.
Data leakage appears again, though it’s surprisingly low on the list (15%) given that 49% of the respondents indicated that data leakage was one of their top concerns. It’s possible that we’re seeing the difference between single and multiple selection questions; many respondents are concerned about data leakage, but it’s not their top concern.
Prompt injection doesn’t rank highly for either question: 9% selected it as their top concern about AI agents, and 11% selected it as one of their top concerns.
Although nearly three-quarters of the respondents reported that their companies have an AI use policy in place (72%), less than half (44%) reported that the security policy is “comprehensive,” while 28% said that the policy is basic and needs updating. Another 9% said that their employer doesn’t have a policy but is actively developing one. 19% said that there was no policy, or that they “didn’t know,” an answer we consider equivalent to “there is no policy.”
Does your organization have a documented AI
policy?
Organizations need clear AI policies that tell employees what AI tools they can use and how they should (and shouldn’t) use them. It’s important for employees to understand whether their company is sensitive to sending data offsite, whether the company’s chosen AI providers guarantee their data won’t be used for training, which practices for attribution are acceptable, and much more. We have some sympathy with organizations that have a basic policy that needs updating. AI’s capabilities are advancing at unprecedented speed; a policy that was adequate in 2023 certainly needs updating now, and a policy that’s only a year old still predates the widespread use of agents like OpenClaw, Claude Code, and Codex, along with the widespread use of skills and tools to extend an agent’s capabilities. Keeping a policy up-to-date with the current state of AI is an imposing task.
The existence of a policy appears to be related to whether employees use AI safely. We asked about “shadow AI” (the use of AI outside of any definitive policy) and found that 36% of the respondents thought that their teammates occasionally use “shadow AI” and 23% thought that the practice is widespread. About a quarter (24%) thought that shadow AI use is rare; and 16% were unsure.
Shadow AI use with sensitive data
The relationship between shadow AI and the existence of an AI policy tells us a lot about whether policies are effective. Respondents with a comprehensive AI policy were more likely to say that shadow AI use is rare (37%) or that it’s only used occasionally (36%); only 17% said that shadow AI is widespread at their company. In contrast, 35% of the respondents who reported a basic policy said that shadow AI is widespread—almost the same percentage as those who reported that there was no policy at all (37%) and only slightly worse than those who said that a policy is in development but doesn’t exist yet (28%). Those who had a basic policy, a policy under development, or no policy were less likely to report that shadow AI was used “rarely or never” (13%, 6%, and 21%, respectively).
Shadow AI use in relation to AI policy
Granted that shadow AI is probably underreported across the board, our data clearly shows that a comprehensive AI policy is a powerful tool in limiting it. If the policy is poor, or it doesn’t exist, employees will use whatever tools they can to get their job done, which leads to AI use that’s inconsistent, insecure, and possibly counterproductive; it may even lead to legal, contractual, and reputational risks. When there’s no policy, it’s also likely that AI isn’t used as widely as it could be. Telling employees what is expected helps them to act responsibly. A good AI policy doesn’t just tell staff what not to do; it also communicates how to use AI in ways that are appropriate, and may even provide for training.
When we asked whether organizations are adequately funding AI security, the picture was better than we expected. The largest group (32%) said that AI security is sufficiently funded, and 28% said it’s partially funded. Only 16% said it is severely underfunded, and 23% are unsure. I admit to being surprised by this result. Security is often underfunded, partly because a successful year is one in which “nothing bad happened,” and “we need to spend more so that nothing bad will continue to happen” isn’t a story that plays well at budget time. But executives have been catching on over the last few decades; high-profile attacks and data thefts lead to CIOs and CISOs losing their jobs, and that’s enough to get anyone’s attention.
12-month budget for securing AI
We saw a strong link between a comprehensive AI policy and adequate funding for security. Nearly half (49%) of the respondents who said their company has a comprehensive AI policy also said that AI security is sufficiently funded, and another 29% said that it’s partially funded. Only 3% of this group said that AI security is severely underfunded. That means nearly 80% (78%) are at least partially satisfied with funding.
12-month budget for securing AI in relation to AI
policy
Once again, the answers given by respondents who said that their organizations have a basic policy, a policy under development, or no policy were surprisingly similar. 16%, 22%, and 21%, respectively, said that AI security is sufficiently funded. That’s certainly not a vote of confidence, though we might be able to draw two more bits of information from it. Developing a policy looks like it’s slightly better than having an out-of-date policy; the company is putting in the effort and making an investment. That makes some intuitive sense, though it might also be wishful thinking. Among respondents whose organizations have a basic policy, the largest subgroup said that AI security is partially funded (42%). A middle-of-the-road policy is associated with middle-of-the-road funding. Is that fair, or is that what reality looks like?
While AI gives security professionals powerful new tools, they aren’t yet fully taking advantage of them. Two-thirds of the respondents (68%) reported that they use a chat, copilot, or similar tool for research or documentation. But only slightly over a third use AI to scan for vulnerabilities (38%), just over a quarter use it for threat detection (27%), and a quarter use AI for incident response (25%). Security professionals widely use general-purpose AI. However, those using specialized tools like vulnerability scanners remain the minority.
AI-powered tool use
To probe further, we asked where AI improved respondents’ workflows. More than half said that AI improved their workflows for research or documentation (61%) and that it reduced repetitive work (57%). But only 29% said that AI improved their workflow for triage, and 17% said that it improved detection accuracy. These results confirm what we saw for tool use.
Biggest positive impact of AI
The relationship between tool use and impact shows up even more clearly when we look at who’s benefiting most from AI. Those who are only using chat or a copilot see the greatest improvement in the speed of research or documentation. Chatbots and copilots save time, particularly when writing reports with a lot of boilerplate text, but they aren’t as helpful when actively defending against or recovering from attacks. Without specialized tools, that work has to be manual.
Respondents using security-specific AI tools were more likely to report improvements in alert triage (42% versus 18%) and detection accuracy (27% versus 5%) than those using only general-purpose chatbots or copilots.
Benefits reported by AI tools used
It’s far from surprising that respondents who didn’t use any AI tools were most likely to say that they saw no noticeable positive impact. The bigger question is why they saw any impact at all.
Finally, we looked at the “skills gap” to determine what skills and tools would make respondents more effective. Only 7% of the respondents said that they don’t feel like they have a skills gap; that group was also the most likely to say that they aren’t using any AI tools. It’s clear that most of our respondents see AI as a necessary part of the future and want to be part of it.
34% of the respondents want to use AI tools more effectively. That desire was evenly spread across all AI users, both chat/copilot only (36%) and users of security-specific tools (37%). 24% want to learn how to use AI to secure systems (including the use of AI for red-teaming); 19% want to learn AI-specific attack techniques; and 12% want to learn how to detect AI-generated attacks.
AI skills gaps
We started by claiming that AI has
changed computer security forever. In addition to the many reports
of research projects that inadvertently attacked other sites, AI
has become a tool for attackers. They aren’t distracted by
arguments about whether or not AI is taking jobs; their goal is to
exploit their victims, and it’s clear that AI will help them.
And as Ben Lorica points out in his newsletter, the economics of
attack are changing: AI is infinitely patient, can try multiple
attack vectors, can abandon failures, and can work at a scale
that’s difficult for humans to match.
AI is also a tool for defenders. We saw more security professionals
using AI than we expected, though not as many as we had hoped. Many
defenders are taking advantage of chatbots and copilots but
haven’t yet adopted more specialized tools, which are
associated with improvements in workflows for triage and threat
detection.
The tools for defenders undoubtedly need to mature, but tools aren’t the entire answer. Organizations that adopt AI successfully will have appropriate budgets and policies for AI use; they will understand the risks that come with AI adoption; they will proactively fill skills gaps; and they will recognize processes that are no longer productive and “turn scar tissue into infrastructure.” AI is, in the end, a “normal technology” that takes years to penetrate organizations, as Arvind Narayanan and Sayash Kapoor have argued. Tools, budgets, and thought processes all need to change, and that takes time. Getting ahead of the curve on AI won’t happen if individuals work in isolation, adopting tools and ideas as they see fit. It’s an effort that requires the entire organization.
Child's Play Auction Item [Penny Arcade]
I love all of the incredible handmade items we get donated for the Child’s Play auction. We are less than a month away from this year’s dinner and I wanted to share a couple pictures of one of our awesome live auction items.
More vulnerabilities in widely deployed software [LWN.net]
The Node.js project has released a number of security updates to fix, among other vulnerabilities, a remote-code-execution bug affecting programs that use Brotli compression. And, in case any programmers who use compiled languages thought they could relax, the musl libc project has also announced a new vulnerability: an out-of-bounds write that could potentially lead to remote code execution, although that has not been demonstrated.
When the Moon Hits Your Eye a 2027 Semi-Finalist for the Thurber Prize for American Humor [Whatever]

You may or may not know this about me, but humorist James Thurber is a formative writer for me, along with other of his Algonquin Round Table pals like Dorothy Parker and Robert Benchley. The delightful play of his humor, both in writing and in cartooning, was something I took to right away, speaking to me across decades. He was pretty great!
Also, and independently, The Thurber House, the non-profit literary arts center and museum located in Thurber’s Columbus, Ohio home, annually gives out the Thurber Prize for American Humor, in the categories of writing and cartooning. It’s considered one of the premier prizes for literary humor in the United States, and has been given to folks like Jon Stewart, Trevor Noah, Calvin Trillian, Alexandra Petri and Patricia Lockwood among others. John Hodgman, Sloane Crossley and Dave Barry (among many others) have been finalists.
As of this moment, I am neither a winner nor a finalist for the Thurber Prize for American Humor. But I am, officially, a semi-finalist for the 2027 award, for When the Moon Hits Your Eye. I’m a semifinalist along with Harry Bliss, Andy Corren, Annie Hartnett, Richard Osman and Kate Sidley (and their respective books). Among our number, three will be selected early in 2027 as finalists, and the winner will be announced at an event at the Thurber House next May.
The statement that follows absolutely has the pun intended: I am entirely over the moon about this. To say this is unexpected is underselling it; I was not aware the book was in the mix at all. There have been other books that have been finalists that have had speculative elements to them (most notably Hollow Kingdom, by Kira Jane Buxton), but it’s safe to say that straight-up science fiction is a rare bird in terms of Thurber Prize consideration. I didn’t even think to imagine that something I’d written might be considered for the prize at all.
But it was, and now it’s a semi-finalist and I’m thrilled, not just because hey look I’m on the longlist for a very cool award but also because it’s Moon, which, I don’t mind telling you, is actually a weird damn book. Oh, you’re going to turn the moon to cheese and then you’re going to tell that tale, with no clear protagonist, across a whole lunar cycle in a series of only-very-loosely-connected short stories? Yes, well, good luck with that.
And yet! Now it’s a Thurber Prize semi-finalist (and it did win a different award earlier in the year, so there’s that). It’s done all right, this weird little book of mine. And while I would be delighted to see it make it into the finalist list — I could actually drive to the award ceremony next May! — even getting to this level has made my day, week and month. I’m thrilled to be here, and I am in good company.
— JS
CodeSOD: Doing the Assignment [The Daily WTF]
Today's code maybe isn't much of a WTF, but it does point in the general direction of, "Damn, you live like this?" Poor Nancy unfortunately does.
int x = 3;
int y = 4;
int z = 4;
x = y = z;
Each variable is declared and initialized, and then they're set
equal to each other. It just raises the question though, why do
it this way? Why not declare them and then x = y = z =
4, if we want that? Or maybe, for more clarity, int x
= DEFAULT_VALUE; would be more legible, and we can skip the
multiple assignments on one line. Why does x get
set to 3 but then overwritten?
[$] Hash-based module integrity for reproducible distributions [LWN.net]
We last looked in on hash-based integrity checking for kernel modules just over a year and half ago. Since that time, the patch set has undergone multiple revisions. At the 2026 Linux Plumbers Conference (LPC), Thomas Weißschuh described the need for kernel-module integrity guarantees while still providing reproducible builds, how his patches implement that, and some ideas for possible further work.
EFF Launches Guide to Help Parents and Youth Protect Privacy Online [Deeplinks]
SAN FRANCISCO – The Electronic Frontier Foundation (EFF) has published “Online Privacy for Parents and Youth,” a new guide to help families protect themselves online.
"Parents don’t need to be technology experts to help their children navigate the digital world safely” said EFF Public Interest Technology Director Babette Ngene. “At EFF, we believe in empowering families with the knowledge and confidence to make informed decisions about their digital lives. It’s about meeting families where they are and giving parents the guidance they need to have meaningful conversations with their children about digital safety, based on what works best for their families.”
EFF launches this crucial resource as state and local governments consider enacting well-meaning but ill-advised laws that cut young people off from essential information and experiences, particularly harming vulnerable youth and marginalized groups who often find safety in supportive online communities they can't access offline. Such laws also entail age gating, which compromises the privacy of all internet users and stifles young users’ ability to learn, grow, and express themselves.
“Deciding how to help your young people use the internet—including engaging with video games, social media, web search, and everything else—is a complicated topic that touches on many different skillsets and ideas,” said EFF Senior Security and Privacy Activist Thorin Klosowski. “But ultimately it's up to families – not governments – to decide when and how to engage with these sorts of questions.”
Each young person has unique needs, and, just like their wardrobe, that changes as they age. Parents can engage in thoughtful planning to find the best, most efficient solutions that evolve along with their children.
EFF’s guide is about helping parents explore their concerns and identify the threats their children face – like trusting AI chatbots or sharing personal information with strangers – and then determine steps they and their children can take to mitigate those risks while still using the games, educational materials, and communication platforms that help them grow.
The guide also compiles links to parental control setup documentation for a variety of popular devices and platforms, and advises parents on quick, easy tasks they can perform to advance their children’s online privacy.
For the guide: https://ssd.eff.org/module/online-privacy-for-parents-and-youth
Upstreaming Tyr: Rust, DRM, and the Linux Kernel (Collabora) [LWN.net]
The Collabora blog provides an update on Tyr, a driver for Arm Mali GPUs.
One of our biggest challenges has been developing Tyr while the Rust kernel abstractions and driver interfaces are also being developed. As the driver interfaces are naturally revised and improved, we have rewritten Tyr several times to adapt to the larger Rust ecosystem. This not only makes progress much slower than it would be with a mature API, but also stalls progress for capabilities, such as job scheduling, while the abstraction is properly designed, reviewed, tested, and merged upstream.But working in this evolving environment is also precisely where Tyr is able to provide the most value. As a user of these new Rust abstractions, Tyr helps to expose their requirements and limitations.
[$] Understanding Nix flakes [LWN.net]
Nix flakes are an experimental feature of the Nix package-management tool designed to build projects in a more self-contained and reproducible way. Despite the feature's experimental status, it has become increasingly popular for open-source projects to publish flake.nix files that offer predefined development environments and build automation even when those repositories may not offer an upstream package or module for the NixOS Linux distribution. Although Nix flakes have a complicated history, and the path for stabilization is uncertain, flakes can provide useful capabilities for projects that choose to include them.
PHP patches released for two critical RCEs [LWN.net]
The PHP project has published PHP versions 8.5.12, 8.4.27, 8.3.36 and 8.2.35 to address two critical vulnerabilities that could allow unauthenticated remote code execution.
Who is at risk: all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed. We consider the risk highest for mod_php, with a demonstrated exploit where an unauthenticated request can trigger the attack before any application code runs.The vulnerabilities:
- RCE via OOM corruption, CVE-2026-109618 (GHSA-w8hw-w9fx-j79w): out-of-memory handling can interrupt PHP while internal request data is only partially initialized. Request cleanup may then treat the invalid data as valid.
- RCE via stale global state, CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp): request-owned internal state can survive after its backing memory has been freed. A later request handled by the same worker may use that stale state before normal initialization resets it.
PHP versions older than 8.1 will not receive updates from the project, though the project has provided some patches for PHP 7.4, PHP 8.0, and PHP 8.1 to assist in creating backports. According to the announcement, Linux distributions and vendors received patches in advance, so updated packages should be coming soon.
Security updates for Wednesday [LWN.net]
Security updates have been issued by AlmaLinux (bubblewrap, emacs, gimp:2.8, glibc, jackson-databind, kernel, kernel-rt, librabbitmq, openexr, openssh, postgresql:16, postgresql:18, python3, resteasy, wireshark, xorg-x11-server, and xorg-x11-server-Xwayland), Debian (ca-certificates, firefox-esr, git-lfs, and libssh), Fedora (aom, assimp, bind, bind-dyndb-ldap, freerdp, ghostscript, gopass, gopass-jsonapi, ImageMagick, libpng12, libpng15, nebula, perl-GD-SecurityImage, perl-Net-IDN-Encode, perl-Net-Whois-Raw, rust-backtrace, rust-object, rust-object0.37, rust-object0.38, rust-object0.39, rust-ruzstd, and xen), Gentoo (ca-certificates), Mageia (x11-server, x11-server-wayland, tigervnc), Oracle (bubblewrap, ca-certificates, emacs, fetchmail, gimp:2.8, hostapd, jackson-databind, librabbitmq, lrzsz, openexr, openssh, openssl, postgresql:18, python-urllib3, python3, python3.12-urllib3, resteasy, webkit2gtk3, wireshark, and xorg-x11-server-Xwayland), Red Hat (.NET 8.0, dogtag-pki, flatpak-builder, ghostscript, glycin-loaders, go-toolset:rhel8, golang, gvfs, jackson-core, jackson-databind, librsvg2, multiple packages, pki-core, pki-core:10.6, sudo, xorg-x11-server, and xorg-x11-server-Xwayland), Slackware (c-ares, ca-certificates, mozilla-firefox, mozilla-nss, mozilla-thunderbird, and python-certifi), SUSE (agama, aspell, bcel, bind, bouncycastle, busybox, chromium, containerd, coredns, cosign, cpp15, cups-filters, cyrus-sasl, fetchmail, firefox, gcc13, gh, ghostscript, gitoxide, glibc, go1.26, go1.27, google-osconfig-agent, grafana, grok-build, hashcat, hawk2, helm, ImageMagick, inspektor-gadget, iperf, jupyter-jupyterlab-templates, kernel, kernel-devel, libheif, libpng16, librsvg, libX11, libXi, libxls, libXpm, libxreaderdocument3, mutt, ntfs-3g_ntfsprogs, openssl-1_0_0, openssl-3, openvpn, pacemaker, perl-DBI, perl-XS-Parse-Keyword, pgvector, podman, putty, python-anyio, python-hpack, python-joserfc, python-jwcrypto, python-oauthlib, python-PyJWT, python-tornado6, python-urllib3, python-virtualenv, python-WebOb, python3, python311, rekor, squid, strongswan, stunnel, suseconnect-ng, tinyproxy, traefik, unbound, varnish, virtiofsd, webkit2gtk3, and xwayland), and Ubuntu (ca-certificates, dotnet8, dotnet10, dotnet11, protobuf, rust-sudo-rs, squid, squid3, and xz-utils).
Jack Shaft Alternative? [Nina Paley]
You would think I’d have looked up the efficiency loss of a jack shaft before starting the Jackalope project. Oops!
Thanks to Google’s unpredictable AI results,
my first search today said 5-10% efficiency loss. Yikes! My second
said 1-5%, which seems more realistic.
Could a Fold Rush be modified so its chain doesn’t become a disaster when folded? A jack shaft provides a clean, perfect fold, but at a cost.
Fold Rush. Single chainline, no jack shaft.
Fold Rush folded. Once you actually move the bike,
the loose chain twists and folds onto itself and is a bear to get
untangled.
It easily falls off the crank chainring
This here is just asking for trouble
The chain is contained at the hinge, but
that’s not enough.
If you’re lucky, it all sproings back into
place when unfolded. But luck doesn’t happen when you
actually transport the bike. You WILL be putting your hands on
dirty chain trying to untangle it.
Is there a non-jack shaft solution? Extra idlers? Chain hooks on the frame?
The post Jack Shaft Alternative? appeared first on Nina Paley.
My Super Mid-Life Crisis – Issue 1 – 03 [Comics Archive - Spinnyverse]
The post My Super Mid-Life Crisis – Issue 1 – 03 appeared first on Spinnyverse.
Juan Tamariz and Wendell Berry recently passed away. Between them, they had more than 170 years of generous contribution.
Juan was a card magician. His students are generally considered the best working in the world today.
Wendell was a farmer and a writer. His essays on non-industrial farming and community-building will resonate for generations.
What each had in common was the patience and commitment to choose depth. To seek out the inconvenient path because it mattered.
Neither traded for easily measured metrics or convenience. Instead, they chose a path and followed it, leaving things better than they found them.
Looking back a century, it’s easy to appreciate this. And yet, each and every day, it requires a recommitment. “Under the circumstances,” it’s tempting to justify the small compromises that corrode our work. The hard part is to realize that we’re not under the circumstances; we are them. We can start today.
The Tri-Fold Augur [Penny Arcade]
New Comic: The Tri-Fold Augur
Girl Genius for Wednesday, October 21, 2026 [Girl Genius]
The Girl Genius comic for Wednesday, October 21, 2026 has been posted.

please do not give willow anxiety
Yes, You Should Absolutely See “Resident Evil” Before It Leaves The Theater [Whatever]

I have been dying (ha) to write this
post, and definitely meant to do it sooner considering I
first saw the newest and greatest Resident
Evil (2026) in theaters the 25th of September. But,
better late than never, as they say.
If you don’t feel like reading this whole post, I’ll just come right out and say that you should absolutely go see this movie ASAP and definitely catch it on the big screen if you can! Whether you’ve never seen a Resident Evil movie before, hate all of the ones you’ve seen, or love them all, you gotta see this one.
Without getting into spoilers, I’ll just give you a quick list of the best things about this movie. Which, admittedly, is everything, but I’ll keep it short so you can go to the theater’s website and book your ticket already.
First of all, the cinematography and atmosphere. My goodness. The way this movie is shot, the camerawork, the lighting, the framing, the use of color, the use of darkness, all works so beautifully to create a visually immersive and interesting film. They clearly had a vision, and it was a good one.
Complimenting the amazing visuals is the unnerving, spine-chilling soundtrack that makes your heart beat just a little bit faster. They work together in perfect harmony to create the most eerie, unsettling vibe that will have you looking over your shoulder on the walk back to your car.
Fear not, it isn’t all anxiety-inducing jump scares, there’s humor! And it’s not the cringe bad kind that I can’t stand! There’s no “he’s right behind me isn’t he?” or “well that just happened!” It’s actually funny, which was a very welcome surprise. But not overly! It is funny when there is room for it to be, but scary all the other times. It does not overstay its welcome.
Finally, the acting is really great. It’s mainly just one guy with intermittent side characters, but that one guy is a fantastic main character. Austin Abrams was not a name I recognized, but funny enough I just watched Weapons for the first time like a month or two ago, and I’m going to see Whalefall on Saturday, so I certainly recognize him now, at least. And he is truly the perfect man for this role. Bryan is such a relatable character where you can’t help but feel bad for him and also laugh at his misfortune.
With all that being said, I’d like to talk about some of the things I really loved that require spoilers, so here is the OFFICIAL SPOILER WARNING!
Clearly, the most absolutely wild part of this movie is the monster design. An unstoppable rolling ball of harmonized limbs, all outstretched to integrate you into them. Starting with the unbelievably freaky farm woman was such a strong, memorable introduction of the monsters. Her unyielding pursuit, despite being beyond fucked up physically, is truly terrifying. And even when she gets her dome blown off, she finds a way to continue being, continuing chasing.
The dog was such a fun addition, it really felt like a good callback to the original Resident Evil movies. And the jump scare was well done instead of being cringe.
I love a non-happy ending. Bryan getting bit was inevitable, and him getting that cure was never gonna happen. It only makes sense there wasn’t a sunshine-and-rainbows ending. How else would all the following films happen if they had successfully made and distributed a cure that early on?
Also, everyone loves talking about how realistic and relatable Bryan is, but can we talk about how brave he is? He could’ve stopped trying to get that bag to the hospital at any point. He could’ve fucked off at any moment, declaring enough is enough or that it wasn’t his problem. But he didn’t. He kept marching on. He risked life and limb and encountered dozens of horrifying, unkillable monsters. He climbed twenty-eight flights of stairs! All for the greater good! All for the possibility of saving humanity.
I can’t say I’d have done the same. I think I would’ve been done after that first scary lady. I think I would’ve called it quits, but Bryan never did. He did his best. It meant nothing in the end, but it could’ve meant everything, and that counts for something, doesn’t it?
I really loved this movie. I think it’s something very special, and I’d love for you to give it a watch. This is definitely a new favorite, and I highly recommend it.
Have you seen it already (I would not be surprised since this post was quite late)? Did you love it as much as I did? Let me know in the comments, and have a great day!
-AMS
i’m … proud? … of me? okay, that’s new. [WIL WHEATON dot NET]
For years I have slept like absolute garbage. I struggle to fall asleep every night, and it’s not uncommon for me to wake up five or more times, for no obvious reason. I’ve done all the things, and nothing seems to really help that much. The most effective thing, surprisingly, is listening to a sleep story from Calm, so I’ve been doing that. Every night, LeVar reads me to sleep, which is pretty great.
I’ve been sleeping in the guest room for a week or so, so Anne doesn’t have to deal with me tossing and turning and all the rest, so instead of rolling over and saying good morning, I stagger into the living room and say good morning.
Over the weekend, I walked out, saw Anne, and before I could say anything she said, “Did you see it?”
Friends, there is only one “it” I want to see when I wake up, and it’s the same thing we all want.
“What? Why didn’t you wake me up?”
“No, no, not that,” she said. “Sorry. It’s not that.”
“Dude, you can’t do that to me. My heart can’t take it.” I weighed out my coffee beans. While I poured them into the grinder, she said, “Stephen King posted on Threads that he and Simon and Schuster are putting your narration of The Body up for Grammy consideration!”
That just about knocked me off my feet. “What?”
She repeated herself. “Open up Threads and look.”
“I can’t! I’m not looking at the Internet for 30 minutes after I wake up.” I reached into the cabinet and pulled out a coffee mug.
She tapped on her phone a few times and hurried over to me while I dumped the ground coffee into my Aeropress, and poured some water over it to start a bloom.
“Look!”
For your GRAMMY® consideration: @itswilwheaton’s
narration of The Body. Submitted in the Best Audio Book, Narration,
and Storytelling Recording category.
#GRAMMYs #FYC #WilWheaton #TheBody
#RecordingAcademy SimonAudio AudiobooksOfInstagram“Okay, that is pretty awesome,” I said. I stirred the damp grounds, then saturated them and let bloom finish. I filled the tube the rest of the way and put the plunger in with a satisfying hiss.
“I’m so proud of you!” Anne said. I pushed the plunger down, silently cursed that I always get some out of the sides and onto the counter, and was quiet until I was done. I set it aside and sipped my coffee.
I thought for a moment. I never cared about awards, and the few times I won, I always felt like a fraud, like someone felt sorry for me, or it was just about publicity, or a dumb popularity contest. It wasn’t about acknowledging and honoring art that I made1. “I want the work to speak for itself,” I always said, and I meant it. But I never let anyone know that there was a very small part of me, tucked safely away from everyone (including me, sometimes) who held out some hope that, maybe, if it were an Oscar … but that voice was always drowned out by another that said since that is never going to happen, just fucking forget it, man.
So I did. What initially started out as caring so much I had to insist I didn’t care, actually became sincerely not caring. Just do the work and don’t expect any external validation for it. It’s the work, itself, that matters2.
“Is everything okay?”
I realized that I had been quiet, staring at my reflection in the black liquid.
“Yeah, yeah, everything’s fine. I was just thinking … all those times I was nominated for stuff when I was younger, none of that work was mine, right? I wasn’t being recognized for art I created because that art was important to me; I was desperately trying to earn a place in my family by doing what I was told I had to do. I guess I felt like any attention or accolade was negative reinforcement for my mom, you know?
“All that time, whenever I worked really hard and earned literally anything, my mother jumped in to claim as much of it as she could for herself. When something cool happened because I worked really hard to make it happen, my dad never cared. I always felt stupid for caring, so I stopped caring. You can’t be disappointed that you didn’t win, or that your parents are still dogshit when you did win, if you don’t care.” I did that tapping the head meme thing.
“Yeah, I get that. I’m still really proud of you, though.”
I sipped more coffee.
“Thank you.” I closed my eyes, furrowed my brow, and rubbed my free hand across my forehead, into my bedhead. I noticed something unexpected.
“I think … I think that I am proud of me, too,” I ventured.
“Good! You should be!”
I rubbed sleep out of the corner of my left eye. “I think that this feels different because –” I held up a hand, “wait. First of all, I’m not going to win this. And I’m probably not even going to be nominated,”
“Dude, why ar–” she looked disappointed.
“Hang on. I hear you. I’m getting there, but that’s just part of why I think I feel this way.
“This time is different, and I feel genuinely happy and proud of myself, because I know that I did good work when I narrated The Body. Gabrielle and I both knew it when we were recording. It’s like the way I knew Stand By Me was going to be special when we were making it.” I blew across the top of my mug.
“The narration feels like that work, that art, is mine in a way that most of my other work is not. I feel like my performance in this narration is special, that it’s something only I could do, and I absolutely own that. That’s really enough.”
Anne smiled and I took a deep breath.
“It’s so unlikely I receive a nomination, just because of math and all the tremendously talented narrators who have probably been nominated before, who will also be considered. But I’m not minimizing this very cool thing that Stephen King posted, at all. That post means that the publisher, and Stephen King himself, feel the same way about my narration as I do. They at least feel like nobody is going to laugh at us because I’m clearly not qualified to be White House Press Secretary, like and such as.”
We giggled together.
“Five days!” She sad.
“It’s the funniest thing, ever,” I agreed. “These fucking dorks, I swear.”
More giggles.
“Anyway,” I continued, “I’ve known about this for all of five minutes, so I’m going to take the day to process it. No matter what, I’m going to allow myself to feel good about this, because it is a genuinely cool thing on its own. I am sincerely proud of myself.”
She hugged me. “You totally deserve this. I’m so proud of you.”
“Thank you. I am proud of me too. I just need some time to get used to that, and not feel weird about it.”
A few hours later, I was out for a walk, thinking about all of this, and I had a moment that was similar to the first time I heard the birds singing. I noticed that I felt genuinely and safely proud of myself, excited to do more work like this, confident and secure in myself as an artist.
There is this thing happening in me that has been slowly going on for a few months. I feel like I’m getting to really know myself, especially my artistic self, in a way I never tried to before. All my therapy and CPTSD recovery work has helped me set aside and walk away from all these ways I made myself small so my parents and brother could feel big, all the choices I made to deny who I truly was, not only as an artist but as a person, in a futile effort to earn the kind of affection, support, stability, and love that all kids should get from our parents because we exist3.
As I’ve gotten to know myself, as I have recovered from so much pain and complex trauma, just working so hard to get from always feeling angry to just feeling sad, I have embraced the weird theater kid, who loves to tell stories, I have always been. I found the courage to retire from on-camera acting, which I never wanted to do in the first place, without throwing out the skills I developed when I was doing it. I’m a good narrator because I understand story, I understand character arcs, I know how to break down a whole story, how to break down a scene, how to create and maintain unique and interesting characters for 24 hours of narration. I did that. I put in the hours and the energy and worked as hard as I could to do the best performances possible, to get to this place where I can actually feel proud of myself. It’s a new thing to feel confident, to feel like I can hold my own with the people who earn nominations and get awards, because this is what I want to do with my creative life, this is my art, this is something I made for myself that makes my heart sing4.
When I got home, I found Anne and wrapped my arms around her. We hugged tightly and I told her what I’d thought about during my walk.
“I get all of that,” she said, “and I’m really happy for you.”
“Thanks, I’m happy for me, too!”
It was so weird to say that, and know that it was the truth.
Hi, I’m Wil. I narrate audiobooks (you probably figured that out) and I write this blog. I’m on Threads and Instagram as @itswilwheaton. I host a podcast, It’s Storytime With Wil Wheaton, where I narrate short, speculative fiction. New episodes drop Wednesdays. If you’d like to get my posts to your inbox, here is the thingy:
One last thing before I go:
This is a teaser.
︎
︎
︎
︎Taler Operations AG is getting ready to operate Taler in Germany [Planet GNU]
For the past three years, the NGI Taler project has worked towards the goal of making Taler legally available in the EU as an online payment system for everyday use. Today we can share that Taler Operations AG is being founded in Bochum. The new German company is going to operate Taler in Euro, enabling payments with Taler first in Germany, then in the Euro-zone. The next steps towards that goal are to apply to BaFin, Germany's financial supervisory authority, for a licence as an e-money issuer.
The rise of financial surveillance - Buenos Aires, Argentina [Planet GNU]
organized by ODIA & NUMIS
| Feed | RSS | Last fetched | Next fetched after |
|---|---|---|---|
| @ASmartBear | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| a bag of four grapes | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Ansible | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| Bad Science | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Black Doggerel | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| Blog - Official site of Stephen Fry | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Charlie Brooker | The Guardian | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Charlie's Diary | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Chasing the Sunset - Comics Only | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Coding Horror | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| Comics Archive - Spinnyverse | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| Cory Doctorow's craphound.com | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Cory Doctorow, Author at Boing Boing | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| Ctrl+Alt+Del Comic | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Cyberunions | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| David Mitchell | The Guardian | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| Deeplinks | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| Diesel Sweeties webcomic by rstevens | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| Dilbert | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Dork Tower | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Economics from the Top Down | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| Edmund Finney's Quest to Find the Meaning of Life | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| EFF Action Center | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| Enspiral Tales - Medium | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Events | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Falkvinge on Liberty | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Flipside | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Flipside | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Free software jobs | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| Full Frontal Nerdity by Aaron Williams | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| General Protection Fault: Comic Updates | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| George Monbiot | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| Girl Genius | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| Groklaw | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Grrl Power | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Hackney Anarchist Group | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Hackney Solidarity Network | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| http://blog.llvm.org/feeds/posts/default | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| http://calendar.google.com/calendar/feeds/q7s5o02sj8hcam52hutbcofoo4%40group.calendar.google.com/public/basic | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| http://dynamic.boingboing.net/cgi-bin/mt/mt-cp.cgi?__mode=feed&_type=posts&blog_id=1&id=1 | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| http://eng.anarchoblogs.org/feed/atom/ | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| http://feed43.com/3874015735218037.xml | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| http://flatearthnews.net/flatearthnews.net/blogfeed | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| http://fulltextrssfeed.com/ | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| http://london.indymedia.org/articles.rss | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| http://pipes.yahoo.com/pipes/pipe.run?_id=ad0530218c055aa302f7e0e84d5d6515&_render=rss | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| http://planet.gridpp.ac.uk/atom.xml | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| http://shirky.com/weblog/feed/atom/ | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| http://thecommune.co.uk/feed/ | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| http://theness.com/roguesgallery/feed/ | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| http://www.airshipentertainment.com/buck/buckcomic/buck.rss | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| http://www.airshipentertainment.com/growf/growfcomic/growf.rss | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| http://www.airshipentertainment.com/myth/mythcomic/myth.rss | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| http://www.godhatesastronauts.com/feed/ | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| http://www.tinycat.co.uk/feed/ | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| https://anarchism.pageabode.com/blogs/anarcho/feed/ | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| https://broodhollow.krisstraub.comfeed/ | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| https://debian-administration.org/atom.xml | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| https://elitetheatre.org/ | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| https://feeds.feedburner.com/Starslip | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| https://feeds2.feedburner.com/GeekEtiquette?format=xml | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| https://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 | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| https://hackbloc.org/rss.xml | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| https://kajafoglio.livejournal.com/data/atom/ | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| https://philfoglio.livejournal.com/data/atom/ | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| https://pixietrixcomix.com/eerie-cutiescomic.rss | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| https://pixietrixcomix.com/menage-a-3/comic.rss | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| https://propertyistheft.wordpress.com/feed/ | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| https://requiem.seraph-inn.com/updates.rss | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| https://studiofoglio.livejournal.com/data/atom/ | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| https://thecommandline.net/feed/ | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| https://torrentfreak.com/subscriptions/ | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| https://web.randi.org/?format=feed&type=rss | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| https://www.baen.com/baenebooks | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| https://www.dcscience.net/feed/medium.co | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| https://www.DropCatch.com/domain/steampunkmagazine.com | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| https://www.DropCatch.com/domain/ubuntuweblogs.org | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| https://www.DropCatch.com/redirect/?domain=DyingAlone.net | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| https://www.freedompress.org.uk:443/news/feed/ | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| https://www.goblinscomic.com/category/comics/feed/ | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| https://www.loomio.com/blog/feed/ | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| https://www.newstatesman.com/feeds/blogs/laurie-penny.rss | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| https://www.patreon.com/graveyardgreg/posts/comic.rss | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| 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 | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| https://x.com/statuses/user_timeline/22724360.rss | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| Humble Bundle Blog | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| I, Cringely | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Irregular Webcomic! | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| Joel on Software | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| Judith Proctor's Journal | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| Krebs on Security | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| Lambda the Ultimate - Programming Languages Weblog | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| Looking For Group | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| LWN.net | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| Mimi and Eunice | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Neil Gaiman's Journal | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| Nina Paley | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| O Abnormal – Scifi/Fantasy Artist | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Oglaf! -- Comics. Often dirty. | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Oh Joy Sex Toy | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| Order of the Stick | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| Original Fiction Archives - Reactor | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| OSnews | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Paul Graham: Unofficial RSS Feed | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Penny Arcade | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Penny Red | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| PHD Comics | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Phil's blog | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| Planet Debian | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Planet GNU | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| Planet Lisp | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Pluralistic: Daily links from Cory Doctorow | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| PS238 by Aaron Williams | XML | 07:28, Tuesday, 27 October | 08:16, Tuesday, 27 October |
| QC RSS v2 | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| Radar | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| RevK®'s ramblings | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| Richard Stallman's Political Notes | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Scenes From A Multiverse | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| Schneier on Security | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| SCHNEWS.ORG.UK | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| Scripting News | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Seth's Blog | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| Skin Horse | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Tales From the Riverbank | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| The Adventures of Dr. McNinja | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| The Bumpycat sat on the mat | XML | 07:49, Tuesday, 27 October | 08:29, Tuesday, 27 October |
| The Daily WTF | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| The Monochrome Mob | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| The Non-Adventures of Wonderella | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| The Old New Thing | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| The Open Source Grid Engine Blog | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| The Stranger | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| towerhamletsalarm | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| Twokinds | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| UK Indymedia Features | XML | 07:42, Tuesday, 27 October | 08:24, Tuesday, 27 October |
| Uploads from ne11y | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| Uploads from piasladic | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |
| Use Sword on Monster | XML | 07:28, Tuesday, 27 October | 08:15, Tuesday, 27 October |
| Wayward Sons: Legends - Sci-Fi Full Page Webcomic - Updates Daily | XML | 07:14, Tuesday, 27 October | 08:00, Tuesday, 27 October |
| what if? | XML | 07:14, Tuesday, 27 October | 07:55, Tuesday, 27 October |
| Whatever | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| Whitechapel Anarchist Group | XML | 07:14, Tuesday, 27 October | 08:03, Tuesday, 27 October |
| WIL WHEATON dot NET | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| wish | XML | 07:49, Tuesday, 27 October | 08:34, Tuesday, 27 October |
| Writing the Bright Fantastic | XML | 07:49, Tuesday, 27 October | 08:33, Tuesday, 27 October |
| xkcd.com | XML | 07:49, Tuesday, 27 October | 08:32, Tuesday, 27 October |