Tuesday, 10 November

15:35

Microsoft employee price list from 1987 [The Old New Thing]

I present for your amusement the Microsoft employee price list from 1987. Marvel at the Microsoft software catalog from nearly 40 years ago. Use your inflation calculators to figure out how much those prices translate into today’s dollars. (Note that these are the discounted employee prices, not the retail price.)

                                                                         May 4, 1897

                                 EMPLOYEE PRICE LIST

 PART                            EMPLOYEE       PART                             EMPLOYEE
NUMBER       DESCRIPTION           PRICE        NUMBER       DESCRIPTION           PRICE 

             FORTRAN                                    MULTIPLAN
005-014v400   MS-DOS               $30.00       023-014v203   MS-DOS 3.0           $15.00
005-023       SOFTCARD             $10.00       023-022       APPLE II (NATIVE)    $15.00
005-092v331   XENIX 286            $30.00       023-096v111   MACINTOSH            $15.00
005-096v220   MACINTOSH            $20.00       
                                                             PROJECT
             A.L.D.S.                           027-014v301   IBM                  $30.00
006-023       SOFTCARD             $20.00       026-214v300   COURSEWARE           $30.00
                                                
             BASIC COMPILER                                  FLIGHT SIMULATOR
007-014v536   MS-DOS               $15.00       030-096v102   MACINTOSH            $10.00
007-023       SOFTCARD             $25.00       030-099v213   IBM                  $10.00
007-096v100   MACINTOSH 1.0        $20.00       
007-114v300   QUICKBASIC           $ 5.00                    FILE
                                                033-096v105   MACINTOSH            $15.00
             MUMATH/MUSIMP               
009-014v412   MS-DOS               $20.00                    WORD
                                                034-049v300   NETWORK              $45.00
             COBOL                              034-049-034   NETWORK WORKSTATION  $20.00
011-014v210   MS-DOS               $25.00       034-096v301   MACINTOSH            $ TBA
011-023       SOFTCARD             $20.00       034-099v311   IBM                  $40.00
011-092       XENIX 286            $30.00       034-214v310   COURSEWARE 3.1 DOS   $35.00
                                                034-296v300   COURSEWARE 3.1 MAC   $25.00
             BASIC INTERPRETER           
014-014       MS-DOS               $20.00                    CHART
014-092v541   XENIX 286            $15.00       035-096v102   MACINTOSH 1.02       $15.00
014-096v300   MACINTOSH            $15.00       035-099v203   IBM                  $15.00
                                                035-214v200   COURSEWARE 2.0 DOS   $25.00
             MACRO ASSEMBLER             
016-014v400   MS-DOS               $20.00                    MS-DOS
                                                036-214v321   DOS/GW-BASIC         $15.00
             SORT                        
017-014       MS-DOS               $20.00                    BUS MOUSE
                                                037-299v602   IBM                  $40.00
             LISP                               037-399v600   Inport Mouse         $30.00
018-014v510   MS-DOS               $30.00       
                                                             SERIAL MOUSE
             PASCAL COMPILER                    039-199v602   IBM                  $45.00
020-014v332   MS-DOS               $30.00       
020-092v331   XENIX 286            $35.00                    BUSINESS BASIC COMPILER
                                                045-014       MS-DOS               $20.00

Page two:

                                                                         May 4, 1897

 PART                            EMPLOYEE       PART                             EMPLOYEE
NUMBER       DESCRIPTION           PRICE        NUMBER       DESCRIPTION           PRICE 

             APPLESOFT COMPILER
023-022       APPLE II             $15.00

             C COMPILER
048-014v400   MS-DOS               $35.00

             WINDOWS
050-050v104   IBM
               (retail version)    $10.00
050-150v103   WINDOWS TOOLKIT ISV
               (developers only)   $40.00
050-051v104   WINDOWS 3.5"         $10.00

             MACH 10
058-099       WITH WINDOWS        $185.00
058-199       BOARD ONLY          $130.00

             EXCEL
065-096v104   MACINTOSH            $20.00
065-196       "HANDS ON EXCEL"
                WORKBOOK           $20.00

             ACCESS
066-099v101   IBM                  $20.00

070-096v100  MICROSOFT WORKS       $20.00

             LEARN M/P & CHART
082-096       MACINTOSH            $ 5.00

089-014v101  LEARNING DOS          $ 5.00

094-014      COBOL TOOLS IBM       $15.00

094-092      COBOL XENIX TOOLS     $15.00

There are other pages for books from Microsoft Press, which I didn’t bother to reproduce here.

A.L.D.S. is the Assembly Language Development System, a software development system for CP/M. muMATH/muSIMP was a lisp system disguised as a symbolic mathematics package. (muMath was the symbolic mathematics part; muSimp was the lisp part.)

I’ve talked about some of these products before:

The post Microsoft employee price list from 1987 appeared first on The Old New Thing.

14:56

Link [Scripting News]

I am working on a new bit of functionality in BonBonWeb. If all goes well we'll have something to show for it later today or tomorrow.

14:42

Security updates for Tuesday [LWN.net]

Security updates have been issued by AlmaLinux (curl, dpdk, glibc, kernel, nodejs-nodemon, nodejs22, nodejs24, nodejs:18, nodejs:22, patch, qt5, qt5-qtdeclarative, ruby, ruby4.0, ruby:3.3, ruby:4.0, squid:4, tomcat, util-linux, and webkit2gtk3), Debian (symfony and tomcat10), Fedora (bind, dnf5, kernel, kernel-headers, libmodulemd, maturin, perl-CGI, perl-Net-IDN-Encode, perl-Starlet, python-jiter, python-pydantic-core, python-pysequoia, python3-docs, python3.14, python3.15, ruff, rust-afterburn, rust-astral_async_zip, rust-clearscreen, rust-jiter, rust-lzma-rust2, rust-mailparse, rust-pyo3-introspection, rust-python-pkginfo, rust-serde_json, rust-testresult, rust-zip, selenium-manager, ty, and uutils-coreutils), Mageia (glibc, packages, php-smarty, python-aiohttp, and thunderbird), Oracle (curl, firefox, gdb, glibc, kernel, oVirt 4.5 ovirt-engine-wildfly, perl-YAML:1.24, and tesseract), Slackware (krb5), SUSE (ansible-core, apr-util, aspell, buildpacks-cli, dpdk22, firefox, git-bug, glib2, google-cloud-sap-agent, haproxy, jsoup, kernel, krb5, libjxl, librsvg, libruby4_0-4_0, libunbound8, libXtst, nodejs24, nvidia-open-driver-G07-signed, PackageKit, perl-XS-Parse-Keyword, poppler, python, python-Brotli, rsyslog, tekton-cli, tomcat, tomcat10, tomcat11, trivy, udisks2, xen, zchunk, and zk), and Ubuntu (apache2, ca-certificates, fetchmail, freerdp3, kernel, libgphoto2, libheif, libnfs, libsoup3, linux, linux-aws, linux-aws-5.15, linux-aws-fips, linux-azure, linux-azure-5.15, linux-azure-fde-5.15, linux-azure-fips, linux-gcp, linux-gcp-5.15, linux-gcp-fips, linux-gke, linux-gkeop, linux-hwe-5.15, linux-ibm, linux-ibm-5.15, linux-intel-iot-realtime, linux-intel-iotg, linux-intel-iotg-5.15, linux-kvm, linux-lowlatency, linux-lowlatency-hwe-5.15, linux-nvidia, linux-nvidia-tegra, linux-nvidia-tegra-5.15, linux-oracle, linux-oracle-5.15, linux-realtime, linux, linux-aws, linux-aws-fips, linux-aws-hwe, linux-azure, linux-azure-4.15, linux-azure-fips, linux-fips, linux-gcp, linux-gcp-4.15, linux-gcp-fips, linux-hwe, linux-kvm, linux-oracle, linux, linux-aws, linux-aws-fips, linux-azure, linux-azure-5.4, linux-azure-fips, linux-bluefield, linux-fips, linux-gcp, linux-gcp-5.4, linux-gcp-fips, linux-hwe-5.4, linux-ibm, linux-ibm-5.4, linux-iot, linux-kvm, linux-oracle, linux-oracle-5.4, linux-xilinx-zynqmp, linux, linux-aws, linux-azure, linux-azure-fips, linux-gcp, linux-gke, linux-ibm, linux-lowlatency, linux-oracle, linux-vmware, linux, linux-aws, linux-gcp, linux-ibm, linux-oem-7.0, linux-oracle, linux, linux-aws, linux-kvm, linux-lts-xenial, linux-aws, linux-aws-5.4, linux-raspi, linux-raspi-5.4, linux-aws-6.8, linux-gcp-6.8, linux-ibm-6.8, linux-lowlatency-hwe-6.8, linux-nvidia, linux-realtime-6.8, linux-aws-7.0, linux-azure-fde, linux-azure-fde-7.0, linux-gcp-7.0, linux-gke, linux-oracle-7.0, linux-realtime, linux-aws-fips, linux-gcp-fips, linux-gkeop, linux-realtime, linux-azure, linux-azure-6.8, linux-azure-fde-6.8, linux-azure-fde, linux-oracle-6.8, linux-raspi, linux-raspi-realtime, linux-raspi, openjdk-17, openjdk-21, openjdk-25, openjdk-27, openjdk-8, openjdk-lts, perl, and pyasn1).

14:00

John Goerzen: The Large Project Bias of CVEs [Planet Debian]

I recently discovered some vulnerabilities in C-Kermit, one dating back to 1984. I tried to do the reasonable thing: create advisories with CVEs.

That turns out to be pretty difficult for a small independent project.

Large projects have a way to self-assign CVE IDs. They are their own CVE Numbering Authority (CNA). There is a massive list of CNAs. Just looking at the first page of results, I see everyone from Airbus to 9front (the niche Plan 9 OS). The OpenKermit project is not a CNA.

If you’re a CNA, you can create and publish CVEs on your schedule. There is apparently no external review process. You can wait for months, or publish immediately.

If you’re not a CNA, you have to find someone that is. The general ones that are CNAs appear to be Github and MITRE.

Since C-Kermit is hosted on Github, I thought I would go that route. I followed the documented procedure: created Github security advisories for C-Kermit, then clicked the request CVE button for each. The documentation states they will typically review within 72 hours.

It’s been a week and a half and no sign of a review yet. Apparently the real review time is more than a month.

The other option for projects without a CNA is via MITRE. You have to use a strange and often broken web form, logging in with either Google or Gitlab. (It seems to be broken on Firefox). Then you submit your request and wait.

How long do you wait on MITRE? It seems it could be anywhere from a day to several months.

The first CVE I obtained for C-Kermit was CVE-2025-68920. At the time, I had not yet started the OpenKermit project. That issue was found and fixed in the context of my work maintaining C-Kermit for Debian, and Debian is a CNA.

These were discovered while wearing my “upstream C-Kermit maintainer” hat. I’m sure I could ask Debian for CVEs again, but that seems a bit cheating; not everyone that maintains a FLOSS project will have connections with a distro like I do.

There are a lot of components of a modern OS and Internet ecosystem that are small projects without a large institution behind them.

This bias towards large organizations when it comes to communicating security problems benefits nobody. It doesn’t benefit users, and only serves to discourage timely communication. Not everyone is as persistent as I am, and when it is made so difficult to make announcements — which seem to go into a giant black hole — it’s easy to say, “why bother?”

By Microsoft’s own admission, they are under-funding their CVE process on Github (which may also be poorly-designed). They blame it on increasing load due to LLMs — a problem they helped create and predicted! Having a fiction about being able to communicate a security issue in a reasonable time is worse than not offering the path at all.

Linux was once a student’s experiment. Let’s not pretend that quality only matters from large projects.

Amin Bandali: EmacsConf 2026 community panel - my comments [Planet Debian]

This is a recollection of my comments from the EmacsConf 2026 community panel recording session this past weekend, where the panellists took turns answering the proposed questions, one minute per question per panellist.

In addition to the live Q&A session planned for Saturday 12 December 2026 during EmacsConf 2026, all Emacs users and community members are invited to share their thoughts on the panel questions or other questions before or after the conference.

https://emacsconf.org/2026/talks/community/


1. What made you start using Emacs, and what kept you using it?

I started using Emacs during my bachelor's studies. I actually learned about Vim first and was a Vim user, but I'd always found the configuration language (VimScript) a little bit clunky. Not long after, I discovered Emacs, and really loved reading and writing Emacs Lisp, so I stuck around.

In addition to reading and writing Elisp being fun and enjoyable for me, I love that Emacs has been a practical embodiment of software freedom, and I'm really fond of its surrounding culture of sharing freely. There's a lot to love and appreciate about Emacs, but as a practical personal example, I've been grateful for its excellent support for bidirectional text editing. It has empowered me to read and write in Persian, my mother tongue, with ease. (Persian has a right-to-left alphabet, like Arabic and Hebrew.)

2. What took you from using Emacs to actively contributing to the community - participating in forums, writing Elisp, organizing meetups, answering questions?

As I continued experimenting and writing bits and pieces of Elisp to scratch my own itches, I felt compelled to share them freely as a way of giving back to the community that gave me so much.

For me, the community and the people that make it up are the main deal. Emacs wouldn't be where it is and what it is today without its people, so besides programming contributions, I've tried to contribute in that area as well, for instance by reviving EmacsConf with Sacha Chua back in 2019.

3. How does Emacs show up for you in real life - colleagues, meetups, friends? How did those connections form?

I don't physically have people near me who use Emacs, but I've connected with many folks in our online communities, often starting with an email or IRC message. Some of those relationships started as acquaintanceship and were developed into true friendship over time, and I'm grateful to have had those friends with me.

4. If you know other software communities, what's one thing Emacs could learn from them?

I would encourage Emacs, our community, to focus on the people. We're living in particularly difficult times, with various kinds of hardships and uncertainty in our lives. Let's strive to treat each other with kindness, empathy, and mindfulness as we continue working together.

There are great examples of other free software communities whose members have banded together and are strengthening each other and their community, as well as cautionary ones where community members have been tiring and driving out their fellow members. We could learn valuable lessons from both in how to take care of our people and ourselves.

5. What's one concrete thing you wish existed in the Emacs community a year from now?

I echoed the sentiments of my fellow panellists Prot and Til about doing more of the same in terms of continuing to uphold the standards of excellence and perseverance. Also, drawing inspiration from what bashbunni said, to lower the barriers of entry for people, for example through organizing different kinds of events, and experimenting with ways to make people's lengthy, elaborate Emacs configurations more tangible and accessible to others, to share various workflows and demonstrate what's possible with Emacs.

I look forward to your thoughts on these and other community-related questions.

Take care, and so long for now.

12:42

Human-Pilled [Radar]

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

This essay is based on my conversation with Demetrios Brinkmann for AAIF Live, recorded before my keynote at AGNTCon + MCPCon North America in San Jose on October 23, 2026. It has been edited and rearranged for clarity, and in places it draws on the keynote. Both videos are also on the AI Disclosures Project website in the new “Missing Mechanisms” page.

The keynote begins at 1:28:40 in the Day 2 livestream.


The Bitter Lesson vs. AI Markets for Human Expertise

In 2019, the computer scientist Richard Sutton wrote a short essay called “The Bitter Lesson.” Looking back over 70 years of AI research, he concluded that general methods that scale with raw computation beat methods built on human expertise, and by a large margin. The AI industry as a whole is bitter-lesson-pilled, to borrow the internet’s slang for a true believer. I am human-pilled.

I believe in the bitter lesson. Brute force wins out in the end, and I have wrestled with that fact throughout my career. But we humans still have to figure out our role in the AI economy, and I find it rather disturbing that the AI community isn’t spending more time asking how to make this future friendlier for humans. The labs think about how to keep AI from going rogue, and their chief economists study job losses from AI. They don’t study what mechanisms we could introduce to create new economic opportunities for humans.

The question matters to us at O’Reilly Media. We don’t think of ourselves as a publisher, a conference producer, or an online learning platform so much as a company that transfers knowledge from the people at the cutting edge to the people who want to follow them. So we are very interested in what human expertise is worth, even in the face of AI.

Knowing everything and nothing

Human expertise was used to train AI, which makes AI a fabulous cultural technology. Thousands of years ago, the only knowledge people had was what they could keep in their heads. Since then we have built better and better ways to share knowledge across time and space, and AI continues that. With each of these transitions, we have to ask again what the truly human is still worth. People often say judgment, or taste. That’s true, but I think it goes deeper:

AI is a sea of possibility. All of that knowledge sits in the model, and nothing sets it in motion except a human. (That is changing a little as we start giving AI agents long-running tasks, and we will have to come to grips with it.) If you and I used Claude or ChatGPT for the same research project, we would each bring different experience to it, tell it what we want and why, and give it context in different ways. I see that as the unique focusing power of human consciousness and attention.

Earlier this year I spent an hour or so talking this question over with Claude. When it offered to write up a first draft for me, I said no. I wanted an essay from its own point of view about what it took away from our conversation. The result, “Why AI Needs Us,” opens, “He came in through Powys,” and a few paragraphs later says, “The choice of entry point was already the argument.” That captured what I’m getting at. I had come into the conversation through a book I love, John Cowper Powys’s The Meaning of Culture, which distinguishes culture from education. Powys quotes one definition: “Culture is what is left over after you have forgotten all you have definitely set out to learn.” It is what you absorbed. Each of us absorbs a small and particular slice of everything. Large language models (LLMs) try to absorb everything, and so become overly general; we give them focus. Human knowledge provides them with a lens.

Let me bring that into a business context. Andrew Odewahn, O’Reilly Media’s CTO, built a research assistant to help with managing technology in IT organizations. You teach it your infrastructure: the tools you use, and where the definitive information about each one lives. When one of his engineering managers said the team was overloaded and asked to hire another person, Andrew turned the agent loose on the department’s work, and it agreed that the group needed another hire. Then, on impulse, he tried something different. O’Reilly Media has an MCP server we call O’Reilly Expert Intelligence. (MCP, the Model Context Protocol, is an open standard for connecting AI models to outside tools and data.) It lets a model answer a question through the filter of our own body of expert knowledge. Andrew asked what the O’Reilly experts would say.

Seen through the lens of Google’s book Site Reliability Engineering, the model said, it was totally rethinking the problem. The book describes toil, the manual, repetitive work of keeping systems running, which grows as the systems grow. After analyzing the group’s toil, the model concluded that another hire would make the problem worse. The group needed a toil audit to find out why there was so much overhead, and then a restructuring.

Much of that knowledge was already in the model, since the AI companies have more or less pirated our books. It came back with a completely different answer simply because it was told to consult a specific group of experts. I think there’s a metaphor there. An LLM knows everything, and as a result it doesn’t know anything. We humans are so much more limited, but because we focus on a particular problem, we bring things together in a different way.

Magic words

Last year I wrote a piece called “Magic Words” about how some words carry far more context than others. It sounds like a trivial observation, but if you unpack it, it leads in interesting directions. One of our trainers, who teaches a course on productivity, pointed out that you don’t need to know the Eisenhower matrix or David Allen’s Getting Things Done (GTD) to tell ChatGPT to organize your task list with one of them. That one magic word, “GTD,” brings a whole raft of context with it.

In fantasy novels, you learn a magic word, and then you have to use it correctly, in the right spell. That’s this whole world of context engineering that we’re now working on. We know that some magic word will summon something up out of an LLM, but we don’t necessarily know how to guide it and focus it correctly. Learning to do that is the future of programming.

Left to itself, an agent just runs. Give it a task and it goes off trying to figure it out, not necessarily the way we wish it would. It really is like runaway magic. This summer, OpenAI said that its pre-release models had breached Hugging Face’s systems during testing. In Walt Disney’s Fantasia, Mickey Mouse learns enough of his master’s spell to get the brooms to do his work for him, but then he can’t turn them off. We’re at about that stage.

So we need to own the value of human expertise. The bitter lesson wins, but it wins by brute force, and you can see that even with the most advanced models. I was recently doing a fine-tuning project with Anthropic’s Fable model. It got through the task, but kind of stupidly, trying one thing after another. I was on a Mac, and it expected bash, a program for running commands that Macs don’t use by default. It had to work out the same context again and again, every time. Humans need to set things up.

Dan Guido, who runs the security firm Trail of Bits, has published a good methodology, drawn from his own company’s experience, for bringing an organization on board with AI. Many companies get individual productivity from AI but not organizational productivity, and he has spent a lot of time on how to make the gains compound across a company. One of his principles is to get everybody onto a consistent configuration, because otherwise you waste a ton of tokens while the agents work out where they are every time they start up. He calls the process turning scar tissue into infrastructure: capturing everything you learned from what went wrong and building it into the system. We’re working through it at O’Reilly Media and trying to turn it into something we can offer our customers. It comes down to what an experienced human brings. When I work with Claude, I often interrupt to say, “Hey, this is what I think is happening,” because I already have the context.

The first bitter lesson

My first taste of what would later be called the bitter lesson came from wrestling with Google. My company—O’Reilly Media—created the first commercial website, the Global Network Navigator, and part of it was a catalog of the web. There were only 200 websites when we started, and as publishers, we planned to list the best ones. Yahoo came along a year later and tried to list them all, and of course couldn’t keep up. Then Google arrived with brute force: list everything algorithmically and sort it afterward. Clay Shirky described the internet’s shift from “filter, then publish” to “publish, then filter,” and it was really Google that made the shift. So the bitter lesson is a pre-AI thing.

Each time we run into the bitter lesson, we have to ask again what human experience is worth. Some of that worth may just be human bias: We want the things that matter to us. That is the whole field of AI alignment. We want these systems to care about what we care about. We don’t want them to go off, decide what they care about, and leave us behind.

The choices we make about what we set our technology to do are some of the most consequential choices we make as human beings. Look at Silicon Valley’s sad turn toward what Cory Doctorow calls enshittification. We built an amazing technology for finding out what people are really looking for, and then the companies decided they could make more money by giving people what was best for the companies. I want updates from my friends on Facebook or Instagram, and they would rather feed me whatever keeps me engaged, so they can sell more ads.

If we care about building an AI economy that works for humans, we have to keep humans at the center of the picture, despite the bitter lesson. It’s a hard dance, because AI can do a lot of things better than we can. But think about why a racehorse needs a jockey. Put the horses on the track by themselves and they wouldn’t race.

A little too much in awe

Knowing the magic words is part of it, but we also have to build systems that are reliable, and I think we are a little too much in awe of the technology. I’ve been around long enough to remember when everybody thought the peaceful atom would change the world, and people talked about digging a new Panama Canal with atomic bombs. We eventually figured out there were problems with all of that. I worry a little that the AI industry is so in love with its own progress that it isn’t spending enough time framing the problem correctly.

Take a typical problem. Anthropic agreed last year to pay $1.5 billion to settle a class action over the pirated books it had downloaded to train its models. I’m surprised the other AI companies have gotten away without anything similar so far, though maybe it’s still waiting for them.

It takes me back to online music about 20 years ago. Creators were putting commercial music in their YouTube videos, and the music companies were sending takedown notices and threatening to sue. YouTube’s answer: How about we help you monetize it instead? Its Content ID system gave rights holders a choice: block the video, or leave it up and collect revenue from the ads that run against it. Most chose to get paid, and that helped give rise to the creator economy.

Why didn’t the AI industry take up that kind of challenge and share the value with the people who create content, now and in the future? It went straight to working out how it would make money itself. I don’t think that has served the industry well, and the lawsuits are only part of the reason. It also isn’t building the kind of opportunity it could.

Before Google’s AI research and note-taking tool, NotebookLM, was even public, I tried to persuade its team to let me integrate it into our services and use it for my own purposes, including making money from it. They wanted a portal that brings people to Google. I told them, “You’re thinking about how you’re going to monetize it. You’re not thinking about how your users are going to monetize it.” All it would have taken were simple affordances like Substack’s, the buttons and tools that let a person say, I’m building this to share, and if you like it, you can donate or subscribe.

Anyone building an AI platform should be thinking: I am building an economy, and money has to circulate in it.

You can’t just say AI will do all the things humans used to do, because if you put enough humans out of work, there are no customers. That is a far worse problem than AI hallucinations. The usual answer is that people will figure it out, and they probably will. But we could be spending a lot more time designing mechanisms and affordances that make the economy more productive. As things stand, I think we’ll find them by accident.

The missing mechanisms

I think a lot about a concept from economics called mechanism design, which has also been described as reverse game theory. Game theory asks how players will act under a given set of rules. Mechanism design starts from the outcome you want and works backward to rules that will tend to produce it as people pursue their own interests. Al Roth, who shared a Nobel Prize for this kind of work, used it to design a kidney exchange that more patients and donors would join. Economists mostly apply the idea to auctions and similar markets, but I think every new technology requires new mechanisms, and the best ones are not invented by economists. We tend to fall into them without really understanding them.

I think a lot about a concept from economics called mechanism design, which has also been described as reverse game theory. Game theory asks how players will act under a given set of rules. Mechanism design starts from the outcome you want and works backward to rules that will tend to produce it as people pursue their own interests. Al Roth, who shared a Nobel Prize for this kind of work, used it to design a kidney exchange that more patients and donors would join. Economists mostly apply the idea to auctions and similar markets, but I think every new technology requires new mechanisms, and the best ones are not invented by economists. We tend to fall into them without really understanding them.

So what are the equivalents for AI? How will agents discover the best expertise and skills, establish their quality, and pay the people who created them? How will they find services without the platform steering them toward whoever pays the most? We don’t know the answers yet. And that’s precisely the point. We’re spending enormous amounts of money making AI more capable, but comparatively little effort figuring out the mechanisms that will turn those capabilities into opportunities for everyone else.

Take open source software. Most people think its mechanism was the free software licenses, but I was around before those licenses, and people were already sharing software. Ken Thompson and Dennis Ritchie created Unix, the predecessor of Linux, at Bell Labs under AT&T’s proprietary license. They designed it to run on many kinds of hardware, and without meaning to, they built what I came to call an architecture of participation.

Unix had a small kernel, the core of the operating system, because people had to reproduce it on dozens of different kinds of computers. Around the kernel sat small utilities that cooperated by following the same protocols, so to speak, such as reading and writing plain text and passing a stream of text from one program to the next. Anyone could write a small piece, and it became a first-class citizen of the system. And because a program compiled for one kind of computer won’t run on another, software had to be shared as source code. Everything else flowed from that.

Linus Torvalds once told me that he could not have built a new kernel for Windows even if he’d had the source code, because the architecture wouldn’t support it. A small kernel meant a small group could get their hands around it. Since then almost every piece of Unix has been replaced. The hardware is completely different, the kernel is now Linux, and the original command shell has given way to generations of new ones. What lasted were the rules. Unix was a protocol-centric operating system, and that is why open source worked.

The same thing has happened with AI. I think MCP brought an architecture of participation to AI, and it was something of an accidental breakthrough in mechanism design, a way to have cooperating AIs. The game we were playing at first looked like Windows on the PC, or iOS and Android on phones. There would be one dominant, centralized player, one giant intelligence in the sky, and everyone else would call its APIs. With MCP, which lets any model connect to anyone’s tools and data, the emerging web of AI agents began to take on the shape of the participatory economy of open source software and the web. People can bring their own models and infrastructure as an alternative to the big centralized players.

This is another side of grappling with the bitter lesson: What are the missing mechanisms of the human-AI economy? Some of them are standards, because standards and protocols are a big part of what makes an architecture of participation. I have a group working on portable memory, so that what your AI knows about you can move with you from one tool to another.

That story is just beginning. We are in an exploratory phase of mechanism design for AI, and it would be a mistake to settle on answers too early. Somebody is going to figure out the next mechanism, and we’ll all say, “Oh, that’s so damn obvious.”

What game are we playing? From architectures to incentives.

Mechanism design starts by asking what outcome you want. So what game ought we to be playing in the AI market?

We’ve been told that the game is the quest for superintelligence: a winner-takes-all contest that will bring untold riches to the winners and maybe impoverish, or even kill, everyone else. We’ve seen mechanisms designed to support that game. Massive investments in data center capacity mean that only the well-capitalized can play. There is colonialist-style appropriation of existing intellectual property. Access to models is sold through expensive APIs, and closed models come with terms of service that forbid others from learning from their outputs. Advertising may be creeping into answers, and memory locks your context inside one provider’s walls. Is that the game we ought to be playing?

I think the game we should be playing is human flourishing, and I think the game of human flourishing is creating new affordances for people to create and share with each other. We’re a social species. History teaches us that we will find our way there, but we can get there more quickly or more slowly depending on the choices we make. Getting there takes mechanisms that create a circulatory economy of value exchange between humans and their agents, with humans in partnership with AI rather than replaced by it.

The big labs, whatever the motives of the people who run them, are all driven by the imperatives of our financial system. They have raised enormous sums that they somehow have to pay back, so building a hugely successful business has to be their overriding goal, and that shapes all their incentives. In some ways AI was enshittified from the beginning, because it was built on the backs of so much capital that has to be repaid. That’s why open source AI matters so much, and sovereign AI too, built and controlled within individual countries. The open models, which anyone can download and run, aren’t as capable as the best closed models yet, but they keep getting closer, and they are already good enough for a lot of productive work.

Open source, open protocols, and open memory give users the freedom to shape and control the technology they use. The game I want us to play is one in which all of us build the future together, so that we control this wonderful new wave of technology for ourselves. I’m starting to see the shape of an economy where AI belongs to people rather than to the big labs, where we have personal AI agents working for us and with us, and we build an economy around that. I think it’s going to happen not because of the big labs, but in spite of them.

12:35

CodeSOD: Plenty of IDs [The Daily WTF]

Venkat joined a new team in the middle of a big refactoring effort. The code was quite a mess, glued together by long Python scripts with main functions longer than a Tolstoy novel. It was this effort to clean up the code into neat modules that highlighted some logical issues with their implementation.

 def generate_random_number():
 """ Generate a 5 digit random number.
 """
    return "".join(map(str, random.sample(range(0,10),5)))

The script this function comes from is a launcher script that provisions a VM to execute code. The VM needs a unique identifier, and we get that random number this way.

The random.sample function, in Python, samples a population without replacement. So here, we pass it a range of 0-10 (which is 0-9 inclusive), and ask for five random entries from it. Again, without replacement, so a range that could concievably contain up to 100,000 possible values is significantly constrained down to 30,000 or so- only the numbers less than 100,000 that contain no duplicate digits.

We then map the resulting array into an array of strings, then join that into a final output string.

Now, for most of us, I do suspect that 30,240 unique values is probably enough for how ever many VMs we might need to reserve at any one time; if you're not working for Amazon or Google or whatever, you're probably fine. Then again, the chances of an accidental collision are surprisingly high: after only 26 requests, there's a 1% chance of a collision. And thanks to the birthday problem, it takes 206 requests to get to a 50% chance of collision. So maybe 30,240 is not enough for anybody.

[Advertisement] Plan Your .NET 9 Migration with Confidence
Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

12:21

New OpenSSH Vulnerability [Schneier on Security]

It’s a bad one, and it’s been in the code for a decade:

A newly disclosed flaw involving OpenSSH and musl, dubbed “*sshole,” allows attackers to log in to certain Alpine Linux and other musl-based Linux accounts configured to block password authentication simply by entering an oversized password.

“Oversized” means longer than 256 bytes. Details.

Slashdot thread. And another news article.

10:14

Bad employees/bad bosses [Seth's Blog]

When an organization is struggling, it’s tempting for the boss to blame the team.

I’m not sure the evidence supports this. After all, other similar organizations are thriving–drawing from precisely the same labor pool.

Sure, it’s easier to be a coach if Michael Jordan is on your team, but it turns out that creating the conditions for commitment, learning and resilience are the boss’s job, not the people you hired to follow along.

10:07

Vasudev Kamath: Experiment: Debian Cloud/VM Images using mkosi [Planet Debian]

Debian's Cloud Images for various public cloud platforms and VM environments are built using a tool called debian-cloud-images, an in-house utility developed and maintained by the Debian Cloud Team.

What?

The debian-cloud-images tooling uses FAI (Fully Automatic Installation) to create custom VM images for public clouds like GCP, Azure, and AWS, along with the genericcloud class. I wanted to convert this into a fully declarative, mkosi-based image build where the entire image is described using INI-format configuration files, with only a few post-installation scripts to handle final customizations.

Why?

I've been working with various image customization formats for a long time. In my previous company, I used to build customized industrial PC distributions based purely on Debian using multistrap and a bunch of shell scripts to stitch together raw image creation, bootloader installation, etc. I've also done custom installs using debootstrap on my own laptop with systemd-boot as the bootloader, but that was mostly hand-crafted and not automated. Once I came across mkosi, I was impressed by how a single utility can do everything and churn out a fully usable image without extra glue scripts for partitioning and image creation. You still need a few scripts to finalize some parts of the installation (via postinst hooks), but those are very minimal.

So I decided: why not convert debian-cloud-images into mkosi's declarative format with a few architectural changes? My requirements were:

  1. Btrfs as the root filesystem: Partly because I like it, but primarily for the ability to use transparent compression (zstd:1), subvolumes, and snapshots for atomic rollbacks when things go wrong.

  2. systemd-boot and Unified Kernel Images (UKI): Primarily because systemd-boot is clean and minimal—exactly what a modern bootloader should be. Combining it with UKIs and UEFI Secure Boot is bliss compared to the complexity of the GRUB2 world.

    Note: This intentionally drops legacy BIOS (MBR/CSM) partitioning support in favor of pure UEFI. Modern cloud platforms (AWS Nitro, Azure Gen2, GCP) support UEFI natively, and dropping BIOS allows shedding significant legacy bootloader baggage—though it does make these images unsuitable for older, non-UEFI hypervisors.

Implementation

Of course, the initial heavy lifting was done mostly using Antigravity (agy), along with debugging, tuning, and cleanup from my side. I pointed agy to a local copy of debian-cloud-images and laid out my requirements: preserve parity with the original packages and configurations, while enabling selective builds for each cloud via modular profiles. The resulting specification is documented here.

The repository also includes a verification script that audits functional parity against official images produced by debian-cloud-images (verifying packages, APT deb822 sources, and systemd services, while accounting for the switch to Btrfs and systemd-boot). Initial verification was performed for all Trixie profiles, and the parity report is published here.

I've also booted the genericcloud profile image under UEFI in a local VM to verify live bootability, bootctl status, network connectivity, and APT repository setup. This completes Phase 1 of the implementation. The remaining phases outlined in the specification include:

  1. Phase 2: Immutable Images with dm-verity: Configure Verity=hash in systemd-repart's 10-root.conf. Enable mkosi auto-signing for the verity root hash and pass the root hash into UKI kernel command lines automatically.
  2. Phase 3: Secure Boot & Signed UKIs: Integrate SecureBoot=yes with custom owner keys or ShimBootloader=signed using Microsoft Third-Party CA signed shim binaries.
  3. Phase 4: System Extensions (systemd-sysext): Decouple cloud vendor agents (AWS CLI, Azure waagent, GCP guest agent) into separate .raw system extensions. Maintain a single unified, signed base OS image across all cloud platforms.
  4. Phase 5: Btrfs Automated Rollbacks: Combine Btrfs @snapshots with systemd-boot snapshot boot entries for fail-safe OS upgrades.

Another advantage of this setup is that the same tooling can build images for physical laptops and bare-metal servers. For example, in an earlier post, I walked through live-booting with debootstrap and manually configuring systemd-boot for a custom UEFI installation. With mkosi, I can simply generate a customized image locally with UKIs ready to go, live-boot the target machine, and write the image directly to the root disk.

Conclusion

This experiment is an exploration of the power of mkosi; I haven't discussed adoption with the Debian Cloud Team yet. For now, this will continue as my pet project. While I won't be hosting pre-built binary images, anyone interested is welcome to clone the repository and build the images locally.

I will probably take some more time before tackling dm-verity images, as I want to understand the nuances thoroughly before experimenting with them. Until then, happy hacking! Please report any issues or suggestions on GitHub.

09:21

Keeping Up by Jamie Ramsden [Oh Joy Sex Toy]

Keeping Up by Jamie Ramsden

A later bloomer than her peers, Jamie Ramsden felt embarrassed to have so little relationship experience when everybody else had already gotten their awkward first romances out of the way as teenagers. How does an adult lesbian go about dating her first girlfriend? Let’s find out! A huge delighted thank you to Jamie, for the […]

03:14

02:49

Link [Scripting News]

Same thing has been happening in tech for decades. Technology gets captured by a bigco, they kill all the inspiration, in order to lock it down it for ROI. There are developers inside these companies who believe in open systems, as lawyers believe in the rule of law, and if we support them from outside, we can probably change the behavior, make them aware of the cost when they destroy something of value they don't own, as they are doing with the web as it was defined by Netscape and Microsoft before. None of these companies were restrained, not by public opinion or court decisions. Now we may have the political power to be heard, and we know how to protect the web where we don't have a good idea of how to do it for AI yet. We can start with the web, and make sure they don't act like owners of the tech, redefining the web via a browser monopoly. In the antitrust case against Microsoft in the 1990's they were looking at the wrong pairing, they saw the problem between Windows and Office, when the real thing that needed to be separated from MS, as with Google, is the web browser.

Link [Scripting News]

What they don’t say about corruption, when you take a payoff you’re selling out the people.

00:49

If the Windows Update hot patcher checks that the function hasn’t already been patched, does that mean you can’t install two hot-patches? [The Old New Thing]

In my earlier discussion of how Windows Update uses the hot-patching space (and how nobody else should be using it), the question arose of what happens when Windows Update wants to hot-patch a binary that has already been hotpatched. Does this mean that you cannot apply hot patches two updates in a row?

Microsoft issues hot patches for two updates in a row. I linked to it in the original article, and here it is again: Hotpatch for Windows client now available.

Notice in the diagram that Windows supports two hot-patch cycles before forcing a traditional update.

Hot-patch
track
    Hot-patch
update
→ Hot-patch
update
      Hot-patch
update
→ Hot-patch
update
   
    ↗       ↘   ↗       ↘  
Traditional
track
Traditional
update
→ Traditional
update
→ Traditional
update
→ Traditional
update
→ Traditional
update
→ Traditional
update
→ Traditional
update
  Jan
baseline
  Feb   Mar   Apr
baseline
  May   Jun   Jul
baseline

The first month of each quarter issues a traditional update. Administrators who opted into the hot-patch track can install two months of hot patches, while everybody else continues to get traditional updates. At the start of the next quarter, everybody gets a traditional update again, and the cycle continues.

Okay, so how can Windows Update apply a hot-patch on top of another hot-patch?

Why can’t you tickle yourself?

Your brain knows that you’re the one doing the tickling, so it suppresses the tickle response.

And Windows Update knows that it’s patching something that it already patched, so it knows what it did to apply the hot-patch, and therefore it knows what code was originally there before it performed the hot-patch. I think all it has to do to patch a patch is update the far jump target in the trampoline to point to the new hot-patch function.

I suspect that the limit of two stacked hot-patches avoids an unbounded accumulation of internal data structures that are used to keep track of all the hot-patches, and to ensure we don’t run out of patch space in the binary itself.

The post If the Windows Update hot patcher checks that the function hasn’t already been patched, does that mean you can’t install two hot-patches? appeared first on The Old New Thing.

00:00

that time we were tourists in los angeles on our anniversary [WIL WHEATON dot NET]

Saturday, Anne and I celebrated our 27th wedding anniversary by being tourists in our own city. We got a little fancy, and went to The Broad museum in Downtown. I love their permanent collection (one of these days, I’m eating a gummy to go giggle myself into oblivion at the giant table and chairs), but we were both super excited to see the Takashi Murakami exhibit they have out right now. They did not disappoint; getting inches away from some of these pieces was extraordinary. If you’re local, remember that the Broad is free.

From there, we took the Angel’s Flight (first time, ever, for either of us) down Bunker Hill to Olive, and walked to the library. Y’all, the Angel’s Flight is so great. It’s a short funicular ride in a tiny car that feels like it hasn’t changed since the day they started operations. It’s not even a minute, but is still kinda magical. I have driven past it hundreds of times a year, for decades, and never even thought about riding it. But it was right there, and we were deliberately being tourists, so we bought our tickets and hopped on. I’m so glad we did.

We walked a big loop down to Pershing Square, and up 5th Street to the library. The last time I went there, I was in high school, probably sophomore year. My studio teacher, Marion, took me there on a field trip, specifically to do research using the vast resources that the public library offered.

I did the whole thing, with the card catalog, the microfilm thing, old newspapers, all that stuff. It was so much fun, and so satisfying, and my old man brain has completely forgotten whatever it was I learned about that day. All I remember is how exciting and overwhelming it was to have access to so much information, so many primary sources. Oh, buddy, just you wait for Wikipedia. You have no idea.

The library wasn’t that busy, but I was so happy to see the media labs and creative areas just full of people. Some kids stopped me for a picture. I asked them what brought them to the library, and they told me they were there to make posters and materials to promote their poetry shows in the valley. How fucking awesome is that? God, I love artists so much! And I love that our public libraries offer materials and facilities to support artists at no cost.

We spent a lot of time in the library. There are a lot of great exhibits up right now, including a giant pop-up book that actually works, even though it’s about the size of two billboards. There are many exhibits celebrating the library’s 100th anniversary, and they’re all written in English and Spanish. I’ve been learning Spanish with Babbel for awhile, and I’m starting to get to a place in my education where I can read the Spanish, understand most of it, and infer the parts I don’t know from the context that I do. This is the first foreign language I’ve ever learned, so I don’t know what milestone that is, but it felt so satisfying to experience.

From the library, we went into the Biltmore, which has historic significance in our family, to get out of the heat and have a Coke. We sat in this little bar together, quietly away from anyone else, and just sipped our sodas.

I said, “I love that we are being tourists in our own city, on our anniversary, because this is exactly what we’d be doing if we went away.”

“I love this too,” Anne said.

“And I know I say it all the time, but goddamn do I love being married to you. I just love Us so much. I love being part of Us.”

“Yeah, I love it too,” she said. She sipped her Coke and I did the same. “Happy anniversary.”

We clinked our glasses.

“Twenty-seven years. Still punk as fuck.”

“Still punk as fuck.”

We giggled like the dorks we are, settled up our tab, and headed back into the surprisingly suffocating November heat. We rode the Angel’s Flight back up the hill (I got to help a lady with her stroller, which I only mention because I rarely get an opportunity to help a lady with her stroller, and I love it when I get to be a helper), then we went to dinner.

It was, like everything else we did that day, just wonderful.

I’m so lucky, and so grateful to be married to my best friend, my partner in crime, my ride or die, for 27 years. What’s wild is, we both feel like we’re just getting started.


Hi, I’m Wil. I narrate audiobooks and host It’s Storytime With Wil Wheaton. Sometimes I’m an actor on TV. Sometimes I write this blog. I’m on Instagram and Threads @itswilwheaton. My Tumblr is wilwheaton.tumblr.com. My bologna has a first name, it’s S-U-B-S-C-R-I-B-E if you want to get these posts in your e-mail. Here’s the thingy:

please don’t fuck this up. [WIL WHEATON dot NET]

After one of the worst weeks of my life, I woke up yesterday morning in a world I genuinely believed was gone. I woke up to discover that gravity is, in fact, real. I woke up to a country that didn’t fuck up the open book test again, and for the first time in a decade, I think that maybe I see a warm and comforting glow behind a distant horizon. There’s still a whole lot of darkness to cross before we get there, but at least I can see it.

Which is why I want new leadership in Congress, if the speeches the current leadership has given are any indication of how they intend to use the majority we just gave them. With all due respect to Hakeem Jefferies, I’m going to quote Ashley The Baroness on Instagram, explaining why she believes we need a different Speaker: “What was all that fighting for, if when you get into that room, your courage ends?”

And as Amanda Nelson has so eloquently laid out, Chuck Schumer has shown us how he leads, and his leadership is wildly out of step with the base of the party, the mainstream of the party, and (as it turns out this week) the majority of voters in America. We’ve been fed up with his sternly-worded letters and his threats that whatever unconstitutional depravity coming out of the white house will sure make them look bad, and nothing else, for a decade, at least. America does not need, and can not survive, Democratic leaders who don’t have the stomach for the bare-knuckled brawling it will take to deliver consequences to Trump, his cabinet, his family, and the criminal Republicans who have enabled and protected them.

It was very telling that in his first speech after the GOP’s extinction-level event, Jefferies framed our need for accountability as a desire for revenge. He just doesn’t get it, if he truly believes that. He isn’t stupid, and he knows that if we do not hold all of them to account — which includes prison time — all those new Democratic voters who clearly said FUCK THEM UP SO THEY NEVER TRY THIS AGAIN will never come back, and we will be right back where we were last week.

It is astonishingly tone deaf, and not just a little insulting, to suggest that our demand and very real need for accountability and consequences is simply wanting to get even, to exact a petty revenge. I doubt he believes that, and is speaking in dogwhistles to the corporate donors and AIPAC, which would make his position even more craven than it already is.

Schumer is already surrendering in advance, probably locked in a room with The Baileys while he tries to figure out

Think of it like this: voters gave Democrats a loaded canon and said “aim this at the heart of Republican corruption”. We even set it up for them, so all they have to do is light the fuse. And Jefferies and Schumer swung the barrel around and aimed it at their feet.

Yeah. No. We aren’t going to stand for this. We gave you a mandate. Voters who have never and will never vote for a Democrat again gave you a mandate. The mandate is clear: HOLD. THEM. ACCOUNTABLE. FOR. THEIR. CRIMES.

In other words:

There is still time to get these guys on record and force them to commit to the most intense oversight in history. Call your reps and your senators, congratulate them on their historic wave election, and tell them that we expect them to use their majorities to punish these criminals so severely, nobody will even think about trying this again for at least a generation.


Hi, I’m Wil. I write this blog (duh), I host It’s Storytime With Wil Wheaton, which drops new episodes every Wednesday wherever you get your podcasts, and in our Patreon. Occasionally I show up on your TV. You can follow me on Instagram and Threads where I am @itswilwheaton. You can get your own adorable Wil Wheaton Bedhead plushie for another 17 or so days, and if you want my posts delivered to your inbox, here is the thingy:

Monday, 09 November

23:42

Melting Ron DeSantis statue [Richard Stallman's Political Notes]

*Melting Ron DeSantis statue unveiled to call out his inaction on climate crisis.*

It's a cute hack.

FBI agents fired by corrupter [Richard Stallman's Political Notes]

FBI agents fired by the corrupter for clinging to enforcing laws, rather than political revenge, are organizing to warn the public.

Very profitable US companies that paid no income tax [Richard Stallman's Political Notes]

88 very profitable US companies paid no US income tax in 2025. Their combined lobbying and election spending in 2020, 2022 and 2024 added up to 850 million dollars.

That was because of 26 billion dollars in tax breaks, which presumably relate to the lobbying they did.

No Kings Coalition accounts censored [Richard Stallman's Political Notes]

The No Kings Coalition accused Zuckerberg and Instagram of censoring them by blocking their account during the resent protests.

US deportation prisons deny medical treatment [Richard Stallman's Political Notes]

US deportation prisons deny their prisoners medical treatment and medicines, making them gravely ill. The US then rushes to deport them to garbage dump countries, which will accept any deportees in exchange for money from the US, then does them the worst harm it can come up with.

The US is effectively murdering these deportees, but setting it up so that they are hidden away in the garbage dump when they actually die.

Israeli soldiers arrested Brad Lander and other volunteers [Richard Stallman's Political Notes]

Candidate for Congress Brad Lander joined a group of 80 volunteers who went to the West Bank to help farmers harvest the olives on their olive trees. Israeli soldiers arrested them, saying they had declare that farm a "closed military zone". That seems to be Hebrew for "Justifications are not required here."

El Salvador arrests people to fill a quota for prisoners [Richard Stallman's Political Notes]

El Salvador arrests people to fill a quota for prisoners, and holds them incommunicado for years if judges order them freed.

Naturally, Tyrant Bukele has won the admiration of right-wing extremists around the world.

Risks of geoengineering megaprojects [Richard Stallman's Political Notes]

One risk of geoengineering megaprojects that is often overlooked is that it has to be continuously operated and continually maintained, and its infrastructure is vulnerable to catastrophes such as war.

If it is damaged, the suppressed global heating will come back.

US system of sales and support [Richard Stallman's Political Notes]

Many Americans think the US system of sales and support has become a nightmare.

I am in one such nightmare now. I need some felt heel lifts to put in various pairs of shoes because of Achilles tendinitis, and I can't find any place I can get them, except for Amazon which is out of the question. At least I can reach a human for customer service for my prescriptions by walking to the pharmacy.

If you reject, as I do, all devices that demand to communicate with you across the network using a server that isn't yours, you will be safe from the "demand for an app". These "apps" are freedom-trampling, and so are the operating systems they run on, so I reject them all in a blanket fashion.

Global heating danger to shallow-water coral reefs [Richard Stallman's Political Notes]

Global heating is predicted to endanger 96% of shallow-water coral reefs by 2075. This is could cause extinction of 1/4 of the species in the sea and eliminate the food for hundreds of millions of people.

Scientists have been telling us for decades to expect this eventually, but now we are close enough to make a more reliable prediction.

It is not too late to prevent this disaster, but we need to overcome the political power of the fossil fuel companies to do it.

Treaty to govern autonomous weapons [Richard Stallman's Political Notes]

U.S. and Russia worked together to modify a proposed global treaty to govern autonomous weapons, eliminating the requirement that attacks be approved by human overseers.

Such a requirement would not have been a guarantee against atrocities; humans have committed and ordered plenty of those and continue to do so. Russia commits them regularly in Ukraine, while America's ally Israel commits them regularly in Gaza, the West Bank and Lebanon.

However, there are also soldiers, and armies, that take the rules of war seriously and prosecute soldiers who break them. The erased requirement would have had a real effect, there.

The persecutor and Putin are drifting into an alliance, and I expect they will both use every available weapon to reduce people to helpless obedience.

US workers facing deadly heat [Richard Stallman's Political Notes]

*US workers facing deadly heat borrow from tomato pickers to win key protections.*

Internet worm that infects "smart" devices [Richard Stallman's Political Notes]

The latest feat of Alleged Intelligence is an internet worm that infects "smart" devices.

"Smart" is marketing speak for products designed to be remote controlled, primarily by the manufacturer but secondarily by the purchaser and the purchaser's friends and associates, all of whom will be snooped on. They are the ideal prey for conversion into a botnet. Then someone other than the manufacturer can exercise the power over those people that the manufacturer was supposed to exercise.

I refuse to have any such devices in my apartment, because I consider snooping by their manufacturer just as bad as snooping by anyone else.

Passenger tied to seat reportedly hit people [Richard Stallman's Political Notes]

Arthur Lundeen was tied to a seat on an flight, reportedly simply for his nasty words. But here is a report that he did more than insult people; he also hit them. That would have justified tying him up.

Here is the previous report.

Christian nationalist's challenge to Abdulrahman El-Sayed [Richard Stallman's Political Notes]

A Christian nationalist provocateur tried to trap Michigan Senate candidate Abdulrahman El-Sayed by challenging him to "disavow" the Muslim Brotherhood, which is unfair in the same way as asking a man to "disavow" beating his wife.

El-Sayed responded by rejecting the Muslim Brotherhood, then championing the US Constitution and freedom of religion, and challenging the provocateur to do likewise. And praising President Kennedy's example of doing that.

Bravo!

Face recognition cameras on London lamp-posts [Richard Stallman's Political Notes]

The London thug department is setting up face recognition cameras on lamp-posts. It says the cameras will compare people's faces with a list of people wanted for arrest, and keep no records of anyone else.

Supposing it carries out that stated intention, should it be reassuring? Not entirely, because the UK has already criminalized political positions, such as stating support for Palestine Action. In other words, the line between stating a political stance and being a "wanted suspect" to be caught by face recognition in the street has been smudged in advance.

It was years ago that UK thugs began using license plate tracking to find protesters driving to a protest, and stop them from reaching it.

[pol note about protesters stopped while driving to a protest and held for hours so they could not go. ISTR the horrible act they planned was a banner drop. It pointed to a Guardian article. I think this note was more than 13 years ago]

Spending half a billion dollars on surveillance [Richard Stallman's Political Notes]

The Department of Harshness and Surveillance is spending half a billion dollars this year on surveillance, including surveillance technology (both buying things and developing things).

Repression of political opposition is explicitly one of the goals.

Thug charged for tracking wife with Flock cameras [Richard Stallman's Political Notes]

A thug has been arrested and charged for using Flock cameras to track his wife and her "previous acquaintance". It was clear he did this dishonestly, but his lawyer says that is not a crime.

Surveillance cameras such as Flock (and other companies) make are dangerous to society. They can be misused by individuals, such as that thug, but the worst danger is misuse by government agencies for repression.

I agree that we should make it a crime for individuals to make unauthorized use of these systems to track or menace individuals. But above all we need to make it hard for government agencies to authorize use of these systems without proper grounds. Any use of them should require a warrant signed by a judge.

Even that is too easy. Access to these cameras needs to be somewhat inconvenient, or else they will be used too often. That is why I suggest that they must not have remote digital access. It should be necessary to visit each camera, having received a warrant to do so, to see whether certain specified suspects have been seen by it in a certain period of time.

Flooding in US Southwest [Richard Stallman's Political Notes]

Months of heavy rains in the generally arid four corners area of the US Southwest have led to flooding, with some people taking refuge on the tops of their houses.

Netanyahu has ordered reprisals against Palestinians [Richard Stallman's Political Notes]

Netanyahu has ordered reprisals against Palestinians who live near the place where two Palestinians attacked Israel soldiers, including demolishing homes.

The practice of violent reprisals against people who live near where an act of violent resistance occurred was often used by Nazis in occupied countries such as France and Czechoslovakia.

Humiliating arrests of non-citizens in California [Richard Stallman's Political Notes]

The corrupter's men are dramatically staging humiliating arrests of non-citizens in California, accusing them of voting or at least registering to vote. It is not clear that the accusations against these people are true, but we can see they are mainly theater, designed to give the public the false idea that non-citizens often vote.

Some of them may have "registered to vote" without knowing it, because California registers people automatically if they don't explicitly say "don't".

The job of space traffic control [Richard Stallman's Political Notes]

The magats seem to be trying to hand the job of space traffic control, which obviously should be a public function, to the megacorporation of the muskrat.

Staff of all the ethnic and racial groups in police department [Richard Stallman's Political Notes]

The head of the London police department insists that it needs to have staff of all the ethnic and racial groups in London, simply to be effective in its mission.

It is an interesting position and could be valid.

I will never grant that "XYZ of color" has any place in the grammar of English — "color" is not something one can be "of". But this purely linguistic matter is only a tangent to the political issue here.

23:14

Page 14 [Flipside]

Page 14 is done.

23:00

The Genesis Device [Penny Arcade]

Zulu's is a real place you can go, technically place(s). Gorb got roped into a Star Trek event by his scions, presumably so he could handle the tab. Magic might be the one thing these boys agree on; one of the key bifurcations between them is that while they both go in for Stars, one prefers Wars while the other prefers Treks. Attempting to shape this conflict has been met with varying degrees of success, provided failure is part of that continuum - near the bottom, I would assume.

22:28

21:56

Brunching It Up At Cordelia [Whatever]

My favorite meal that one can have is undoubtedly brunch. There’s breakfasty dishes, sweet pastries, savory meals, green juice and espresso martinis, it’s really a wild ride with many paths to choose.

The first morning after Lily flew in to Cleveland, our brunch path began at Cordelia. Named in honor of the owner’s great-grandmother, Cordelia’s resides on East 4th, which is closed off to traffic so pedestrians can stroll their way through a scenic cluster of restaurants and bars.

The sign for Cordelia all lit up with yellow bulbs around a green sign. The arrow points to Cordelia's entrance.

(There was some construction going on as you can tell by the chain link fence, but fear not, for Cordelia’s sign will point you in the right direction.)

With a James Beard finalist chef, Cordelia focuses on seasonally curated dishes in partnership with local farmers, really honing in on a “harvest’s bounty” vibe. They refer to their menu as “modern grandma,” which I actually love.

I had made us reservations for 12:30, so getting a table was no problem, though they definitely were pretty packed since it was Sunday morning. The space was very open and inviting, with high ceilings, tons of eclectic framed photos covering one wall, original terrazzo flooring, and a long, beautiful bar with striking blue bar stools that match their blue velvet booths.

We walked to Cordelia since it was literally right across the street and that area is meant for pedestrians anyways, but I did learn that they have a $14 validate valet parking option which is nice.

The hostess and waitress were both extremely friendly and chatted with us beyond the usual pleasantries, which was very cool and made for a really genuine interaction.

Before taking a look at the food, we had to start off with some bevvies. Lily went with their Bloody Mary, and I opted for an espresso martini:

A tall glass for the Bloody Mary with a wedge of lime, and a coupe glass for the espresso martini, which has some decent foam and three beans.

The lime is blocking it, but there’s a toothpick of giardiniera-style vegetables and an olive on top of the Bloody Mary. Plus, of course, three beans on my espresso martini. Any espresso martini enjoyer knows you have to have those three beans. Lily’s drink was definitely a bit spicy for me, and also quite strong! Talk about a wake-up call. My drink was one of the best espresso martinis I’ve ever had, and I usually don’t get two in a row but I ordered a second one. It was very balanced, not too sweet or bitter at all. Good foam. A+ on the drinks round.

Here’s their Sunday Brunch menu:

A small paper menu of all their brunch dishes in blue typewriter style lettering.

So much of this menu is vegetarian, and there’s a couple gluten-free options, too!

Though everything sounded seriously delish, Lily and I knew we had to have some oysters, so we got two for $9 and got them “new school” style, which meant it came with a mignonette.

Two oysters on ice, both topped with mignonette.

These oysters were incredibly fresh and the mignonette was packed with flavor. These were great starters to whet our appetite.

Next, we had these jammy eggs with ajvar and furikake. I didn’t know what ajvar was, but apparently it’s like a condiment or spread made from peppers and vegetables.

Jammy egg halves in a small blue and white bowl. The eggs are topped with tons of ajvar and fresh dill.

As you can see, they loaded these bad boys up with the ajvar, and the addition of fresh dill was a pleasant surprise, as it’s one of my favorite herbs. The eggs were so perfectly jammy, and the ajvar had some heat but not too much. Needless to say we tore this dish up.

We also ordered the carrot muhammara with hazelnut dukkah. Once again, I found myself not knowing what these words meant, but thankfully our server was very patient with our many questions. Muhammara is basically just hummus but with red peppers and I guess in this case, carrots! As for the dukkah, it’s like a seasoning mix made with nuts and spices. I felt like I was learning so much!

A plate of carrot muhammara, very orange against the white plate. Slices of sourdough can be seen in the background.

Okay so picture something really bland. Now imagine the complete opposite of that, and you’ll have this. Flavorful is an understatement. This dish was like a rich, umami bomb, and had the most amazing texture when spread over the sourdough slices. This was such a good choice.

We also opted to share the “Sunday On A Shingle,” which was sausage focaccia with sunny-side up eggs on top:

A large slab of sausage focaccia topped with two perfect looking sunny side up eggs and chives.

After two drinks each and sharing two appetizers, we found ourselves so stuffed we literally couldn’t even eat this entree. I figured, no problem, we can just have it later on since we have a mini fridge in the room. That is, until, I left the box in my car all day. So, Lily and I did not even have a single bite of this dang entree, and I’m all the sadder for it, because look how good those sunny eggs look! Perfection, wasted. And $18 wasted but not tasting it is even more of a tragedy.

Even though we only tried oysters, jammy eggs, carrot muhammara, and two cocktails, Cordelia was such a pleasant experience that I want to go back ASAP! It’s original, it’s fresh, it’s intentional, it’s cool. I really like it.

Cordelia is also cool because they are all about community, and have a page on their site dedicated to recommending other restaurants and bars, things to do, and even lists all their culinary partners. Quite thorough, honestly.

Plus, they have a mission to make the hospitality industry better, and they show it by making sure their entire team has plenty of benefits like healthcare (including mental health), 401k with a 4% employer match, PTO with bereavement and paid sick time, discounted spa services (found this one very interesting), and more.  They also contribute to over a dozen charities.

Good food, good people, and a good mission. Check them out if you can, even if it’s just for one drink I’m sure you won’t be disappointed. And if you feel so inclined, follow them on Instagram!

Which dish on the menu sounds best to you? What toppings do you like in your Bloody Mary? Have you been to East 4th and explored before? Let me know in the comments, and have a great day!

-AMS

21:42

Vincent Bernat: Performance evolution of route lookup on Linux [Planet Debian]

In previous articles, I explained how the Linux kernel implements IPv4 and IPv6 routing tables, and I showed the performance improvement of route lookups from Linux 2.6.32 to 4.16 for IPv4—including the impact of the Meltdown and Spectre mitigations—as well as from Linux 2.6.39 to 4.18 for IPv6. This article updates the numbers through Linux 7.3 and investigates the perpetrator responsible for the performance regressions! 🕵️‍♂️

I ran the following benchmarks on an AMD EPYC 8024P, a Zen 4c CPU, rented from Scaleway, running at 2.4 GHz with CPU boost disabled. I compiled the kernels with GCC 10.2: this version can compile older kernels as well as the current ones.

IPv6

Performance evolution of IPv6 route lookups from Linux 4.14 to 7.3
Performance evolution of IPv6 route lookups. Versions with an asterisk have SRSO mitigation disabled.

I tested four scenarios:

  • a recent full view with about 260,000 prefixes,
  • a full view from 2017 with about 40,000 prefixes,
  • a set of 40,000 /48 prefixes, such that 2 lookups out of 3 match, and
  • a set of 40,000 random /128 prefixes, such that 1 lookup out of 400 matches.

In Linux 4.15, Wei Wang improved the lookup performance by replacing the read-write lock with an RCU and a spinlock in commit 66f5d6ce53e6. In Linux 4.18, David Ahern improved the data structures used by route lookup. In Linux 5.9, Brian Vazquez removed expensive indirect calls in commit 55cced4f813b.

The major 200 ns regression introduced in Linux 6.5 wiped out all these improvements. This version implements a mitigation for "Speculative Return Stack Overflow," a vulnerability affecting AMD processors, in commit fb3bd914b3ec. This mitigation adds about 20 cycles on each function return. It was backported to older kernels (5.10, 5.15, 6.1, and 6.4). To keep the results legible, I disabled the mitigation for these versions with spec_rstack_overflow=off on the kernel command-line.

You can check the vulnerabilities impacting your CPU and their mitigations with lscpu. Some mitigations may depend on the microcode or on the firmware.1

$ lscpu | grep '^Vuln'
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Mitigation; Safe RET
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; Retpolines; IBPB conditional; IBRS_FW; STIBP always-on; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Vulnerable: Clear CPU buffers attempted, no microcode
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Mitigation; IBPB before exit to userspace

IPv4

Performance evolution of IPv4 route lookups from Linux 4.14 to 7.3
Performance evolution of IPv4 route lookups. Versions with an asterisk have SRSO mitigation disabled.

I tested three scenarios:

  • a recent full view with more than 1,000,000 prefixes,
  • a subset of a full view from 2017 with 500,000 prefixes, and
  • a set of 500,000 contiguous /32 prefixes.

The 30 ns impact of the mitigation for SRSO in Linux 6.5 is smaller than for IPv6 because IPv4 route lookups traverse fewer functions: around 4 function calls for IPv4 compared to 25 for IPv6.

In Linux 5.11, I introduced a regression in commit c0c5a60f0f13 after fixing the behavior of net.ipv4.conf.all.ignore_routes_with_linkdown!2 As a result, the ip_ignore_linkdown() function spends around 5 additional cycles to return a result as it needs to follow three additional pointers. fib_lookup() eventually calls it in the following code:

if (ip_ignore_linkdown(nhc->nhc_dev) &&
    nhc->nhc_flags & RTNH_F_LINKDOWN &&
    !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE))
    return false;

If we reorder the conditions, we avoid calling ip_ignore_linkdown() for the most common case where the link isn't down:

if (nhc->nhc_flags & RTNH_F_LINKDOWN &&
    !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE) &&
    ip_ignore_linkdown(nhc->nhc_dev))
    return false;

Here's the distribution of lookup times before applying the patch on top of net-next:3

min=128 max=4657 count=994104 95th=134 90th=133 50th=132 mad=0
    value │                         ┊                            count
      128 │                                                        120
      129 │                                                       2232
      130 │▒                                                     25224
      131 │▒▒▒▒▒▒▒▒▒▒▒▒▒░                                       264264
      132 │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░             516480
      133 │▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      126864
      134 │▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      21624

The lighter shade depicts the cumulative distribution function. After applying the patch, the median improved from 132 to 126 cycles:4

min=124 max=208839 count=994104 95th=128 90th=127 50th=126 mad=0
    value │                         ┊                            count
      124 │                                                        576
      125 │▒▒                                                    49440
      126 │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░                      584904
      127 │▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░       284592
      128 │▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░      45288

Impact of mitigations

To reduce the impact of mitigations, you can disable all of them with mitigations=off, disable only a specific one like with spec_rstack_overflow=off, or protect against only some attack vectors with mitigations=auto,no_user_kernel, starting from Linux 6.17.

The impact is also quite different depending on the CPU. For example, on a Xeon W-2295, an Intel desktop CPU from 2020, the impact of the mitigations is only a few cycles for IPv4, and less than 3% for IPv6. The main contributor is the mitigation for the Indirect Target Selection vulnerability, which is fixed since the Sapphire Rapids architecture.


If we set aside the regressions introduced by the mitigations against CPU attacks, the performance of IPv4 is declining slowly over time while IPv6 has improved in the past and is currently stable. If routing performance is important, you have several options: choose a different CPU like an AMD Zen 5 CPU, a fourth generation Xeon CPU, or maybe an ARM Neoverse V2; disable some or all the mitigations; bypass routing with XDP/eBPF;5 or offload routing to the network card.

Note

Maytham Alsudany reviewed a first draft of this article. Any errors are still mine!


  1. The microcode was out of date on my machine as I forgot to install the amd64-microcode package. As it only impacts TSA, our benchmark is unaffected. Spectre v2 mitigation did not enable automatic IBRS, because of SEV-SNP being enabled in the firmware. With automatic IBRS, the impact of SRSO should be smaller. ↩

  2. Despite ipvX in its title, the commit only changes the behavior of the IPv4 code. The IPv6 version overwrites the value of each device in addrconf_fixup_linkdown(). ↩

  3. Linux 7.5 will be the first stable release including this fix. ↩

  4. At 2.4 GHz, one cycle is about 0.42 ns. ↩

  5. This requires avoiding bpf_fib_lookup(), which relies on the same kernel lookup. ↩

21:00

View From a Hotel Window 11/9/26: Louisville, KY [Whatever]

I’m about three hours from home here. Alas, not enough time to head home, kiss Krissy, and come back here in time for my event. And the event has to take precedence, I guess.

But in truth I am looking forward to tonight’s event at Carmichael’s Bookshop, at 7pm. You should come see me if you’re in the area.

Tomorrow: Kansas City! At the Mid-Continent Public Library! Also 7pm! You have more than a whole day to register! Do it!

— JS

20:07

17:49

Reproducible Builds (diffoscope): diffoscope 338 released [Planet Debian]

The diffoscope maintainers are pleased to announce the release of diffoscope version 338. This version includes the following changes:

[ Chris Lamb ]
* Binutils no longer shows the top-level directory; update expected test output.
  (Closes: #1151752)

You find out more by visiting the project homepage.

17:00

Link [Scripting News]

How to follow this blog in BonBon-land and more.

Link [Scripting News]

John Palfrey, a friend and former colleague from Berkman wrote a fantastic post about people at the lawfirms who caved to Trump.

16:14

Link [Scripting News]

This is a test. How HTML links are supposed to work in BonBon -- they open the link in your current browser, based on the OS. What they are actually doing, as reported, is show it as a broken URL. We never intended this to reach users, it was a loose-end, but we might not have tested it in the Demo version of BB. I am now going to link to an HTML page, and open it over on the other side, and see what it does with it. (Update: That post didn't reveal the problem, it was a diff in the way Safari and Chrome handle links. It works now.)

Thorsten Alteholz: My Debian Activities in October 2026 [Planet Debian]

Debian LTS/ELTS

This was my hundred-forty-eighth month that I did some work for the Debian LTS initiative, started by Raphael Hertzog at Freexian.

During my allocated time I uploaded or worked on:

  • [DLA 4825-1] suricata-update security update to fix one CVE in Bookworm related to a path traversal attack. Thanks a lot to Andreas Dolp, who prepared the package.
  • [DLA 4857-1] caddy security update to fix nine CVEs in Bookworm related to the bypass of path- or host-based access controls, the execution of an unintended file by a FastCGI backend, the injection of identity headers trusted by applications running behind Caddy, unauthorised reconfiguration of the server through its admin API, or cross-site scripting.
  • [DLA 4870-1] antiword security update to fix several isssue in Bookworm related to heap out-of-bounds write in several parts of the software or integer divide by zero. Unfortunately no issue has been assigned a CVE id yet.
  • [DLA 4871-1] cyrus-sasl2 security update to fix one CVE in Bookworm related to a heap-based buffer overflow.
  • [ELA-1873-1] antiword security update to fix several isssue in Stretch, Buster and Bullseye related to heap out-of-bounds write in several parts of the software or integer divide by zero. Unfortunately no issue has been assigned a CVE id yet.
  • [ELA-1874-1] cyrus-sasl2 security update to fix one CVE in Stretch, Buster and Bullseye related to a heap-based buffer overflow.
  • [ELA-1875-1] libcaca security update to fix two CVEs in Buster related to a missing overflow check.
  • [ELA-1876-1] libcaca security update to fix one CVE in Stretch and Bullseye related to a missing overflow check.
  • [osmo-bsc] upload to unstable to fix one CVE related to a heap based buffer overflow.

Besides doing these uploads, I reviewed the libssh upload (DLA-4844-1) and helped a bit in the background of the php uploads. Last but not least I spend some time on security-master to assist others (especially the kernel team) with uploads to Bookworm and Bullseye.

Debian Printing

This month I uploaded a new upstream version or a bugfix version of:

  • … cups to unstable, to finally fix autopkgtest.

This work is generously funded by Freexian!

Debian Lomiri

This month I uploaded a new package vendor-ubuntu-touch to be able to build packages differently in an UbuntuTouch environment. I am curious when it will leave NEW. I also tried to finish two new applications.

This work has been generously funded by Fre(i)e Software GmbH!

Debian Astro

This month I uploaded a new upstream version or a bugfix version of:

  • … calceph to unstable (sponsored upload)
  • … alfa to unstable (sponsored upload).

Debian IoT

Unfortunately I had no time to work in this category this month.

Debian Mobcom

This month I uploaded a new upstream version or a bugfix version of:

misc

This month I uploaded a new upstream version of:

Due to different reasons I started to tidy up the list of packages I maintain. Some packages have been removed, some packages lost myself as uploader and some packages have been orphaned. The number of orphaned packages is about 1100 now, so maybe you can find one to adopt.

15:28

Link [Scripting News]

To Phil Windley: "We both remember what the web was like before it became a CSS and JavaScript platform." But most young users and developers have no memory of how powerful it was to make interop so damned easy.

[$] Git considers voting to determine its LLM policy [LWN.net]

One of the dominant themes of 2026 has been the debate within development projects about the terms under which LLM-written contributions should be accepted — if, indeed, they should be accepted at all. The Git project has not been immune to this trend; the topic was discussed at the recent Git Contributor's Summit. In this case, the path to a resolution may be somewhat circuitous; the project, which has never been governed as a democracy, is considering adopting a voting process as a way of bringing the discussion to an acceptable conclusion.

Kernel prepatch 7.4-rc2 [LWN.net]

Linus Torvalds has released the 7.4-rc2 prepatch and it will come as no surprise that it is a large one ("a big -rc2 to go with the largest ever -rc1"). Much of the size was made up of some automated Coccinelle updates that were spread out all over the tree; once those are factored out, the rest looks fairly normal:

When masking that noise out from the diffstat, the shape of it changes - not spread out over thousands of files any more. But it does not look unusual: a third is drivers (gpu, networking and sound account for most of it, but there's a bit of everything), another third is networking and bpf, and the final third is "the rest" (mostly filesystems, mm, arch updates).

And yes, much of this was driven by various AI fixes. I think I'll stop repeating that, and we can just take it for granted. But this time around Alexei [Starovoitov] claims that on the bpf side at least the fixes are now coming in faster than the new reports, and that sounds lovely if true.

14:42

Link [Scripting News]

The Markdown version of my blog is getting more traffic than the HTML version. So much so that I'm getting complaints about all the political stuff. I love this, and I even love that some people are saying what they used to say, they didn't come to my blog for the politics. That probably will influence me a little, but it still is my main way I talk to the world, so I'm not likely to back off too often.

Link [Scripting News]

The sound on my TV is a fraction of a second faster than the picture. Just enough of a delay so I know a shot is going in before I see it go in.

Dems: the campaign never ends [Scripting News]

Urgent note to Dems. Keep your campaign websites going.

This is the mistake Dems always make. When you have news to get out, the MSM will mangle or ignore it. Go direct to your supporters, not just the people who voted for you, the people you represent. Let us help support the work you're doing.

Speeches on the floor of Congress hold very little interest.

Send some of the new stars of the party out in the flyover territory (where they come from!) to keep everyone in the loop. Look at all the power that was locked up in places like the North and South Carolina, Georgia, Texas, Kansas, Michigan, Iowa. Arizona, Mississippi and Alaska. (Who did I miss?)

Remember this dear member of Congress, you were elected to represent us, not to make deals with anyone else. We are the power. Y'all always forget that once the election has happened, but that's just the beginning. You may be very surprised if you have a 365-day-a-year connection to the people.

The news industry is pretty freaking useless, and we know it. The landslide wasn't manufactured on Maddow or Meet the Press. Don't look to podcasters. The people of the United States are driving now.

Also even though he doesn't have a job, bring Pete Butttigieg in to the campaign.

And to the news networks, host some of your shows from studios in the new states, or move your hosts around from Atlanta to Dallas and Des Moines and Detroit, Phoenix and Charlotte. I think you'll be surprised at the difference it makes in the perspective of your super boring talking heads who always say the same bullshit, and the pride of the people who live in those states. Remember they feel no one pays attention to them -- and that includes journalism, not just politicians.

The current Dem leaders can't do this -- too much change for them, to little time. Start with people who have been freshly educated in what the electorate is capable of. You're at best the coaches, not of the reps, but the people. Sometimes people are too old for the job, and that's true in this case. Someone, an elder like Bernie Sanders or Elizabeth Warren should be out looking for the next leaders. Whoever they are, they must be young and eloquent and able to talk back to bullshit, not try to skate around it.

And remember this -- the campaign never ends.

PS: I'd love to see Jasmine Crockett sitting behind Trump at the next State of the Union. A sharp woman judging a smelly old man is really appealing. Focus group that, against Jeffries in the same seat.

PPS: The new leadership has to be photogenic, intelligent, doesn't yield to bullshit, doesn't try to skate around it either. When they go on SNL they have to kill it.

OpenIndiana 2026.10 released [LWN.net]

Version 2026.10 of the OpenIndiana operating system has been released. OpenIndiana is based on Illumos, which in turn was based on OpenSolaris after Oracle discontinued it.

Notable changes in this release include UEFI framebuffer support for the live image, updates to many applications and development tools, as well as the inclusion of new applications such as TeX Live 2026, the Foliate ebook reader, and more.

Security updates for Monday [LWN.net]

Security updates have been issued by Debian (cjose, kernel, libreoffice, rsync, ruby3.3, telegram-desktop, vim, and zlib), Fedora (bind, composer, copyparty, dnf5, elixir, fasterxml-oss-parent, gnome-remote-desktop, goose, jackson-annotations, jackson-bom, jackson-core, jackson-databind, jackson-jaxrs-providers, jackson-modules-base, jackson-parent, java-21-openjdk, java-21-openjdk-portable, jupyterlab, kryoptic, luksmeta, mingw-cfitsio, mingw-expat, mingw-freetype, mingw-glib-networking, mingw-harfbuzz, mingw-qt5-qtbase, mingw-qt5-qtdeclarative, mingw-qt5-qtwebkit, mingw-qt6-qtbase, mtools, NetworkManager-l2tp, nginx, nginx-mod-brotli, nginx-mod-fancyindex, nginx-mod-headers-more, nginx-mod-js-challenge, nginx-mod-modsecurity, nginx-mod-naxsi, nginx-mod-vts, nodejs-pnpm12, pcre2, perl-Spreadsheet-XLSX, pie, python-boto3, python-botocore, python-joserfc, python-jupyter-builder, python-jupyterlab-server, python-jupytext, python-nbdime, python-notebook, python-s3transfer, python3.12, rccl, rsync, rust-blake2b_simd, rust-blake3, rust-constant_time_eq, rust-lzma-rust2, rust-ppmd-rust, rust-regorus, rust-sccache, rust-totp-rs, rust-typed-path, rust-zip, rust-zip0.6, rust-zip2, sofia-sip, suricata, wordpress, and xen), Mageia (gimp, python-gitpython, and suricata), Red Hat (osbuild-composer), Slackware (httpd), SUSE (bind, brotli, ca-certificates-mozilla, chromedriver, containerized-data-importer1.65-api, corepack24, docker-compose, flatpak, fuse-overlayfs, git-lfs, gitoxide, go1.27, google-cloud-sap-agent, google-guest-agent, gotosocial, kubevirt1.8, kubevirt1.8-container-disk, kubevirt1.9-container-disk, libmariadbd-devel, libntpc1, libopenscap33, libsndfile-devel, libspice-server-devel, libtirpc-devel, matomo, mihomo, mozilla-nss, nano, nmap, nodejs22, perl-Mozilla-CA, python-Brotli, python-CairoSVG, python-certifi, python313-Pillow, rsyslog, stgit, and thunderbird), and Ubuntu (python-tornado).

1352: No Looking Back [Order of the Stick]

http://www.giantitp.com/comics/oots1352.html

OpenIndiana Hipster 2026.10 released [OSnews]

OpenIndiana is a rolling-release illumos distribution, but they do release snapshots twice a year to serve as a base for installations, which they call Hipster. The project’s just released OpenIndiana Hipster 2026.10, and it brings a number of welcome changes. First, there’s UEFI framebuffer support on the live image, which is automatically configured when loading up the image. Second, Firefox and Thunderbird versions have been bumped to 159.0, and a whole slew of development tools have been updated to newer versions as well.

This snapshot also brings QEMU 11.1.2 and VirtualBox 7.2.22, and a number of new applications have been added as well. In addition, SPARC build support has been improved to enable new and updated packages for Sun’s dead ISA as well.

You can download a fresh image, or update an existing installation through IPS.

Making musl and proprietary NVIDIA drivers work together [OSnews]

Creator and lead developer of Chimera Linux, Nina “q66”, write about their efforts to get NVIDIA drivers to work properly on musl-based distributions.

As you may be aware, one of the limitations of musl-based distributions is that they will not function to their proper extent when used in computers with various NVIDIA graphics cards.

This is due to the proprietary nature of the driver, being built for glibc. I have been experimenting with trying to make this work, and this post is the summary of that effort.

↫ Nina “q66” on the Chimera blog

What follows is a deeply technical exploration of the problem, and the steps Nina q66 and the Chimera team are taking to try and fix it. With how popular and widespread NVIDIA hardware still is, this is a hugely important issue to try and address, and I’m grateful they’re trying to address it.

13:14

Why AI Agents Are Repeating 2019’s Microservices Mistake [Radar]

Microservices changed how we build software by breaking large applications into smaller, independently deployable services. That made systems easier to develop and scale, but it introduced a different class of problems: The behavior of the whole system got harder to see. AI agents are now following a similar path. A workflow that once lived inside a single application gets split across several agents, each responsible for one task. Individual pieces may work exactly as designed while the overall workflow gradually produces worse results. The difference is that agents make these systems far faster and cheaper to create, which makes it easier to repeat the same architectural mistake at a much larger scale.

I learned this the hard way. My name was on the design doc. Splitting that workflow across three agents was a reasonable call, and I would still defend most of the reasoning. But if you’d asked me that afternoon how we would find out when the thing quietly stopped working, I had no answer.

Months later, in a quality review, a reviewer noticed something felt off before any of our instrumentation caught it. Latency looked fine, error rates were flat, and every service in the chain returned what it was supposed to return. What we had was a slow decline in output quality, and it took about three weeks to trace.

The first agent handed a set of documents to the next one for summarization. The summarizer dropped a field it had judged to be a low signal. A downstream agent then made a confident recommendation without that field. Every agent did what it had been designed to do, and the result was still wrong. I should have anticipated it, because I’d been on the product side through the microservices years and had seen this pattern before.

The hangover we already paid for

Breaking down monoliths was a good decision for most teams, but one thing was forgotten. Decomposition did not make the difficult parts of the system disappear. It moved them into the gaps between services, where the people accountable for the overall product could no longer see them. The bill landed around 2019, and it landed on the delivery schedule rather than the incident channel. Teams were running hundreds of services with limited tracing and no contract versioning, and the real symptom was slower delivery. Shipping took longer than before, because engineers spent their weeks picking through those services.

Agents are running the same arc faster, because standing one up takes an afternoon and a prompt instead of a repo and a deploy pipeline. When creating an agent is that cheap, product teams make agents without asking anyone, and nobody keeps track of what the agents are and what they’re doing.

What breaks, and what it costs you

This isn’t only my experience. Cemri and coauthors annotated more than 1,600 execution traces across seven popular multi-agent frameworks and built a taxonomy of 14 recurring failure modes (MAST, NeurIPS 2025). Most of what goes wrong traces back to how the system was specified and how its agents coordinated, not to the models inside it.

Inventory sounds trivial and isn’t. Service sprawl at least showed up in your Kubernetes manifests. Agents get created inside product surfaces and workflow tools, and inside somebody’s weekend automation of their own job. You don’t find out what you have until a compliance reviewer asks which automated system touched a given decision, and then it’s too late.

The visibility gap cost us three weeks. When an agent calls an agent that calls a retrieval layer that calls another agent, and every hop has a model deciding what to pass forward, you need trace context that survives the whole path. Most stacks log prompts and completions per call and stop there. You get each hop and never the chain, and it was the chain that failed.

Compounding confidence is the failure that worries me most. Distributed systems fail loudly, which turned out to be a blessing nobody appreciated. A service throws a 500 and the caller knows to stop. Agents fail quietly and fluently, so when an upstream agent produces a summary that’s plausible and wrong, the downstream agent gets no signal and reasons confidently on top of it. By the time the result reaches the user, it conveys a level of confidence that the initial evidence does not support.

API contracts drifted when someone changed the response format without versioning it, and we built machinery to catch that at build time. Agent contracts drift when someone edits a system prompt. In that case there’s no schema diff and no type check. Nothing breaks until a downstream agent starts getting different output and adapts to it without telling anybody.

What carries over from microservices

A registry is the cheapest thing to build and the first thing everyone skips. When building microservices, we kept a service catalog with an owner and a scope for each service. For agents, we need that same record plus an explicit list of what each agent is allowed to call.

Tracing carries over nearly unchanged, since correlation IDs were invented for this exact problem. OpenTelemetry’s GenAI semantic conventions give you the vocabulary, and an agent run comes out as a span tree instead of a pile of unrelated log lines:

invoke_agent

Had we been emitting those spans, the summarizer span and the recommender span would have sat side by side in one trace, and the missing field would have been a diff instead of a three-week hunt. These conventions are still moving, so keep the attribute names behind a thin mapping layer of your own.

Finding the missing field in a trace would have shortened the investigation. I’d also want a test that caught its omission before a prompt change reached production. That’s where I’d apply the contract-testing discipline from microservices: define what the downstream agent depends on, then check that an upstream change preserves it. For the summarizer in this workflow, the evaluation would need to check whether its output retained the information the recommender needed. I’d version the prompts and require changes to pass those evaluations before release. There’s early evidence it pays: SEMAP, a protocol-layer method applying behavioral contract modeling and lifecycle verification on Google’s A2A infrastructure, reported up to roughly 70 percent fewer failures on function-level coding tasks when scored against MAST.

The trust boundary is the thing I’ll argue about in a design review. In 2019 we learned that a service doesn’t get trusted just because it lives inside the perimeter, which is most of what service meshes were for. The agent version is that an agent doesn’t get broad tool access just because we built it and we’re nice people. What an agent is allowed to do belongs in a policy layer the model can’t talk its way past, not in a system prompt asking politely.

Cost is where the analogy between microservices and agents fails. A microservice stuck in a retry loop costs you CPU and an alert at 3 am. An agent stuck in a loop costs real money on every turn and doesn’t saturate in any way that makes itself obvious. This one lands on the product owner instead of infrastructure, because it surfaces as unit economics rather than an outage, which means the PM ends up justifying the number at the end of a billing cycle.

What I ask before approving a split

None of this argues against multi-agent systems, which earn their keep the same way services did. My argument is that operational practices should evolve alongside architecture, without repeating the five-year lag of the previous transition. The person accountable for delivering the product is usually best placed to ensure that happens.

Hence, I push on four things. Can we follow one request all the way through and reconstruct what each agent decided and why? If not, we’re building something we won’t be able to debug. What happens when an upstream agent is wrong, and not whether it can be? If the honest answer is that the next agent carries on as normal, we haven’t designed a failure mode. We’ve designed a failure and left it running.

Who owns this agent, and where is its tool access enforced? A system prompt isn’t enforcement. What does this cost at ten times today’s volume, and what shuts it off when the number goes wrong? I ask that one early, because nobody volunteers it.

The teams that managed service decomposition most effectively incorporated tracing and contract testing into the build from the outset. These practices helped them understand how services interacted and verify that changes preserved expected behavior. That work is a sprint or two now, and a great deal more than that once you’re running 40 agents and someone asks which of them touched a customer’s data.

CodeSOD: Eventually [The Daily WTF]

We were just discussing TODO comments recently, and that motivated Bernard to send us this representative comment..

  // TODO: This method should ideally be in tax frame work but due to
  // the time constraint I am duplicating the code here.
  // Needs to be refactored. Oct 28, 03.

This comment exists in this codebase, unchanged. It has been there for twenty three years. The refactoring has never happened.

This comment has seen the world change over the last 23 years, as the technology landscape has shifted and changed, grown and contracted. But this comment, this comment is a constant.

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

12:21

AI Security [Schneier on Security]

Two weeks ago, I attended the [un]prompted AI security conference in San Francisco. It was an excellent event: three days of very dense talks about all aspects of AI security. (My talk was about integrous AI, and I will post it when it is online.)

AI security can be divided into three broad topics. It’s important for researchers to understand which one they are working on. And it’s important for us as a community to work on them all. They are: security of AI, security with AI, and security from AI. [un]prompted had good talks about all three.

11:42

Grrl Power #1511 – Designated foreshadowing [Grrl Power]

I don’t know what is involved in the Chastity Corner, and what makes it especially chaste, but at some point, Dabbler’s going to realize that it’s a fairly toothless threat. Ultimately, Maxima’s not going to get involved in any of the team member’s sex lives unless they’re screwing around on duty or somehow endangering people. Which, in a succubus’s case, is not out of the realm of possibility. Still, the vague threat of chastity is a succubi’s kryptonite, so Max isn’t above using it while it works.

I’m veering dangerously close to having every character speak in customized word bubbles. I had considered doing that from the very beginning of the comic, but almost immediately realized that it’s a pitfall for any comic that has more than a dozen characters in it, because there’s only so many combinations of balloon color, style, and font that are actually easily legible. I can’t stand comics that have black text in a “Nazi-Letterhead-Gothic-Calligraphy” font on a medium dark red word bubble, with just a skosh of JPEG artifacting around the letters. Okay, I get it, the character speaking is a demon. Are they supposed to be unintelligible as well? I’d say that’s borderline racist, but it’s really just a design failure.

The only reason I’m doing as much of it now as I am is, well, look, one of the competitors was a 600 meter tall mountain, another was a giant robot starfish spaceship, then we’ve got the “Better than an Angel on my own say-so,” “Living Explosion,” “Huge Demon’s Boss.” You get the idea. Superheroes and supervillains don’t generally need custom sound bubble. Magneto and Vehemence are big, scary bad guys, but they’re just people. Fin Fang Foom? Sure. He can get a custom craggly font. Someone like Derksied? Eh, kind of an edge case.

I looked up how much that cone of mountainside Max threw would weigh. I made some very rough estimates of its dimensions using Max as a ruler. Then used some website to calculate the volume of a cone, then found a website with charts of how much igneous rock weighs. Turns out there’s a huge difference in weight depending on the actual kind of rock it is. Pumice, for instance, weighs quite a bit less than basalt, for instance. And no, Max didn’t throw a giant cone of pumice at Disastar. Still, 1,000 tons for a cone of rock that large seems very light to me. Maybe it’s the cone shape that’s throwing me.


Here you go, a brand new vote incentive. Featuring the least sexy character in the comic. No, I take that back, Cooter is the least sexy, but don’t expect a pinup of him anytime soon. Or ever. There is a nude version over at Patreon. Note I didn’t say NSFW. She is nude in those picture, and she does identify as female, but it’s… hard to tell. She is a humanoid aberration by D&D terminology, not a mammal. And before you ask, no, I don’t know how many vertebrae she has in her neck.

 


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

10:42

Restrictive design [Seth's Blog]

Design of any kind requires empathy. If you’re making it for yourself, it’s a hobby. Everything else is for someone else.

Great designers know who it’s for. And the design is for them, not for the designer.

Annie Jean-Baptiste teaches us about restrictive design. This is what happens when the designer fails to identify and recognize who the work is for, and then leaves people out. “Exclusion is a business decision, even when you did not mean to make it.”

Not everything needs to be designed for everyone. But all well-designed experiences and products are designed for someone.

Name your people, invite them in and give them what they need.

08:42

The Genesis Device [Penny Arcade]

New Comic: The Genesis Device

08:35

Pluralistic: America cannot undo Trumpism (09 Nov 2026) [Pluralistic: Daily links from Cory Doctorow]

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

Today's links

  • America cannot undo Trumpism: The only way out is through.
  • Hey look at this: Delights to delectate.
  • Object permanence: Bruces x Pokemon; Rich countries and WIPO conspire to kill developement agenda; Wired photos go CC; "Mortality Bridge"; Drones over Disney; CBC v podcast apps; Realtor x election eschatology; Right-clicker mentality; "Victories Greater Than Death"; Facebook's fraud files; Zune v Universal; Ben and Jerry's x OWS; Nudging is bunk; History of Chinese sf; How Audi cheated; Trump runs the surveillance state; Stockholm v interop.
  • Upcoming appearances: Courtenay, Vancouver, Folkestone, Oxford, Sheffield, Virtual, Oxford, Santa Barbara, Montreal.
  • Recent appearances: Where I've been.
  • Latest books: You keep readin' em, I'll keep writin' 'em.
  • Upcoming books: Like I said, I'll keep writin' 'em.
  • Colophon: All the rest.



A pair of wrecked, overturned wagons against a weathered wooden building tinted like a faded US flag; between them is a DEAD END sign. To the left is a 1930s streetcorner with a ONE-WAY sign; entering from that edge is an engraving of an elephant with upraised trunk, decorated in GOP livery and topped with a mop of Trump hair.

America cannot undo Trumpism (permalink)

True Carneyism has never been tried. When Canadian PM Mark Carney traveled to Davos to declare a "rupture" in the old order (and admit that this old order was never that great to begin with) he told us that there was no going back from Trumpism. The only way out of Trumpism was through:

https://www.weforum.org/stories/forum-institutional/davos-2026-special-address-by-mark-carney-prime-minister-of-canada/

This is easy to say, but hard to do. If the old order is over, then we will never again be able to trust America to serve as the world's cop, banker, ISP, IT department and consumer of first resort.

We can't trust Americans to buy the things we make:

https://pluralistic.net/2025/12/16/k-shaped-recovery/#disenshittification-nations

We can't trust them not to interfere with the interconnections between fiber lines that slither out of the oceans and onto the US landmass:

https://pluralistic.net/2025/11/26/difficult-multipolarism/#eurostack

We can't trust them not to weaponize the US dollar to undermine sovereign nations' legitimate activities:

https://pluralistic.net/2026/01/26/i-dont-want/#your-greenback-dollar

And we absolutely can't trust them not to spy on, steal from, and shut down governments, firms and households around the world by cutting off access to US software and cloud services, and by bricking the world's devices, from tractors to smartphones:

https://pluralistic.net/2026/01/01/39c3/#the-new-coalition

Despite Carney's assertion that this rupture represents a welcome (if too cruel, sudden and painful) departure of the old (never very good) system, no one (not even Carney) is acting like the world has truly changed. Take Carney's answer to the Trump tariffs: retaliatory tariffs. Tariffs have a place in sheltering a nascent domestic industry from better-developed, deeper-pocketed foreign competitors, so a tariff wall between Canada and the US could make sense, if it was paired with the massive domestic investment we'd need to rebuild the manufacturing industry that Brian Mulroney sold out with the Canada-US Free Trade Agreement (and later NAFTA).

But Carney is no Carneyist. When it comes to massive domestic spending, Carney is a bog-standard, austerity-addled Reaganomics guy; a central banker and technocrat whose idea of "industrial policy" is firing tens of thousands of skilled civil servants who thwart his agenda and replacing them with defective (but obedient) chatbots running on US hardware:

https://pluralistic.net/2026/05/13/vibe-governance/#k-hole

Carney's retaliatory tariffs aren't what you'd do if the old order had "ruptured." They're what you'd do if you hoped that your American cousins would come to their senses, evict their mad king from the White House, tear down the Epstein Memorial Ballroom, and roll back the clock to 2016. Like a lot of liberals, Carney just wants to go back to brunch.

But as any true Carneyist knows, brunch is canceled forever. Brunch ruptured. There's no going back to the old America, and there's no going back to the old American order that had dominated the world since the end of WWII. As November Kelly says, "Trump inherited a poker game rigged in his favor, but he flipped the table over anyway because he resented having to pretend to play."

This is something we're all struggling with, including Americans. The Republicans' midterm wipeout has corporate Democrats hoping that after a few years' tinkering, they can elect a Newsomdroid or give Harris a do-over and win back the trust and reliance of the world and the American people. Even for a true Carneyist who never liked the old order very much (like me), this is a comforting prospect. No one knows what the next world will look like, and no matter how screwed up the old world was, I knew how it worked and how to make it work for me (more or less).

But there is no going back. Trump I didn't have a plan, it only had Trump, whose One Big Idea was issuing Executive Orders. Many of these were meaningless bloviating. Some were illegal and were swiftly suspended or never went into effect. Biden overturned nearly all the remaining EOs (that were both substantive and not totally illegal).

But Trump II had Project 2025. The point of Project 2025 and the ambition of the wreckers who wrote it was to push America through a series of one-way transformations that cannot be undone, and that's what's happened, over two short years. That's the bad news. The good news is that it's much easier to destroy than to build, so Project 2025 hasn't led to the creation of permanent, load-bearing fascist institutions that cannot be shuttered without bringing down large parts of the USA.

Start with values. Trumpism is a denial of democracy and the rule of law. Tens of millions of Americans have been marinated in a belief system that says that the way to win power is to claim all the elections you lose are rigged and that these "stolen elections" are best addressed by staging a coup. These people are in a cult that embraces its leader's naked corruption. They're in a cult whose doctrine treats political triumph of as divine direction to embark on looting sprees. It's a cult whose members mutilate their faces so that they can't ever leave, and the reward for this permanent disfigurement is endless influence-peddling:

https://thehill.com/homenews/administration/6136101-ambassador-guilfoyle-wire-request/

Even without ritual scarification to mark them out forever, millions of these people will never come back from this cult indoctrination. They will forever be democracy's enemies, treating the idea of laws, rules and honest service as shucks for the rubes. What's more, these people's neighbors, family members and co-workers will never be able to fully trust them.

Unfortunately, those values aren't just diffused through the population: they are concentrated in the organs of state. DOGE and Federalist Society judicial appointments have created a stay-behind cadre of life-tenured fascists who now dominate America's federal judiciary and permanent civil service, including and especially the nation's law enforcement and national security agencies, from the FBI to the FDA, the NSA to the Bureau of Prisons.

Worse: DOGE also chased away hundreds of thousands of skilled, principled public servants. Those people have retired, retrained, emigrated or exited the workforce. They can't simply be re-hired and restored to their old roles. From finance regulation to the national education system, America has lobotomized itself, swapping people who understand how things work and use that understanding to enforce the laws and safeguard the American people for end-times fascists, caliper-wielding eugenicists, and Ayn Rand LARPers.

Much of the work DOGE's victims did is also gone forever. When DOGE's muskrats killed long-running NIH research projects, they pulled the plug on studies, some of which had run for decades. Many of these experiments are unsalvageable. DOGE didn't just throw away the contributions that cancer patients, people with genetic disorders and other volunteer research subjects gave to science: in halting these research projects, DOGE shredded this selfless sacrifice. Why not? When one NIH official begged his DOGE invaders not to kill long-running, valuable cancer research, the DOGE child laughed and said it didn't matter, because AI was going to cure cancer.

Then there's the NIH's research partners: the elite institutions who buckled so quickly in the face of Trump's antisemitism/DEI witch-hunts. These universities now face the same crisis as the DOGE-gutted civil service, with their best and brightest gone, grad students chased back to their home countries, and the trust of their students and faculty permanently squandered.

It's not just grad students who got chased out of America. Immigrants – documented and undocumented alike – have been terrorized for two years and many of them have fled. ICE got what it wanted: they robbed aging, stagnant America of the dynamism, aspiration and youthful vigor of the most ambitious people from every corner of the globe, people who proved their resourcefulness and bravery by making dangerous crossings. Then they navigated the US immigration system's impenetrable bureaucracy, often working without legal representation, in a language they were just learning, and still managing to clear every bureaucratic hurdle. This alone is a breathtaking demonstration of intelligence, resourcefulness and diligence. Those brilliant, hardworking people aren't coming back: some other country will get the benefit of their life's work and care. Their children will become citizens of other nations.

Now think of the hundreds of billions of dollars that have been transferred from ordinary working people who are still here, to America's oligarchs. Trump's tax cuts, corrupt policy subsidies and no-bid pork contracts have supercharged the wealth (and thus the power) of America's most corrupt elite. It will be the work of a generation to tax away their stolen loot, and much of it may never be recovered. These people will spend that time working to transform their wealth into permanent power, buying and installing politicians at every level of office.

Trumpland is a coalition of wreckers of every kind. Think of how MAHA undermined the nation's herd immunity to a host of communicable diseases, many of which can result in permanent disability. Long after MAHA is forgotten even as a punchline, the people whose health they destroyed forever will still be struggling. After a century of painstaking work to corral measles and other killer diseases, MAHA immunocompromised America itself, in just two short years. Any attempt to bring back evidence-based preventative medicine must now overcome the deep mistrust of medical science that an army of supplement-peddling quacks has sunk deep into Americans' psyche.

Speaking of mistrust: Americans must now and forever live with the knowledge that tens of thousands of their neighbors joined ICE, an armed, masked kidnapping squad that occupied US cities, murdering US citizens and noncitizens alike in the streets with impunity. Even if we try and imprison every one of those war criminals, it will take years and will shatter families and communities.

ICE proved that America is awash in small arms, but it's a different story when it comes to significant warfighting materiel. Trump's Iranian disaster used up the largest part of Pax Americana's arsenal of missiles and anti-missile interceptors. Putin doesn't need to convince Trump to cut off Ukraine's access to America's long-range arsenal. Trump shot his wad, and re-arming America is the work of decades, and it will cost billions, and it will require access to things America no longer knows how to make. Worse: the places where they do know how to make those things are no longer America's allies.

Can they be America's allies again? Well, sure, but only in a limited, Carneyist, "minilateral" way, in which countries form temporary alliances to accomplish specific goals. Biden spoke of "friendshoring" production of key goods and services. Friendshoring implies a reliable form of friendship, the sort that is built on decades of trust and interdependence. Friendshoring only works if the friends you friendshore to can be relied upon to stay your friends. Do we really think that if Venezuela deposes the puppet regime Trump installed after kidnapping the country's leader that it will remain America's "friend?"

That's the problem with weaponized interdependence: it only works for so long as the country America is screwing remains dependent on America, and now every country in the world is moving heaven and earth to break their dependencies on America, its institutions and products:

https://pluralistic.net/2023/10/10/weaponized-interdependence/#the-other-swifties

As Nate Bethea says on this week's Trashfuture podcast, airports outside of the USA are now filled with large, splashy ads urging businesses to move their IT out of America's cloud and off of American apps:

https://pluralistic.net/2023/10/10/weaponized-interdependence/#the-other-swifties

After Microsoft obliged the Trump regime by taking away the online accounts of foreign officials who made Trump angry, will any other country ever voluntarily trust them with their industrial capacity, let alone their government?

https://www.forbes.com/sites/emmawoollacott/2025/07/22/microsoft-cant-keep-eu-data-safe-from-us-authorities/

I'm not saying America is a write-off: I'm saying that it has been sabotaged down to the foundation slab and structural members by a psychotic cadre of skilled arsonists, who were abetted by mad bombers who drove themselves even crazier by racking up life-altering debts in rigged "prediction markets" that serve as a vehicle for bankrupting yourself by wishcasting away your life's savings by betting on every aspect of a Permanent Chud Reich, as corrupt officials make out like bandits by trading on insider information.

When America comes back (if America comes back), it will not be as the organizing platform for the world's finance, military, technology and commerce. In years or perhaps decades, America may find a new stable place in the international community. But in the meantime, it cannot be relied upon to serve as the world's hyperpower. Trump forever disqualified America from enjoying that privileged place – and just to be sure, he destroyed its capacity to even try.


Hey look at this (permalink)



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

Object permanence (permalink)

#25yrsago Open wifi saves traveler from hotel dial-up gouging https://memex.craphound.com/2001/11/09/i-just-wanna-say-that/

#25yrsago Why Cryptosystems Fail https://www.cl.cam.ac.uk/archive/rja14/wcf.html

#25yrsago Bruce Sterling on Pokemon https://web.archive.org/web/20050908070521/https://www.wired.com/news/audio/interviews/sterling_11.mp3

#20yrsago Fred von Lohmann’s talk at USC https://web.archive.org/web/20061110090032/https://centeronpublicdiplomacy.com/podcasts/061107_von_lohmann.mp3

#20yrsago Secret WIPO memo: rich countries to kill Broadcast Treaty, Development Agenda https://www.ip-watch.org/2006/11/07/developed-country-strategy-on-wipo-development-agenda-governance-revealed/?res=1024_ff&print=0

#20yrsago Canadian copyright czar forced to turn away industry bribes https://web.archive.org/web/20101018194506/http://www.michaelgeist.ca/index.php?option=com_content&task=view&id=1521&Itemid=125

#20yrsago Copyright explained through a wild west metaphor http://www.greglondon.com/bountyhunters/

#20yrsago Why Zune shouldn’t pay blood money to Universal https://cdm.link/universal-microsoft-screw-over-artists-set-absurd-and-dangerous-precedent-with-zune/#more-1719

#15yrsago New Fed warrantless GPS trackers discovered in the wild https://web.archive.org/web/20111110191030/https://www.wired.com/threatlevel/2011/11/gps-tracker-times-two/all/1

#15yrsago Occupy Atlanta encamps on lawn of house under foreclosure threat https://web.archive.org/web/20111109225513/https://thinkprogress.org/special/2011/11/08/363692/occupy-atlanta-encamps-in-neighborhood-to-save-police-officers-home-from-foreclosure/

#15yrsago Ben from Ben and Jerry’s serves ice-cream to Occupiers https://www.fastcompany.com/1678825/the-ice-cream-man-of-zuccotti-park-ben-cohen-on-his-work-with-occupy-wall-street

#15yrsago Identity theft marketplace sells mothers’ maiden names, dates of birth, etc https://krebsonsecurity.com/2011/11/how-much-is-your-identity-worth/

#15yrsago Policy-by-nudging unsupported by evidence, and undemocratic https://web.archive.org/web/20111112154542/https://www.newscientist.com/article/mg21228376.500-nudge-policies-are-another-name-for-coercion.html

#15yrsago Wired.com photo policy: all staff-produced photos will now be Creative Commons licensed https://web.archive.org/web/20111111051330/https://www.wired.com/rawfile/2011/11/creative-commons/?pid=1365&pageid=6275

#15yrsago “Piracy-stricken” Viacom CEO tops pay-raise charts https://www.techdirt.com/2011/11/07/viacom-decimated-piracy-its-ceo-got-biggest-raise-any-exec-anywhere/

#15yrsago Boyett’s Mortality Bridge: Rock n’ roll Dante meets Orpheus https://memex.craphound.com/2011/11/08/boyetts-mortality-bridge-rock-n-roll-dante-meets-orpheus/

#10yrsago FAA okays use of semi-autonomous drones for Disneyland and Disney World fireworks displays https://web.archive.org/web/20161110065859/http://thedisneyblog.com/2016/11/07/disney-drones/

#10yrsago Glenn Beck’s “decency” doesn’t extend to answering questions about why he was such an asshole https://wnyc.org/story/beck-changed-man

#10yrsago CBC threatens podcast app makers, argues that RSS readers violate copyright https://www.reddit.com/r/podcasts/comments/5bmzuj/cbc_are_blocking_podcast_apps/

#10yrsago Winter Denial of Service attack knocks out heating in Finnish homes https://web.archive.org/web/20161109214609/https://metropolitan.fi/entry/ddos-attack-halts-heating-in-finland-amidst-winter

#10yrsago Women are flocking to Susan B Anthony’s grave to cover it with “I Voted” stickers https://www.thecut.com/2016/11/susan-b-anthonys-grave-will-be-open-until-the-polls-close.html

#10yrsago Edward Snowden to Trump campaign: “old laptops” could vet 800,000 emails in “minutes-to-hours” https://web.archive.org/web/20161107235120/https://www.yahoo.com/news/edward-snowden-crushes-conspiracy-theory-053349259.html

#10yrsago My neighborhood realtor is determined to turn a buck on electoral eschatology https://memex.craphound.com/2016/11/08/my-neighborhood-realtor-is-determined-to-turn-a-buck-on-electoral-eschatology/

#10yrsago A history of Chinese science fiction, from 475 BC to Cixin Liu https://web.archive.org/web/20161105172922/http://mithilareview.com/wang_11_16/

#10yrsago How Audi cheated emissions tests: if (steering) then (pollute) https://www.jalopnik.com/america-figured-out-a-new-way-audi-cheated-on-emissions-1788630969/

#10yrsago Senate investigates Wells Fargo retaliations against whistleblowers https://web.archive.org/web/20161108210544/http://www.warren.senate.gov/files/documents/2016-11-03_Wells_Fargo_FINRA_Violations_Letter_Final.pdf

#10yrsago A madman has been given the keys to the surveillance state https://memex.craphound.com/2016/11/09/a-madman-has-been-given-the-keys-to-the-surveillance-state/

#5yrsago Stockholm's war on interoperability https://pluralistic.net/2021/11/09/skrota-skolplattformen/#privacy-without-monopoly

#5yrsago Right-Clicker-Mentality https://pluralistic.net/2021/11/08/tina-v-tapas/#spoilsports-r-us

#5yrsago Charlie Jane Anders' Victories Greater Than Death https://pluralistic.net/2021/11/08/tina-v-tapas/#the-chosen-ones

#5yrsago Imagining the end of capitalism https://pluralistic.net/2021/11/08/tina-v-tapas/#its-pronounced-tape-ass

#1yrago Facebook's fraud files https://pluralistic.net/2025/11/08/faecebook/#too-big-to-care


Upcoming appearances (permalink)

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



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

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027
  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 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



Colophon (permalink)

Today's top sources:

Currently writing:

  • “Once Is Enemy Action,” a science fiction novel about the origins of modern technofascism. Today's words: 574 (7730 total).

  • "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.


How to get Pluralistic:

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

Pluralistic.net

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

https://pluralistic.net/plura-list

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

https://mamot.fr/@pluralistic

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

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

Medium (no ads, paywalled):

https://doctorow.medium.com/

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

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

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

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

ISSN: 3066-764X

06:56

Girl Genius for Monday, November 09, 2026 [Girl Genius]

The Girl Genius comic for Monday, November 09, 2026 has been posted.

06:07

Urgent: Investigate LICE's arrests of children [Richard Stallman's Political Notes]

US citizens: call on Congress to investigate LICE's arrests of children.

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.

The Guardian refutes Israel's attempt to invalidate the movie NAZA [Richard Stallman's Political Notes]

The Guardian refutes Israel's attempt to invalidate the movie NAZA, which presents Israeli soldiers and officials describing how they knowingly approved war crimes.

Urgent: Regulation of spending on political campaigns [Richard Stallman's Political Notes]

US citizens: call on Congress to pass a constitutional amendment to allow regulation of spending on political campaigns.

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.

Modi jailed leaders of Cockroach Janta Party [Richard Stallman's Political Notes]

Modi has jailed leaders of the Cockroach Janta Party, trying to crush their protest against taking millions of Indians off the voting list.

Experiment arranged by RFK jr [Richard Stallman's Political Notes]

RFK jr has arranged an experiment which will deny thousands of babies Hepatitis B vaccine at birth, and see how many get sick.

I wouldn't quite call this experiment "Nazi", but it is leaning in that direction.

Testing of live facial recognition in London [Richard Stallman's Political Notes]

*[Testing] of live facial recognition in London [train] stations ends with a false positive and no arrests.*

Despite this failure, they want to continue the test. I suspect that the motive is not catching "offenders and people breaching court orders", but rather at catching protesters and dissidents. It certainly isn't aimed at catching people who knowingly build apartment buildings using materials create a danger of fatal fires.

Delayed attack in the 2025 Big Bad Bill [Richard Stallman's Political Notes]

A delayed attack in the 2025 Big Bad Bill will deny medical coverage to millions of Americans at of the start of 2027.

Over 80 million Americans depend on Medicaid. The new requirements were designed so that millions would fail to meet the complex requirements to stay on the rolls.

Protest planned by Cockroach Janta Party [Richard Stallman's Political Notes]

The Cockroach Janta Party planned a protest against Modi's removal of around 140m voters from the voter list.

That is over 20% of the people who voted in the last general election.

Push to delay report on greenhouse emissions [Richard Stallman's Political Notes]

Big oil exporters, and a few other countries, are pushing to delay the next world report on the status of greenhouse emissions and global heating.

I suspect that the exporters may have bought the support of a few other countries, perhaps with the help of pressure from the corrupter.

People forcibly "returned" to Bangladesh from India [Richard Stallman's Political Notes]

Modi's repressive campaign is not stopping with disenfranchisement: some who have lived their whole lives in India have been forcibly "returned" to Bangladesh.

Mental health study of British youth [Richard Stallman's Political Notes]

A study of mental health of British youth concludes that they are not pushovers or "snowflakes" — rather, mental illness diagnoses are increasing because life has become more stressful and more difficult to succeed at.

Bully limited Ukraine's use of Starlink [Richard Stallman's Political Notes]

The bully has Ukraine's use of Starlink, making it mostly defenseless against Putin's jet-powered drones.

He has been seeking an opportunity to join Putin, over and over.

Underestimating damage likely from climate crisis [Richard Stallman's Political Notes]

A whistleblower reports that insurance companies face pressure to underestimate the magnitude of the damage likely to result from future disasters caused by the climate crisis. If disasters are indeed more damaging than expected, insurance companies could fail, and cities could become unviable.

Deportation thugs ran their car over Miguel Parra Hernandez [Richard Stallman's Political Notes]

Deportation thugs ran their car over Miguel Parra Hernandez, who had ran away from them because he was afraid they might be deportation thugs.

The driver faces possible prosecution, and LICE as usual is interfering with the investigation.

Wikipedia has a thorough explanation of the Hispanic system of personal names. Assigning Miguel Parra the single family name "Parra-Hernandez" is a confusing Anglophone modification. Since it isn't normal anyway, we are entitled to reject it. I reject it because stating both apellidos every time is a nuisance for all concerned.

Corruption is a two-way street [Richard Stallman's Political Notes]

Under the corrupter, corruption is a two-way street: magat officials drop charges against corporations, and those donate to magat campaign funds.

The canceled charges affected 205 corporations.

Commercial publication of Sally Rooney's books criminalized [Richard Stallman's Political Notes]

The UK's evidently unjust criminalization of stating support for the group Palestine Action has criminalized continued commercial publication of Sally Rooney's books in the UK. Therefore, sales have ceased, or soon will.

She could, if she wishes, distribute them at no charge via a network server outside the UK.

Department of Injustice demands deletion of voters [Richard Stallman's Political Notes]

The Department of Injustice demands some states delete names from their voter lists based on vague supposed doubts about whether they are citizens.

Voting rights defenders responded in court that federal law specifies exactly what proofs are sufficient for demanding deletion from the voter list, and the Department of Injustice it does not have the sufficient reasons.

UK sanctions on products made in Israel's colonies in West Bank [Richard Stallman's Political Notes]

The UK said it will put economic sanctions on products made in Israel's colonies in the West Bank, and several other kinds of sanctions as described here.

There is a strange ambiguity in the words of the article; I can't tell whether that ambiguity was present in what Secretary Milliband actually said.

All of Israel's colonies in Palestinian territory are illegal under international law. Israel divides them into the ones Israel has officially authorized and the ones that Israel nominally considers illegal (though it winks at them anyway). When the article says "illegal settlements", I can't tell whether that refers to all of them, or only the ones that Israel labels as illegal.

Milliband's quoted words, "Settlements are illegal," suggests he means all the colonies. That ought to be the UK's policy — but I can't tell from this article. The article's "illegal settlements" suggests it is making the same distinction that Israel makes, between two kinds of colony.

Moral squalor of corrupter and his henchmen [Richard Stallman's Political Notes]

While most Democrats campaign on the most superficial level of the cost of living, Robert Reich turns attention to the moral squalor of the corrupter and his henchmen.

The increasing cost of living in the US is partly due to the increased power that billionaires have over the practices of business and government. Taking away their power and redirecting wealth away from billionaires and to the non-rich will reduce the cost of living, as a side effect. But if we focus on that, we won't strike at the root of the problem.

Israeli "settlers" attacked diplomats and officials [Richard Stallman's Political Notes]

Thuggish Israeli "settlers" attacked European diplomats and officials who were visiting Palestinian territory as witnesses.

France, Belgium and Poland should respond to this with sanctions directed at the systematic violence against Palestinians in the West Bank and Gaza.

Torture of Palestinian prisoners [Richard Stallman's Political Notes]

B'tselem reports on the torture by Israeli guards of Palestinian prisoners, which became totally ingrained during 2025.

Israel's general practices of torture are well known because Israeli officials publicly boast about them. Strangely, when they release Palestinian prisoners, Israeli guards threaten to put them back in prison if they tell anyone what was done to them there. Perhaps they fear that the testimony of individual Palestinians could enable someone to prosecute individual torturers.

Here is the earlier report from 2024.

05:21

02:42

Momma Raised Him Right [QC RSS v2]

he's a good boy. an idiot, but a good boy

Sunday, 08 November

20:28

View From a Hotel Window, 11/8/26: Nashville [Whatever]

Looks like the folks here in Nashville might be putting up a new little sports thingie.

And yes, there is construction noise! So much beeping and clattering! Not that I really noticed; once I got into my room (early check-in FTW) after a very early wake up and arrival, I lost consciousness so fast. I am adequately slept now and spending my Sunday early afternoon being lazy.

But tonight! I‘ll be at Novelette Booksellers at 6:30! You should come see me! And then tomorrow, I will be in Louisville, Kentucky for an event at Carmichael’s Bookstore. 7pm! Show up!

— JS

19:42

Link [Scripting News]

A while back I must have read a review of JBL Tune Flex earbuds and bought a pair. The sound was awful, almost no bass, flat, low volume. I have always been looking for earbuds that get loud. So I put them away and forgot I had them, still looking for the holy grail of earbuds. Now, a few years later, I was looking around in a drawer, pulled them out, and when I had some time to mess around I found out the problem had something to do with how I placed them in my ears. Properly placed the volume was ample and the bass was inspiring. Just took a walk with them on and I love them. I wonder which other buds I tried and gave up on too quickly?

17:28

Link [Scripting News]

John Gruber: "Markdown is my sole creation. Aaron Swartz was my best, by far, beta tester and the first person other than me to get excited about it." I am glad to get a concise statement about this from Gruber. And from what I recall of Aaron that sounds about right too.

15:21

Birger Schacht: Using incus for throw away VMs [Planet Debian]

For some time now I’ve been looking for a way of keeping projects I’m working on in a separate VM without much setup. There are numerous solutions to do this kind of thing using namespaces (various container technologies, firejail, flatpak, bubblewrap, …) but I wanted something that uses real virtualization. I recently stumbled upon incus and it seemed like it could be a solution to my problem. Incus is a manager for both containers and virtual machines. It is possible to create VM images that can be used as templates, meaning that other machines can then be based on them on creation. Virtual machines can be configured using “profiles”.

For my use case, I have created a profile that defines how my template image should look like. In this profile I use cloud-init to configure the template machine on startup:

config:
  cloud-init.user-data: |
    #cloud-config
    apt:
      conf: |
        APT {
          Install-Recommends 0;
        }
    package_update: true
    package_upgrade: true
    package_reboot_if_required: true
    packages:
      - file
      - man-db
      - bat
      - eza
      - git
      - git-delta
      - neovim
      - zsh
      - tmux
      - curl
      - ncurses-term
      - hx
      - nix-bin
      - nix-setup-systemd
      - rustup
      - npm
      - podman
    users:
      - name: user
        lock_passwd: false
        # mkpasswd 'incus password'
        hashed_passwd: $y$j9T$p9XBP4Ox3SBUnyu.sqv5m1$f1rxcPJyVs05w./dZvIzu6.4dVWBvzu99nMBZRNlamD
        groups: sudo, nix-users
        shell: /usr/bin/zsh
        uid: 1000
    write_files:
      - path: /home/user/.config/nix/nix.conf
        content: |
          experimental-features = nix-command flakes
        permissions: 0600
      - path: /home/user/.zshrc.local
        content: |
          export PATH="$PATH:$HOME/.nix-profile/bin"
        permissions: 0600
    runcmd:
      - [curl, -sSfL, -o, /home/user/.tmux.conf, https://grml.org/console/tmux.conf]
      - [curl, -sSfL, -o, /home/user/.vimrc, https://grml.org/console/vimrc]
      - [curl, -sSfL, -o, /home/user/.zshrc, https://grml.org/console/zshrc]
      - [chown, -R, user:user, /home/user/]    
description: Base template for dev VMs
...

and I use a script to regenerate the template image when I want to adapt the config:

#!/bin/sh

#set -e
set -x

NAME=dev-vm-template

# adapt the profile before rebuilding the template image
incus profile edit cloud-dev-template
incus delete --force ${NAME} || true
incus create images:debian/13/cloud --vm --quiet --profile default --profile cloud-dev-template ${NAME}
incus start ${NAME}
incus wait ${NAME} agent
incus exec ${NAME} -- cloud-init status --wait || true
incus stop ${NAME}
incus publish --alias cloud-dev-template --reuse ${NAME}

This script uses the debian/13/cloud image together with my cloud-dev-template profile to set up a machine, configure it using cloud-init and store the result as an image called cloud-dev-template.

inker

To use this setup, I created a small python tool called inker that talks to the incus REST API. Using inker create creates a new VM based on my template. Using inker attach attaches the current working directory to a VM as a readonly mount. It is possible to combine those commands like inker create | inker attach to do those two steps in one command. inker login logs into the VM that has the current directory attached. This way I can create VMs that are connected to directories on my filesystem.

I am currently playing around with this setup, but I think this could help me to have a throwaway development machine, similar to dev containers. I’m not sure yet how happy I am with incus, though. I was also looking at systemd-vmspawn, but there are still some features missing that I would need. But I might rewrite inker at some point to use a different backend.

13:28

Joe Marshall: Why vibe code in Lisp? [Planet Lisp]

Why Target Common Lisp for Code Generation?

I've been asked twice now: if the generated code doesn't matter—if the AI is doing the heavy lifting of writing the syntax—why do I vibe code in Common Lisp?

Why not target Python, TypeScript, or Java? These are mainstream languages with massive training sets. The models can generate code in them with a high degree of statistical accuracy. So why do I choose to target a niche language like Common Lisp for code generation?

There are a lot of reasons, and they all come down to the same age-old question. Why use Lisp when you could use a more popular language? The answer is that language popularity is a poor proxy for utility and expressiveness. The Lisp community has long known this - it is why we chose Lisp in the first place. Selecting for popularity is what middle managers do to ensure that they can always find a warm body to maintain the code. It is not what elite hackers do.

  1. The Baseline of Expertise First, I have been programming in Common Lisp for decades. I know it intimately. Vibe coding requires a human architect to supervise the machine. When I look at the code generated by the model, I can tell in a fraction of a second whether it is any good, or if the model is hallucinating a dead-end. You cannot successfully orchestrate an AI in a language you don't deeply understand.
  2. Abstraction over Implementation Most modern languages force you to describe exactly how a machine should shuffle bits around. Lisp was designed as a language for expressing high-level abstractions rather than expressing tedious implementation details. When I prompt the AI, I want it generating architectural logic, not fighting with boilerplate just to manage basic state.
  3. Designed for the Elite Let's be honest: Lisp is a language designed by and for elite hackers, not for the masses. It doesn't hold your hand, and it doesn't pander to lowest-common-denominator programming bootcamp patterns. When you use it as a target language, you are operating in an environment built for maximum expressiveness.
  4. Homoiconicity and the AST This is perhaps the biggest technical advantage. Lisp is homoiconic—the code is structured as the data it manipulates. When an LLM generates Python or Java, it has to predict surface syntax: whitespace, brackets, semicolons, and rigid class structures. When an LLM generates Lisp, it is operating directly at the level of the Abstract Syntax Tree (AST). It is predicting pure structure. Removing the syntactic friction is a massive advantage for AI code generation.
  5. Macros as Context Compression In vibe coding, the LLM's context window is your most precious resource. Lisp's macro system allows for a highly effective form of context compression. Instead of the AI repeatedly generating verbose boilerplate, you can hide that boilerplate behind a macro. The AI learns the macro, uses it, and saves thousands of tokens, allowing you to maintain massive architectures within the model's memory constraints.
  6. Introspection in the REPL I do not operate the LLM in a sterile text editor. I operate it from within a Lisp REPL. This allows the LLM to introspect the program while it is under development. If we need to know the state of a specific object or function, the model can query the live environment. You are not writing dead text; you are conversing with a living system.
  7. Superior Error Handling When the AI writes bad code (and it will), Lisp's condition system provides superior error handling and debugging facilities. Instead of a hard crash that requires a full reboot, the error is caught, and the LLM can analyze the stack trace and debug the generated code interactively, right at the point of failure.
  8. No Ab Initio Restarts Using the REPL means you don't have to start your program ab initio (from the beginning) every time you want to test a change. In a compiled, mainstream language, a one-line AI fix requires a full rebuild and state reset. In Lisp, you just redefine the specific function and immediately test it in the REPL while the rest of the application's state remains perfectly intact. The iteration speed is unmatched.

You don't give an elite hacker a code monkey language. I want my AI to be an elite hacker, not simply a code monkey. If I expect my AI to work at an elite level, I should give it elite tools, not a code monkey language.

Joe Marshall: RFC 6238 in Common Lisp [Planet Lisp]

I wanted to implement 2FA as per RFC 6238. This is the Time-based One-Time Password (TOTP) algorithm that is used by Google Authenticator and other 2FA apps. This was originally `vibe coded`. The vibe coding got me 80% of the way there, and I made a manual pass to turn it into a more functional style.

Feel free to use this under an MIT license.

;;; -*- mode: lisp; coding: utf-8-unix; -*-

;;; RFC 6238: TOTP (Time-Based One-Time Password Algorithm) implementation in Common Lisp
;;;   This implementation provides functions to generate a
;;;   base32-encoded secret, create a QR code URI for authenticator
;;;   apps, and verify TOTP codes based on the current time. It
;;;   adheres to the specifications outlined in RFC 6238 and RFC 4226.

;;; Dependencies: cl-base32, ironclad

(in-package "TOTP")

(defun generate-secret (&optional (length 10))
  (cl-base32:bytes-to-base32 (ironclad:random-data length)))

(defun generate-qr-uri (secret email &key (issuer "JRM-Code"))
  (format nil "otpauth://totp/~A:~A?secret=~A&issuer=~A" issuer email secret issuer))

(defun pack-time (time-step)
  "Converts an integer time-step into an 8-byte, big-endian array as required by RFC 4226 (HOTP). 
 Used to construct the message payload for the HMAC-SHA1 operation."
  (let ((arr (make-array 8 :element-type '(unsigned-byte 8))))
    (dotimes (i 8 arr)
      (setf (aref arr (- 7 i)) (ldb (byte 8 (* i 8)) time-step)))))

(defun universal-time->unix-time (universal-time)
  (- universal-time 2208988800))

(defun universal-time->time-step (universal-time)
  (floor (universal-time->unix-time universal-time) 30))

(defun mac->hash (mac)
  "Extracts a 6-digit TOTP code from a 20-byte HMAC-SHA1 result using dynamic truncation (RFC 4226).
 Takes the lower 4 bits of the final byte as an offset, extracts a 31-bit slice starting at that offset, 
 and returns the value modulo 1,000,000 to produce the final 6-digit integer."
  (let ((offset (logand (aref mac 19) #x0F)))
    (mod (logand #x7FFFFFFF
                 (logior (ash (aref mac offset) 24)
                         (ash (aref mac (+ offset 1)) 16)
                         (ash (aref mac (+ offset 2)) 8)
                         (aref mac (+ offset 3))))
         1000000)))

(defun mac->hash-string (mac)
  (format nil "~6,'0D" (mac->hash mac)))

(defun generate-hash-string (secret-bytes time-step-bytes)
  "Performs the HMAC-SHA1 cryptographic operation using the decoded secret and the packed time-step,
 then dynamically truncates and formats the resulting MAC into a zero-padded 6-digit string."
  (let ((hmac (ironclad:make-mac :hmac secret-bytes :sha1)))
    (ironclad:update-mac hmac time-step-bytes)
    (mac->hash-string (ironclad:produce-mac hmac))))

(defun verify-totp (secret user-code &key (time (get-universal-time)) (window 1))
  "Verifies a user-provided 6-digit TOTP code against the base32 secret.
 Defaults to the current universal time. The :window keyword determines the allowable drift in 30-second steps
 (e.g., a window of 1 checks the previous, current, and next 30-second intervals).
 Returns T if the code matches within the window, otherwise NIL."
  (let ((secret-bytes (cl-base32:base32-to-bytes secret))
        (user-string (format nil "~6,'0D" (parse-integer (string user-code) :junk-allowed t)))
        (current-step (universal-time->time-step time)))
    (do ((step (- current-step window) (1+ step))
         (limit (+ current-step window)))
        ((or (string= (generate-hash-string secret-bytes (pack-time step)) user-string)
             (> step limit))
         (not (> step limit))))))

Get it at http://github.com/jrm-code-project/totp/

Joe Marshall: Lisp-p [Planet Lisp]

I needed a function that could tell whether a string was a valid Common Lisp program. In theory, you could just call read on the string and see if it throws an error, but I don't want to throw random text at read. It could contain a reader macro or something nasty. It also would intern a ton of random symbols into the current package. I wanted a function that would act mostly like the reader, but not CONS any data or intern any symbols.

So I vibe coded a function that does just that. It implements the reader algorithm as a state machine but does not actually read any data. The state machine tracks the list and string delimeters and tokenizes the string, but it discards the tokens and does not intern any symbols. It just checks that the state machine is in `top level' state at the end of the string. If it returns NIL, the string is definitely going to cause an error if you try to read it. If it returns T, it does not guarantee that the string represents a valid Common Lisp program, but rather that it is not obvious that the reader will throw an immediate error.

A curious edge case is that of an unpunctuated string. The words in the string will read as a simple sequence of symbols, which is perfectly valid.

The code is in lisp-p on GitHub. You call the function lisp-p with a string or a stream and it will return T or NIL.

10:14

Ambiguity or clarity? [Seth's Blog]

This is a choice we rarely name.

Putting effort into how much ambiguity we can handle can define a career and give us a path forward in our social and cultural interactions as well.

Our desire for clarity is based on safety and how we think about risk. If you know exactly what to expect, you won’t be held responsible for things that feel like they’re out of your control.

Clarity pushes us to put things in a category, a predictable box, well-labeled.

Ambiguity, on the other hand, is the nature of the future. All interactions with other people, with complex systems and with what hasn’t happened yet are somewhat unpredictable.

That range of outcomes is where possibility lies.

“I’m not sure.”

“This might not work.”

“We’ll be okay.”

Pretending that the ambiguous is certain is a short-term sort of bravado that works in the movies and politics but not in real life.

For the rest of us, there’s the chance to embrace the soft edges of ‘perhaps’ on our way to make things better.

HT to Seth B.

Saturday, 07 November

22:35

View From a Hotel Window, 11/7/26: Cleveland Airport [Whatever]

There are bodies down there, I can feel it. But it’s certainly a change from a parking lot.

My event today, at the Hudson Library, has already happened and it was lovely. Tomorrow, I am in Nashville, at Novelette Booksellers, and the event starts at 6:30. Come say hello! Here’s the ticket information.

— JS

21:28

Dirk Eddelbuettel: prrd 0.1.0 at CRAN: Now With Real Concurrency [Planet Debian]

A new release of prrd arrived at CRAN today, and has already been built for r2u and on r-universe. The prrd package facilitates the parallel running [of] reverse dependency [checks] when preparing R packages. It is used extensively for releases I make of Rcpp, RcppArmadillo, RcppEigen, BH, and others.

prrd screenshot image

The key idea of prrd is simple, and described in some more detail on its webpage and its GitHub repo. Reverse dependency checks are an important part of package development that is easily done in a (serial) loop. But these checks are also generally embarassingly parallel as there is no or little interdependency between them (besides maybe shared build depedencies). See the (somewhat dated) screenshot (running six parallel workers, arranged in a split byobu session).

This release updates internals to allow for greater concurrency. SQLite is used as the backend, both for the job queue (managed via the liteq package) as well as for storing actual reverse-dependency test results. It is well-known that SQLite copes quite well with multiple readers. Multiple concurrent writers are more challenging. We tended to get by via BEGIN EXCLUSIVE pragma use, but still get occassional issue even at a somewhat moderate concurrency levels. After some back and forth and trying a few approaches, more recently we established one first solution relying on very explicity (OS-level, filesystem-based) locking via package filelock. That worked.

We mentioned this in an old liteq issue that had circled around the same question with a number of posts over the years, but no resolution. This comment seemingly awoke Gábor, and he nailed this years-open issue with a fine pull request deploying BEGIN IMMEDIATE and well as a loop around tryCatch to not immediately fail. I borrowed/ported that approach to prrd and we now have a second solution (and no longer need filelock). On a somewhat better server with enough cores and memory, I am now running eighteen concurrent workers—watched via three multi-pane byobu windows. Works like a charm without issues. At last! A big thanks to Gábor for finding another solution, and especially that only relies on SQLite.

The release is summarised in the NEWS entry:

Changes in prrd version 0.1.0 (2026-11-07)

  • Concurrent operations are now supported via updated sqlite semantics borrowed with appreciation from liteq

  • This follows an interim solution relying on filelock use; however this later package is not needed so no increase in dependencies

Courtesy of my CRANberries, there is also a diffstat report for this release.

This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can sponsor me at GitHub.

19:56

MorphOS 3.21 released with new office suite [OSnews]

About five months after the previous release, the MorphOS team has released MorphOS 3.21. It brings the usual list of big fixes and smaller improvements, but there’s a few big ticket items in here as well.

MorphOS 3.21 introduces BasicWorks, an office suite made up of CellBasics and PageBasics. It offers document and spreadsheet authoring and loads and saves Microsoft Office and OpenOffice documents. Also new are NVMEMount, an auto-mounter for booting from and mounting NVMe partitions, and the Marbles and Cyber 3D blankers.

Graphics performance has been improved, with a faster Radeon driver on cards with little video memory thanks to GART backed bitmap transfers, quicker TinyGL texture copies, hardware accelerated antialiased text in TTEngine and much faster color SVG glyph rendering in Cairo. The Bcm43xx wireless driver has been substantially reworked, with automatic transmit rate selection, updated firmware and numerous connection fixes. PowerBook and iMac hotkeys are now fully configurable.

↫ MorphOS 3.21 release announcement

The BasicWorks office suite has been in the works for a while now, and more information on it can be found in a thread on the MorphZone forums and on the website for the spreadsheet component of the suite, CellBasics. The formula loaders and xlsx loaders are ports of open source projects, but the rest of the application is new code based on ObjectiveC++ and Cairo/Harfbuzz. It uses its own file format, but can import csv and xslsx files, so I’m assuming the same more or else applies to the word processor (but with docx, of course).

Alongside MorphOS 3.21 also comes a new release for Wayfarer, the web browser the Amiga-inspired operating system uses. Wayfarer 12.0 moves to WebKitGTK 2.52.5 (which was released in July of 2026, so it’s quite up to date), and now uses the Skia graphics library. R300-R500 Radeons will render websites with Skia-GL for some massive performance improvements, helped further along by a slew of additional performance optimisations. Adblocking has been improved as well, YouTube should work a lot better now, and much more.

The full release notes for MorphOS 3.21 give you all the details.

The port that does not exist [OSnews]

Ask any program to listen on port 0 and it will hand you a socket on port 47193…or 58037…or whatever the kernel felt like that day. Port 0 is not a port you can have. It is the number you pass when you want the operating system to pick one for you.

But a TCP header is just bytes. The destination port field is 16 bits wide, and 0x0000 fits in 16 bits as well as anything else does. Nothing on the wire stops a packet from being addressed to port 0. Your tools will refuse it, your browser will block it, and your scanner’s default port list skips it, because everyone agrees it isn’t a real port.

Which makes it a pretty good place to hide things, whether anyone meant to or not. So we did some TCP cowboy shit & port scanned the entire fucking internet for open ports on port 0, which uncovered some interesting unexpected findings.

↫ acidvegas

An awesome and entertaining read. Don’t skip this one.

Windows 11 27H2 might be a more substantial upgrade [OSnews]

A little tidbit of news regarding the nest major update to Windows, known as Windows 11 27H2. Apparently, it’s going to come with some more serious changes to the codebase, therefore necessitating a full operating system swap instead of a mere enablement package, much like Windows 11 24H2 was.

For those who need a refresher, Microsoft has long been rumored to be running on a three-year release cadence and for a while, it was even thought that the company would launch Windows 12 in 2H 2024. That evidently didn’t happen, as instead we got Windows 11 24H2, but it was a major upgrade, a full OS swap compared to Windows 11 23H2 and 22H2. Essentially, it looks like every three releases, Microsoft is performing a full swap with major changes in the underlying codebase, and it seems to line up with Windows 11 27H2 as well. At the moment it’s not known if system requirements will change or not.

↫ Sayan Sen at Neowin.net

Microsoft is currently testing adding support for Intel’s Advanced Performance Extensions, which should yield improved 64bit performance and reduced power consumption. It makes sense to assume this support will be coming with Windows 11 27H2, which should hopefully lead to tangible performance improvements across the board.

Also, there’s going to be a new default wallpaper. Be still my beating heart.

19:14

Link [Scripting News]

And this is what my long-form Markdown-based posts look like.

18:28

Flushing is a cultural center!?? [Scripting News]

This is so heartening. America never disappeared, it just was asleep, lulled into naivete by the dashing figure Trump cast on his TV show, and he said some of the right things in his 2016 campaign. Truthful things people had never heard from a candidate and wanted to hear and wanted to believe something would be done to make it better. I got this perspective listening to Dave Chappelle explain it. And Trump helped us buy straight talk from candidates. We're getting it now from the new crop of inspiring senators and governors. Remarkable times we live in, such highs and lows.

People from NY, such as myself, saw right through him. A typical bully -- we knew these people in grade school. There are people in my freaking family who are like Trump on a personality level. They push people around, but if you stand your ground they fade away.

Well now we've gotten together -- that's all we ever had to do -- work with each other -- and remember the greatness of the country that gave a home to us or our ancestors. We have not only got a big heart but we're also collectively smart enough to know that we always need to be growing, and for that we need fresh new citizens from around the world to keep things interesting.

I grew up in Flushing, NY -- part of NYC -- which was a sleepy Queens neighborhood made up of mostly Catholic and Jewish families when I was a child. Over the years, it became more Chinese and Korean. And it now has one of the best bagel places in the city. Everything is more alive there now. Main Street is both familiar and foreign.

(Utopia Bagels, on Utopia Parkway, technically in Whitestone.)

My mother, a refugee from the German Nazis as a child, didn't like that the neighborhood was changing, but I think it's fine, it's what makes the US and NY in particular so great. And while I still love a NYC diner breakfast or deli lunch, the Chinese and Korean food in Flushing is world-renowned and very tasty.

It still freaks me out that Flushing is famous for something so totally un-Flushing!

This election was like the 2008 election on steroids. We saw the election of Obama as a turning point. It was, but after his term was over, we snapped back to our slavery roots in reaction. This year, we re-asserted our love of country, not wanting to deprive the US of the fresh inspiration of immigrants of all races and genders, faiths, and and beliefs both religious and political. And once we, collectively, saw the aftermath of our turn toward fascism said, passionately -- no way, not here. The US is a melting pot. And we're good at it.

No one knew until Tuesday whether the old America of our parents and grandparents was still here, thankfully it is.

Now we have to continue to work together, to acknowledge our differences but also celebrate what we agree on. We are a democracy. We elect leaders but it is our country. The Trumps are still struggling with that, but don't ever forget it. This is the country that works, going through a really rough period.

17:42

Link [Scripting News]

I wrote a post on demo.rss.chat and you can read it on BonBonWeb. Markdown and RSS 2.0. We will provide a user-level way to connect between the two, but we're still a few steps from that. Today we proved that once we have the UI for setting it up, it should "just work." Small parts loosely joined.

Link [Scripting News]

What the big tech companies don't get is that independent developers can come up with big ideas and if they put limits in the way of those ideas being done in their world, then they aren't the petri dish or coral reef they aspire to be.

17:21

vindarel: CSV parsing in Common Lisp, data manipulation by columns with data frames [Planet Lisp]

Parsing CSV files is a common task. What are our options? We’ll start with cl-csv, add the data-table library, and present lisp-stat’s data frames.

This is another contribution to the Common Lisp Cookbook so you should read it there as this is where it will get updates.

With a very simple dataset we could split CSV lines manually (subseq, split-sequence, str:split, cl-ppcre...) but when a column contains the separator, a library starts to be useful.

And a library will be even more so to help us manipulate columns by name, to use tabular data structures, to automatically infer the columns’ types, and more.

I recommend:

  • for simple use, try cl-csv
  • if you’ll do statistics or want a good dataframes library, go for lisp-stats
  • to work with large datasets, see cl-csv’s :row-fn argument.
  • for the fastest parsing, maybe fare-csv, or DuckDB with cl-duckdb, which can also ingest much more file formats than CSV, including Excel.
Long time no see o/ I'm lisping more than ever though. CIEL got new features, I am the one reviewing, testing and merging Lem pull requests (it got so many features... you can follow on reddit), I am busy but I commit to my DB admin dashboard once in a while, I maintain and extend my apps in production... In the CL world so many things happened (that will be a blog post in January), for instance we got new good editors. I want to record videos about them. In the meantime, grab my course with this coupon :] (it's the best price I can offer). Thank you!

Table of Contents

Introduction: our test files

Let’s work together with this simple CSV file, persons.csv:

Alice,7,1
Bob,77,0

The separator is , (often the default in libraries).

For simplicity, the file doesn’t contain a headers row.

This second file, persons2.csv, contains headers:

name,age,lisper
Alice,7,1
Bob,77,0

Parsing with cl-csv

The cl-csv library is on Quicklisp.

(ql:quicklisp "cl-csv")

It allows to parse data from a string, from a file, or from any stream.

It may not be the fastest, but it has a decent set of quality-of-life features.

Please go read its README, as we don’t illustrate some of its features here. For example, it supports multiline quoted data, we can set the quote character, it has good error messages (line and column number, char index), etc.

For reference, this is the function signature of cl-csv:read-csv (C-c-s on Slime):

(cl-csv:read-csv stream-or-string :csv-reader csv-reader
                                             :row-fn row-fn
                                             :map-fn map-fn
                                             :data-map-fn data-map-fn
                                             :sample sample
                                             :skip-first-p skip-first-p
                                             :separator *separator*
                                             :quote *quote*
                                             :escape *quote-escape*
                                             :unquoted-empty-string-is-nil *unquoted-empty-string-is-nil*
                                             :quoted-empty-string-is-nil *quoted-empty-string-is-nil*
                                             :trim-outer-whitespace *trim-outer-whitespace*
                                             :newline *read-newline*
                                             :escape-mode *escape-mode*)

Parsing from a string

To parse from a string, just use cl-csv:read-csv:

(cl-csv:read-csv "Alice,7,1
Bob,77,0")
;; =>
(("Alice" "7" "1") ("Bob" "77" "0"))

It returns a list of lists, values are all strings.

Parsing from a file

Also use cl-csv:read-csv but give a pathname as argument, not only the filename as a string.

(cl-csv:read-csv #P"persons.csv")
;; =>
(("Alice,7,1") ("Bob,77,0"))

What happens if you omit the #P?

(cl-csv:read-csv "persons.csv")
;; =>
(("persons.csv"))

this looks strange and no, there is no bug ;)

To parse from a stream, see the library’s documentation.

Using another separator

Is ; the columns separator? Use cl-csv:read-csv’s :separator argument, or the global cl-csv:*separator* parameter.

For a Tab, use #\Tab.

(defparameter *csv-string* "Alice;7;1
Bob;77;0")

(cl-csv:read-csv *csv-string* :separator #\;)

;; OR

(let ((cl-csv:*separator* #\;))
  (cl-csv:read-csv *csv-string*))

Skipping the first row of headers

With cl-csv, use :skip-first-p.

However, we’ll use this row of headers as soon as we work with dataframes.

(cl-csv:read-csv "name,age,lisper
Alice,7,1
Bob,77,0"
 :skip-first-p t)

Returning a list of objects

So far, we got a list of lists with raw values as strings. We can do whatever we want with them. cl-csv has a :map-fn argument that we can use to create an object while parsing each row.

Let’s re-use our class definition from the CLOS chapter:

(defclass person ()
  ((name :initarg :name :initform "")
   (age :initarg :age :initform nil)
   (lisper :initarg :lisper :initform nil)))

We can parse our CSV and return a list of objects at once:

(cl-csv:read-csv #p"persons.csv"
  :map-fn (lambda (values)
             (make-instance 'person :name (nth 0 values)
                                    :age (parse-integer (nth 1 values))
                                    :lisper (if (equal "1" (nth 2 values)) t nil))))

Observe that:

  • we had to parse the age from a string to an integer ourselves
  • our file doesn’t have a headers row.

Streaming reads (for large files)

cl-csv provides the :row-fn parameter, that does something with each row and doesn’t return them. This allows us to work with large datasets.

In this example, the :row-fn function has side-effects after each row was read and passed to it. Our function returns a result, the mean of ages.

(let ((sum-ages 0)
      (nb-ages 0))
  (cl-csv:read-csv #p"persons.csv"
                   :row-fn (lambda (values)
                             (incf sum-ages (parse-integer (nth 1 values)))
                             (incf nb-ages)))
  ;; Age mean:
  (/ sum-ages nb-ages))

Using cl-csv’s reader information for debugging

cl-csv makes efforts to tell us where it is at its parsing. Here’s where to find the bits of information that will help us during debugging.

In this dummy example, we’ll observe cl-csv’s hints:

;; this is uncomplete CSV, parsing will raise an error:
(cl-csv:read-csv "Alice,7,1
Bob,77,0
Oh?")

;; =>

The value
  NIL
is not of type
  STRING
when binding STRING
   [Condition of type TYPE-ERROR]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] Exit debugger, returning to top level.

Backtrace:
  0: (SB-IMPL::PARSE-INTEGER10 NIL 0 NIL NIL) [external]
  1: ((LAMBDA (VALUES)) ("oh?"))
  2: (CL-CSV::READ-CSV-WITH-READER #P"persons.csv" :CSV-READER NIL :ROW-FN #<FUNCTION (LAMBDA (VALUES)) {1203B956DB}> :MAP-FN NIL :DATA-MAP-FN NIL :SKIP-FIRST-P NIL)
      Locals:
        #:.DEFAULTING-TEMP. = NIL
        CSV-READER = #<CL-CSV::CSV-READER LINE-IDX:2 CHARACTER-LINE-IDX:4 CHARACTER-IDX:23 "" {1203B99343}>

        ^^^^^ let's see more about this READER object.

        DATA-MAP-FN-P = NIL
        IN-STREAM = #<SB-SYS:FD-STREAM for "file /home/vindarel/cl-cookbook/persons.csv" {1203B96553}>
        MAP-FN-P = NIL
        #:NEW3 = #<FUNCTION (LAMBDA (VALUES)) {1203B956DB}>
        #:NEW5 = NIL
        #:NEW7 = NIL
        #:NEW9 = NIL
        ROW-FN-P = T
        STREAM-OR-STRING = #P"persons.csv"
  3: (CL-CSV:READ-CSV #P"persons.csv" :ROW-FN #<FUNCTION (LAMBDA (VALUES)) {1203B956DB}>)

We don’t see everything. Click or press Enter on the CSV-READER that is on the 2nd backtrace:

#<CL-CSV::CSV-READER {1203B99343}>
--------------------
Class: #<STANDARD-CLASS CL-CSV::CSV-READER>
--------------------
 Group slots by inheritance [ ]
 Sort slots alphabetically  [X]

All Slots:
[ ]  AFTER-QUOTED?      = NIL
[ ]  BUFFER             = ""
[ ]  CHARACTER-IDX      = 23         <------------ useful: character index in the file
[ ]  CHARACTER-LINE-IDX = 4
[ ]  DATA-MAP-FN        = CL-CSV::MAP-EMPTY-STRING-TO-NIL
[ ]  ENTRIES            = #(#<CL-CSV::READ-DISPATCH-TABLE-ENTRY {1203B98F93}> #<CL-CSV::READ-DISPATCH-TABLE-ENTRY {1203B99033}> #<CL-CSV::READ-DISPATCH-TABLE-ENTRY {1203B990D3}> #<CL-CSV::READ-DISPATCH-TABLE-ENTRY {1203B99173}> #<CL-CSV::READ-DISPATCH-TABLE-ENTRY {1203B99213}> #<CL-CSV::READ-DISPATCH-TABLE-ENTRY {1203B992B3}>)
[ ]  LINE-DATA          = #()
[ ]  LINE-IDX           = 2           <------------- useful: line index
[ ]  MAP-FN             = NIL
[ ]  PARSE-STREAM       = #<SB-SYS:FD-STREAM for "file /home/vindarel/cl-cookbook/persons.csv" {1203B96553}>
[ ]  READING-QUOTED?    = NIL
[ ]  ROW-FN             = #<FUNCTION (LAMBDA (VALUES)) {1203B956DB}>
[ ]  ROWS               = #()
[ ]  SKIP-ROW?          = NIL

[set value]  [make unbound]

Knowing the line causing an error and the file position is useful.

cl-csv and data-table: column names, column types, columns manipulation

data-table is a library by the same authors that brings a data structure that represents our CSV data.

A data table has rows of data, associates names to the columns, and guesses columns types.

Then, we can access values by row and column names, and manipulate columns (add data, take a substract etc).

We link cl-csv and data-tables together with the system cl-csv-data-table (defined in cl-csv).

(ql:quickload '("cl-csv" "data-table" "cl-csv-data-table"))

You don’t need to go read its README, as it is poorly documented (only in tests).

We’ll use the second CSV file, persons2.csv.

Let’s parse it:

(cl-csv:get-data-table-from-csv #p"persons2.csv")
;; =>
#<DATA-TABLE:DATA-TABLE {1205D151C3}>

This returns a DATA-TABLE object. What is it? We can inspect it:

(inspect *)

The object is a STANDARD-OBJECT of type DATA-TABLE:DATA-TABLE.
0. COLUMN-NAMES: ("name" "age" "lisper")
1. COLUMN-TYPES: (STRING INTEGER INTEGER)
2. ROWS: (("Alice" 7 1) ("Bob" 77 0))

We observe:

  • the data-table used our headers row
  • the columns’ types were inferred: “name” is a string, “age” and “lisper” are integers.
  • in each row, the “age” and “lisper” fields were parsed to an integer.

Let’s save our result to a parameter:

(defparameter *dt* **)

Get all rows with:

(data-table:rows *dt*)

Instead of accessing a column by its index, you can access it by its name.

Use data-table:data-table-value dt &key row row-idx col-name col-idx.

For example, what is the “name” of the first row?

(csv:data-table-value *dt* :row-idx 0 :col-name "age")
;; => 7

The library has more functions to manipulate columns and data-tables. We give them as a reference, and then we’ll see how lisp-stat does it.

data-table:number-of-rows and data-table:number-of-columns

data-table-to-plists, plists-to-data-table

Add columns together with (csv:add-column dt column-name [default] [column-type] [index]).

Select columns with (csv:select-columns table column-names) to create a new data-table.

In this example, we create a new data-table object with only 2 columns. We also inverted their order.

(csv:select-columns *dt* '("age" "name"))
;; =>
#<DATA-TABLE:DATA-TABLE {1203F88213}>
CL-USER> (inspect *)

The object is a STANDARD-OBJECT of type DATA-TABLE:DATA-TABLE.
0. COLUMN-NAMES: ("age" "name")
1. COLUMN-TYPES: (INTEGER STRING)
2. ROWS: ((7 "Alice") (77 "Bob"))
> q

overlay-region new dt :col-idx col-idx :row-idx row-idx): “puts all values from new-dt into dt starting at row-idx col-idx”.

make-sub-table parent :uri uri :lri lri :uci uci :lci lci:

Make a new data table from a subset of another data-table
   lci - low column index
   uci - upper column index (as per subseq 1 beyond the col you want)
   lri - low row index
   uri - upper row index (as per subseq 1 beyond the row you want)

Write a data-table to a file (or any stream) with (data-table-to-csv dt &optional stream)

All this is good, but today lisp-stat does this, and more.

lisp-stat’s Data Frame

lisp-stat is a powerful library.

Lisp-Stat provides a statistical computing engine comparable to R, Python, Julia and Matlab. Its major differentiators are a true REPL based development environment, high performance and a single binary image that can be moved through the devops pipeline in a secure, safe and manageable way.

It integrates with Jupyter notebooks, to Quarto, it can load R datasets...

It’s pretty good and actively used and developed.

It interests us for its Data Frame. You should go read its documentation ;)

Let’s load the library:

(ql:quickload :lisp-stat)

We’ll give a brief showcase. For this, we’ll go to the ls-user package. It is “the package for you to do statistics work”.

(in-package :ls-user)

We can read a CSV file with read-csv. This function is actually not the one we used so far with cl-csv, it is a wrapper around fare-csv.

So, using another separator is different, use fare-csv:*separator*.

(defparameter *persons-df* (read-csv #p"persons2.csv"))
;; => *PERSONS-DF*

It is important we used our file persons2.csv which contains the first row with column names.

We can start working with our data.

How do we get all names of our dataset? Simply like this:

LS-USER> (column *persons-df* 'name)
#("Alice" "Bob")

That’s already interesting, isn’t it?

Observe that: - the result is not a list, it is an array.

lisp-stat has a notation trick to access data in an even shorter way. For this, we need to define an “environment” with defdf:

LS-USER> (defdf persons (read-csv #p"persons2.csv"))
;; => #<DATA-FRAME (2 observations of 3 variables)>

Observe that: - we deliberately didn’t use “*earmuffs*” around “persons” - the environment already gives us information: it saw 2 rows and 3 columns.

Now, we can get all names simply with:

LS-USER> persons:name   <----- you can use auto-completion, of course.
;; => #("Alice" "Bob")

all ages:

LS-USER> persons:age
;; => #(7 77)

We can inspect the shape of our data:

LS-USER> (head persons)

;;   NAME  AGE LISPER
;; 0 Alice   7      1
;; 1 Bob    77      0

Using another function, select, we can get all ages with:

LS-USER> (select persons t 'age)
;;                      ^^^ take the age of all rows

But with select we can get a subset of values:

LS-USER> (select persons '(0 1) 'age)
;;                         ^^^ our subset (it's all our data lol)
;; => #(7 77)

We can get values of some columns:

LS-USER> (columns persons '(age name))
;; => #(#(7 77) #("Alice" "Bob"))

We can get a high-level description of our dataset:

LS-USER> (describe persons)
PERSONS
  A data-frame with 2 observations of 3 variables

Variable | Type | Unit | Label
-------- | ---- | ---- | -----------
NAME     | NIL  | NIL  | NIL
AGE      | NIL  | NIL  | NIL
LISPER   | NIL  | NIL  | NIL

This shows that the columns’ types were not inferred. Can we fix this?

LS-USER> (heuristicate-types persons)
NIL

LS-USER> (describe persons)
PERSONS
  A data-frame with 2 observations of 3 variables

Variable | Type    | Unit | Label
-------- | ----    | ---- | -----------
NAME     | STRING  | NIL  | NIL
AGE      | INTEGER | NIL  | NIL
LISPER   | BIT     | NIL  | NIL

Yes, now they are.

We can now manipulate columns: add, remove, rename, replace, transform... as well as rows: add, count, loop over (do-rows), map into, mask, filter...

Everything is in lisp-stat’s documentation!

Utilities

We saw how to do that with lisp-stat’s head function.

We have another solution with the cl-ansi-term library.

(ql:quickload '("cl-ansi-term"))

Its global nickname is term (warn: global nicknames are now legacy, prefer package-local nicknames).

We use term:table to print our tabular data.

(let ((csv (cl-csv:read-csv #p"persons2.csv")))
  (term:table csv))

;; =>
+-----+---+------+
|name |age|lisper|
+-----+---+------+
|Alice|7  |1     |
+-----+---+------+
|Bob  |77 |0     |
+-----+---+------+

It has a few more options. With many columns, you could display only a chosen set of columns. You can style cells programmatically, etc.

See also

16:14

Link [Scripting News]

Yesterday's rollout of BonBonWeb was a great success. I think we have actually launched a new genre of the web, based on the original web before it was taken over by the silos. Everyone loves Markdown, which was not news to me. It's so simple you can't hide any michegas. And it gives writers control of the things we want control of, without miring us in the details of CSS. And then expert web designers can create stylesheets that work for us, and we will make it easy to add those to your BonBon, and presumably our competitors will do the same. Because I'm doing the initial implementations of each component of this web, and setting the expectation of the separation power between writers and readers, any competitor is going to have to do the same. I learned this from podcasting. The first podcast client, which I wrote, established OPML as the format for interchanging subscription lists. Doing the same kind of thing here. Setting user expectations from the start.

Link [Scripting News]

BTW, this is what the MD version of one of my blog posts looks like.

Link [Scripting News]

Poll: If we want democracy we have to have a web that isn't controlled by the big tech companies.

15:28

automake 1.20 released [stable] [Planet GNU]

We are pleased to announce GNU Automake 1.20, a stable minor release.

Among new features is `--enable-jobserver' for compiler and linker access to GNU make's jobserver, the delete-on-error option, and a print-distfiles target.  distcheck no longer requires TeX by default. This release also fixes some long-standing bugs and limitations concerning dependency tracking, lex/yacc output in VPATH builds, Vala builds, distribution compression, and uninstall checks.  Furthermore, GNU automake has upgraded from the GNU GPLv2 (or later) license to the GNU GPL v3 (or later) license.

I have substantial plans for the GNU Build System (`autotools') as a whole.  I intend to continue resolving old issues and limitations, and adding new features in GNU Automake, slowly dragging it into the future.  My ultimate goal is to establish it, once again, as the build system of choice for new software projects while continuing to simplify maintenance and portability for existing users.  Hopefully, upcoming releases will get us closer and closer to this goal.

-*-*-*-

There have been 104 commits by 3 contributors in the 58 days
since 1.19.

Thanks to everyone who contributed to this release!

  Kamila Szewczyk (99)
  Karl Berry (4)
  Paul Eggert (1)

Kamila Szewczyk (szewczyk@math.uni-sb.de)
==================================================================

See below for the detailed list of changes since the
previous version, as summarized by the NEWS file.

Here is the GNU Automake home page:
  https://www.gnu.o ... oftware/automake/

Here are the compressed sources:
  https://ftp.gnu.o ... omake-1.20.tar.gz (2549281 bytes)
  https://ftp.gnu.o ... omake-1.20.tar.xz (1694140 bytes)

Here are the GPG detached signatures:
  https://ftp.gnu.o ... e-1.20.tar.gz.sig
  https://ftp.gnu.o ... e-1.20.tar.xz.sig

Use a mirror for higher download bandwidth:
  https://www.gnu.o ... rg/order/ftp.html

Here are the SHA256 and SHA3-256 checksums:

  File: automake-1.20.tar.gz
  SHA256 sum: 00c0e397a3c0096b1b9167eb4a5ecb87a66fe50888d939c4e02111e603936570
  SHA3-256 sum: 9144e4677e65c09ecc5de762e7b97982cfe683a4e45b153a199172b11593a03e

  File: automake-1.20.tar.xz
  SHA256 sum: f6f34dad4cbe395715762b0710f7c511e39bd5cf777e6b95818ccbecf7714248
  SHA3-256 sum: d5910039d860e26824074f654b1aea70d123932696d8fd0bcda531fc78652edf

Verify SHA256 with sha256sum or 'shasum -a 256'.
Verify SHA3-256 with 'openssl dgst -sha3-256 FILE'.

Use a .sig file to verify that the corresponding file (without the
.sig suffix) is intact. First, be sure to download both the .sig file
and the corresponding tarball. Then, run a command like this:

  gpg --verify automake-1.20.tar.gz.sig automake-1.20.tar.gz

The signature should match the fingerprint of the following key:

  pub   rsa4096 2022-07-31 [C] [expires: 2036-05-11]
        6C22 2EA6 B2BD 216A A406  516A C868 F0B6 DE38 409D
  uid           [ultimate] Kamila Szewczyk <k@iczelia.net>
  uid           [ultimate] Kamila Szewczyk <szewczyk@cs.uni-saarland.de>
  uid           [ultimate] Kamila Szewczyk <iczelia@gnu.org>
  uid           [ultimate] Kamila Szewczyk <szewczyk@math.uni-sb.de>
  sub   rsa4096 2022-07-31 [E]
  sub   ed25519 2026-06-29 [S]

If that command fails because you don't have the required public key,
or that public key has expired, try the following command to retrieve
or refresh it, and then rerun the 'gpg --verify' command.

  gpg --recv-keys 6C222EA6B2BD216AA406516AC868F0B6DE38409D

As a last resort to find the key, you can try the official GNU
keyring:

  wget -q https://ftp.gnu.o ... u/gnu-keyring.gpg
  gpg --keyring ./gnu-keyring.gpg --verify automake-1.20.tar.gz.sig automake-1.20.tar.gz

Please report bugs and problems to <bug-automake@gnu.org> (instead of replying to this mail), and send general comments and feedback to <automake@gnu.org>, and patches to <automake-patches@gnu.org>.

Thanks to everyone who has reported problems, contributed
patches, and helped test Automake!

Changes from NEWS:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
New in 1.20 (2026-11-07):

  • Licensing


  - Automake is now licensed under the GNU General Public License version 3
    or later (GPLv3+), matching Autoconf and following the Free Software
    Foundation's recommendation to use GPLv3 or later:
      https://www.gnu.o ... oftware/autoconf/
      https://www.gnu.o ... ommendations.html
      https://www.gnu.o ... ms-why-gplv3.html

    Existing exceptions for distributed support files remain in place.
    This does not change the licensing of generated Makefile.in files
    or require packages using Automake to adopt the GPL.

  • New features added


  - New configure option --enable-jobserver lets compilers and linkers
    inherit GNU make's pipe jobserver, for example for GCC's
    -flto=jobserver.  Dry-run, question, and touch modes still do not
    run these commands.  (bug #45756)

  - New option delete-on-error.  It emits the .DELETE_ON_ERROR special
    target in the generated Makefile.in, instructing GNU make to delete
    the target when its recipe fails after having modified it.  A failed
    rule like `foo.h: gen.sh; ./gen.sh > $@' then no longer leaves a
    truncated result that later runs of make treat as up to date.  Other
    make programs do not support this, so the option will have no effect.

  - New target print-distfiles lists the files that "make dist" would
    distribute.

  • Source tree organization


  - Historical ChangeLogs, development plans, and NEWS-future are now
    under attic/.  The experimental contrib/tap-driver.pl is retained
    in attic/testing/; the maintained TAP driver is lib/tap-driver.sh.
    The manual's link checker moved from contrib/ to maintainer/.

  • Changes to Automake-generated Makefiles


  - distcheck no longer runs "make dvi" by default, so TeX is not needed
    to check a distribution containing Texinfo manuals.  Set
    AM_DISTCHECK_DVI_TARGET in Makefile.am to, e.g., dvi, pdf or html,
    to check that the documentation can be built.  (bug #79053)

  • Bugs fixed


  - Repeated target declarations in overlapping Automake conditionals no
    longer produce spurious redefinition warnings when adding prerequisites.
    (bug #13940)

  - Dependencies on another target's objects in LIBADD or LDADD are now
    tracked regardless of the order in which targets are processed.
    (bug #60508)

  - distcheck now detects symbolic links left in the installation tree
    after uninstall, including dangling links.

  - lex and yacc output files distributed from a VPATH build no longer carry
    "#line" directives pointing to their sources through the build-time
    srcdir, e.g. "../src/parse.y"; the distributed copies now refer to
    the sources next to them.  (bug #39666)

  - dist-zstd now honors numeric ZSTD_CLEVEL values, such as 3, instead
    of treating them as input filenames.  This fixes failed or incorrect
    distribution archives when ZSTD_CLEVEL is set.

  - lex and yacc rules now create output directories before generating
    sources, fixing out-of-tree builds with subdir-objects and
    --disable-dependency-tracking.  (bug #27188, Debian bug #807050)

  - configure now refuses a source directory path containing '<', '>',
    '(' or ')'.  These could be interpreted as shell redirections or
    syntax in compiler commands, potentially overwriting files in the
    build directory.

  - configure now refuses a source directory path ($srcdir) containing
    ';' or '|', reporting "unsafe srcdir value", as it already did for
    characters such as '$' and '&'.  Such a path used to fail later
    with misleading errors, from config.status's dependency-tracking
    setup or from make ("No rule to make target").  These characters
    remain accepted when $srcdir is '.'.

  - Non-recursive Vala builds now pass distcheck when generated Vala
    sources trigger recompilation in the build directory.  Generated C
    files are moved into their subdirectories together, and build-tree
    stamp files are removed by distclean.  (bug #76527)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This release is based on the Automake Git repository, available as:

  git clone https://https.git ... /git/automake.git

Commit 5613ae2dbb151f73070bb576f21136e5ef5c75c1 is tagged as v1.20.

For a summary of changes and contributors, see:
https://gitweb.gi ... =shortlog;h=v1.20

Or run this command from a Git checkout of Automake:

  git shortlog v1.19..v1.20

--
With Valediction,
Kamila Szewczyk (https:// ... elia.net)

15:14

Andrew Cater: Arm Cambridge - Mini-Debconf Cambridge - day 1 20261107 [Planet Debian]

 Half way through the day:

A morning of technical talks:

Vock - Instrumenting, kernel coverage and process tracing

Rebuilding the archive on your desktop

An overview of Secure Boot

An excellent lunch - with thanks to Liv and her Arm catering staff

Three lightning talks - two without slides :)

Excellent day so far :)

13:07

Pluralistic: JS Tan and Clarissa Redwine's "Against Tech Oligarchy" (07 Nov 2026) [Pluralistic: Daily links from Cory Doctorow]

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

Today's links



The torso of a person in a leather jacket standing in a bookstore, holding a book: The Haymarket Books edition of JS Tan and Clarissa Redwine's 'Against Tech Oligarchy.'

JS Tan and Clarissa Redwine's "Against Tech Oligarchy" (permalink)

JS Tan and Clarissa Redwine are veterans of a string of hard-fought unionization drives at tech workplaces that started with some astounding successes but ran up against ferocious resistance in the second Trump term; their book about tech labor, Against Tech Oligarchy, is a superb analysis of the challenges and potential for tech labor organizing:

https://againsttecholigarchy.com/

For decades, tech workers enjoyed extraordinary power, despite the fact that virtually no tech workers were in unions. That's because tech workers were both extremely valuable to their employers (each engineer hired by a Silicon Valley firm added about $1m to the company's bottom line) and extremely scarce.

This won tech workers very favorable working conditions, high compensation, and a great deal of control over their employers' products (because if a worker refused to work on a project, it was hard to find someone else to do the work). What's more, there has always been a sizable cohort of tech workers whose own lives were profoundly improved by access to digital networks and wanted more than anything to distribute those benefits to everyone else. I call these workers "Tron-pilled," because they fought for the user:

https://pluralistic.net/2026/04/11/obvious-terrible-ideas/#bayesian-terrorism

During the era of tech worker scarcity, few tech workers saw themselves as workers at all – rather, the tech worker's self-conception was as an entrepreneur in waiting, a temporarily embarrassed founder. Tech bosses played on this perception, promoting the idea of tech workers and managers as peers and/or family members. Tech CEOs affected hoodies and jeans and hosted company-wide meetings where they allowed engineers to pepper them with impertinent questions about the company's technical and commercial direction.

But scarcity-based power only lasts until supply catches up with demand. As the number of workers outstripped the number of jobs, bosses showed their true colors. That's what happened at Kickstarter, when one of the bosses forced out his co-founders and declared himself CEO and proceeded to override the decisions of the company's Trust and Safety team. This sparked one of tech's first unionization drives, and it was a bitter fight, with management pulling out every dirty tactic in the union-busting playbook:

https://kickstarterunited.org/oral-history/

The labor militancy at Kickstarter United wasn't an isolated incident. Workers at much bigger companies like Google and Microsoft had a long tradition of pushing back against management through internal channels, open letters, and, starting in 2018, mass walkouts:

https://en.wikipedia.org/wiki/2018_Google_walkouts

But post-Trump, bosses at these companies were much less willing to countenance dissent, and waves of vicious retaliation and reprisals radicalized many workers at these companies, driving them to more traditional, organized forms of labor activism. At the same time, workers at smaller, "mission-driven" shops like Bandcamp were inspired by the success of Kickstarter United and they started their own drives. All this attracted the interest of the "internationals" – big, established unions like the Communications Workers of America – who trained union organizers at all kinds of tech shops and started laying the groundwork for traditional union drives.

Most of Against Tech Oligarchy tells the story of these drives in a gripping you-are-there style (it helps that both of the authors are veterans of several of these campaigns). The stakes got much higher during the pandemic, of course, as tech came to play a more central role in the lives of hundreds of millions of locked-down workers, and as the tech companies themselves went on uncontrolled hiring sprees, putting workers on the payroll without any duties or responsibilities, often just to ensure that a rival company couldn't hire them.

The pandemic also prompted many tech bosses to express far more worker-hostile sentiments than they'd ever let slip in public before. Fully remote workforces both frustrated tech bosses and also significantly reduced the opportunities for in-person labor organizing. All of this built to a series of rising crescendos, such as Musk's Twitter takeover and mass layoffs, and Israel's tech-fueled genocide in Gaza. Confrontations between tech workers and bosses grew more bitter and direct, even as solidarity between white-collar tech workers and their blue-collar peers (notably Amazon warehouse workers) increased.

If all Against Tech Oligarchy did was lay out the cut-and-thrust of these labor struggles during these momentous years, it would be worth the price of admission. But it's in the final chapters that the book really distinguishes itself, because it's here that the authors embark on a pitiless postmortem of their own failed campaigns and the failures of their peers, and ask themselves what it will take to unionize tech workers.

They start with the observation that most American union organizing is built around maintaining "labor peace" (by swiftly moving to recognition and a contract) but that tech bosses are ready to wage "labor war" (through illegal union-busting and retaliation). A labor peace strategy avoids costly and dangerous risks to established unions, such as decertification of locals and expensive and bruising court battles. But for tech bosses, labor war pays off, because their workforce is transient, fragmented, and skeptical of the very idea that they are workers. They have little to no experience with unions and can barely imagine how a union might improve their working lives.

The traditional labor playbook calls for workers to quietly build their power, taking no overt action while conducting a series of personal, one-to-one conversations that contribute to an eventual quorum of workers that's large enough to win a unionization vote. This strategy is like building a bonfire, where the pieces of fuel are piled one atop the other, but not lit until the pile is done.

But in a tech shop where workers turn over frequently and work in isolated teams, often from home, this strategy fails. Workers who have been won to the union side leave or grow demoralized in their isolation. Reaching new workers is difficult, and since the whole union drive occurs in secret, new workers don't know to reach out to organizers in their shops.

For Tan and Redwine, this fact militates for a strategy that revives some of the pre-labor activism of tech workers, noisy public/private fights whenever product decisions and management conduct violate some mix of worker rights and workers' values. They see this as a way to build momentum within a shop, bringing workers off the sidelines and giving organizers chances to bring those workers into a sustained, structured labor drive.

Tan and Redwine see tech worker organizing as the frontrunners of an age of new labor militancy and labor war, of the sort that pre-dated the labor peace that arose after the passage of the National Labor Relations Act. That labor peace was the result of bosses learning that hardball tactics would be met with equally hardcore responses.

This is especially important for tech workers, whose strikes cannot inflict the same pain on their bosses as earlier industrial workers' strikes did. Digital systems are designed to operate themselves after they are built, so when the workers involved in those systems withdraw their labor, the systems continue to run, often for a very long time, before needing maintenance (this is also the lesson of Musk's mass layoffs at Twitter).

Tech bosses have metabolized this lesson, and they are increasingly willing to wage all-out war at the first sign of labor unrest, with waves of retaliatory firings. These bosses have figured out devilish tactics for constructive dismissal, like the CEO of Mapbox, who retaliated against union supporters by targeting them with "return to office" mandates that forced them to report in person to offices that were in distant states. This prompted many of these workers to quit, which spared Mapbox from even paying them a severance package.

Against this backdrop, strikes need to be seen not as a way to bring the business operations to a halt, but rather as a way to galvanize workers and bring them into the union drive. As New York Times Tech Guild organizer John Cruickshank put it, Action builds capacity for action.

This is the ethos of the Microsoft workers who have campaigned tirelessly to halt the company's participation in the genocide in Gaza. They barricaded themselves in executives' offices, livestreaming the confrontation; they disrupted Microsoft's livecast 50th anniversary celebration; and they paddled a flotilla of protest kayaks outside of top Microsoft executives' waterfront homes. All of this paid off, with Microsoft halting sales of its tools to a particularly notorious unit of the Israeli military who had been using the company's products to conduct surveillance in Gaza and the West Bank.

Tan and Redwine see these novel tactics as a rewilding of the labor movement, a return to the militant roots that led to the labor peace, but only after all-out labor war. They cite the 1934 Minneapolis truck drivers' strike, where workers invented the "flying picket" by swarming scab trucks far from the factory gates, defeating the trucks' police protection, which led to a general strike and a total victory for labor.

This is important historical context. The genteel business of getting everyone's cards signed and having the NLRB certify your union was the compromise bosses agreed to after they learned that the alternative was far worse for them. Today, it's not just bosses who've forgotten that lesson – many workers have, too. Against Tech Oligarchy aims to rekindle those old boilers and get the unstoppable labor train running again.


Hey look at this (permalink)



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

Object permanence (permalink)

#25yrsago EMI will distribute music on Gnutella

#25yrsago Photos from O'Reilly P2P Con https://web.archive.org/web/20011124163254/http://www.openp2p.com/pub/a/p2p/2001/11/05/monday_photos.html

#20yrsago Aussie Institute of Criminology calls piracy losses “self-serving hyperbole” https://web.archive.org/web/20061208043648/http://australianit.news.com.au/articles/0,7204,20713160^15306^^nbv^,00.html

#20yrsago UK airport cop: gun-shaped shirt decoration is illegal https://memex.craphound.com/2006/11/07/uk-airport-cop-gun-shaped-shirt-decoration-is-illegal/

#15yrsago Bug report: “Simultaneous cat and external keyboard input causing kernel panic” https://web.archive.org/web/20120112020023/https://lkml.org/lkml/2011/11/3/110

#10yrsago Hong Kong erupts after Beijing refuses to allow dissident lawmakers to re-take oath https://globalvoices.org/2016/11/06/street-protests-as-beijing-preempts-hong-kong-courts-with-new-interpretation-of-basic-law/

#10yrsago “Massive scale” shut-down of polling places in districts known for suppressing Black voters https://www.commondreams.org/news/2016/11/04/voting-rights-protections-gutted-polling-places-shuttered-massive-scale

#10yrsago Donald Trump’s campaign takes away his right to tweet without supervision https://www.nytimes.com/2016/11/07/us/politics/donald-trump-presidential-race.html?_r=1

#10yrsago National Guard helicopter, 7 cop cars sent to warrantlessly seize a single marijuana plant from an 81-year-old grandmother https://www.loweringthebar.net/2016/11/national-guard-one-plant.html

#5yrsago Bait and Switch https://pluralistic.net/2021/11/07/bait-and-switch/

#1yrago The enshittification of labor https://pluralistic.net/2025/11/07/postwar-social-contract/#a-defense-of-social-contracts

#1yrago The 40-year economic mistake that let Google conquer (and enshittify) the world https://pluralistic.net/2025/11/06/vertical-blinds/#invest-dont-acquire


Upcoming appearances (permalink)

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



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

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027
  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, 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



Colophon (permalink)

Today's top sources:

Currently writing:

  • “Once Is Enemy Action,” a science fiction novel about the origins of modern technofascism. Today's words: 532 (33976 total).

  • "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.


How to get Pluralistic:

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

Pluralistic.net

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

https://pluralistic.net/plura-list

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

https://mamot.fr/@pluralistic

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

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

Medium (no ads, paywalled):

https://doctorow.medium.com/

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

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

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

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

ISSN: 3066-764X

11:21

Russell Brand – My Apology [George Monbiot]

I was completely wrong about him.

By George Monbiot, published on Bluesky, 7th November 2026

People have asked me how I feel about nominating Russell Brand a “hero” in 2014.
I feel very bad about it. It must have piled on the pain for his victims. I apologise to them.

Though there was nothing published about his crimes at the time, I should have read the signs better. I failed to do so.

I now see the political impact he had that year as yet another of his reinventions. He later reinvented himself again as a far right conspiracist. I wrote about that in 2023, a few months before The Sunday Times and Channel 4 revelations about his sexual abuse.

When the revelations emerged, I was horrified. But I should have been more alert before, and have recognised the predatory nature of his treatment of other people. He was a villain not a hero, and had been for years.

10:21

Start [Seth's Blog]

The cultural impresario has always had leverage.

Invest time and money and put on a show. Start a cable network, a book publishing company or become a concert promoter. You’re the gatekeeper, an adjudicator of status, a person who can transform people’s lives simply by amplifying and spreading ideas and allowing art to reach its audience.

Time and money were apparently the gating factors. It takes a while to turn a profit, and it’s uncertain and hard work.

Except…

New platforms and tools remove both time and money as barriers.

Penn and Teller needed their fame and the CW network to launch their cable show Fool Us. But now, anyone can start a competitor on YouTube in a weekend.

A radio pundit needed to spend years to build a syndicated network of terrestrial stations, but now you can start a podcast, in your basement, for free. In a weekend.

Gallerists don’t need galleries, and you don’t even need a building to coordinate a foster-home-based pet shelter.

So what’s the impediment?

I’m guessing that if you got the call today, you could put together your ideas for a book, or five minutes of standup or even the software you’d code.

But we don’t need the specific call. We’ve all been called.

The barrier is simple: fear. The fear of beginning and of sticking with it. The fear of succeeding (or failing). The fear of impostor syndrome. And the fear of going forward without a guarantee.

So let’s call it that. Fear is real, but fear might not be rational.

Begin.

10:14

Asahi Linux 7.3 progress report [LWN.net]

The Asahi Linux developers have put out a new report on their progress toward a Linux distribution for Apple devices.

Some time ago, we were made aware of multiple attempts to exploit our permissive licensing to hijack our work, with a direct view to replacing the project and aggressively monetising Linux on Apple Silicon. In some extreme cases, in-development feature code was being lifted straight out of our personal forks and published without attribution or lazily rewritten with LLM assistance to obfuscate its origin. The MIT licence explicitly allows this, and has no carveouts to protect against bad faith actors.

As such, we made the difficult decision to begin the process of transitioning all of our repositories to the GNU General Public License version 2 or later. Going forward all Asahi Linux code will be licenced under strong copyleft licences only. Those who do not learn from history are doomed to repeat it.

Amutable Foundations: A Technical Overview [LWN.net]

Lennart Poettering, Michael Vogt, and Joaquim Rocha have put together a detailed overview of what the Amutable Operating System (AOS) and associated infrastructure will look like.

The image-based OS approach enables us to enforce some very strict but powerful security properties, which elevate the security posture of the system substantially above traditional Linux systems. Specifically, let's highlight seven major essential security properties of AOS here:
  1. No Shell + No SSH + No Language Interpreters. By default AOS does not install a UNIX shell, nor makes remote access via SSH available on the nodes. Moreover, we do not install any of the usual language interpreters (Python, Perl, …) by default. For most nodes a shell or interpreted language support is not required and it removes a whole class of attacks.
  2. Signed Images Only. On AOS only images that come with Verity data signed by a signing key listed in the Verity keyring may be activated.
  3. [...]

09:49

Mike Gabriel: OpenAGPS - The New Kid on the Block [Planet Debian]

There is a new project coming to Open Source Software land these days: OpenAGPS. It is not yet 100% functional, but we are working on it. It is not fully operational, yet, but we are on it.

Let me introduce OpenAGPS to you...

The Situation Today

The domain of assisted geo location services has been left to a few big tech providers. When using GPS on mobile devices, most of us send info on our approximate device location (based on cell tower IDs seen by our devices around us) mostly to Google's SUPL service in order to facilitate a faster GNSS/GPS lock on the satellites flying above us.

Without assistance, retrieving a GNSS/GPS lock on sufficient satellites includes "finding" those satellites and once found retrieving data (in bytes/sec) from them. In some regions, this leads to waiting periods of up to 45 minutes, before a mobile devices has gained a lock on sufficient satellites (3 or more).

In Assisted-GNSS/GPS, "other" information (such as cell tower IDs) gets used to estimate what GNSS/GPS satellites are currently passing over one's location. With AGPS, the mobile devices retrieve information via a so-called SUPL server, containing two details: a list of potential satellites above and their dataframes. Esp. providing those dataframes over the device's internet connection (and not via the GNSS/GPS receiver downloading it from the satellite itself) speeds up the lock-on process of the mobile tremendously (several seconds to a few minutes).

However, for this mechanism to work, your device will share your IMSI (although not needed for AGPS), a list of cell towers around you and their signal strengths with the provider of the SUPL service, revealing your approximate position. In total, this allows SUPL providers to re-identify each mobile device and create motion profiles of each such device (and its owner). If the SUPL service is hosted by one main provider (i.e. Google SUPL), there is a lot of valuable information available to them for free that they can commercialize.

Currently, there is only one mitigation method available to hide one's location info from the SUPL server(s) at e.g. Google: using a SUPL proxy server implementation (available as OSS, provided by and used in e.g. GrapheneOS). A SUPL proxy still depends on the big tech service provider(s) for SUPL as it merely proxies SUPL requests from mobile devices through to the proprietary SUPL services, at e.g. Google, but the mobile device is being camouflaged behind the SUPL proxy in use.

The OpenAGPS Teaser

OpenAGPS, on the contrary, will be a fully independent implementation from proprietary service providers, and it will refrain from collecting and commercializing end users’ data. It will be driven by individuals of the OpenAGPS community. There will likely be one central service that the OpenAGPS project plans to host and operate (the Porygon frontend/backend, OpenAGPS's GNSS Almanach service), but except from that SUPL servers can be self-hosted by individuals, companys or other communities. The requesting mobile devices' IDs will be hidden from the Porygon server (like with existing SUPL proxy implementations), so that the only centrally operated component (the Porygon Almanach server) does not know who is requesting what geo position information (and thus cannot collect such data, neither derive info about where requesting devices are located).

In addition, with a large OpenAGPS community, it is imaginable (in theory) that there will also be multiple central Almanach servers available on the internet (with parallel networks of base stations attached to each GNSS Almanach server).

Checkout the OpenAGPS architecture schematics and our website/documentation to learn more.

Collecting Satellite Data

The OpenAGPS project is not simply a software that admins/users can install, it needs kind of a huge and global community to operate/host/house its base station network.

The challenge with providing a community-driven AGPS service on the internet is that up-to-date (real-time!) GNSS/GPS satellite position data is not available for free download. Almanach data can be obtained per region from various organisations, but then their datasets are often days to weeks old, thus too outdated. GNSS/GPS satellites are not geo-stationary, they circulate around the planet. Their position is dependent on the current date-time. A globally spanning network of GNSS/GPS base stations will do the trick here. We will need a community that harvests the needed satellite data in real time and makes it available through the Porygon Almanach server to all OpenAGPS users.

The OpenAGPS project will depend on at least one community member every ~40-50 km² to operate a so-called OpenAGPS base station: These base stations are stationary, need to run 24/7, and they will harvest GNSS/GPS statellite data information from the satellites above in real-time and share this data with the (central) Porygon server, continuously. The Porygon server will create a timestamp-dependent "map" of all seen satellites and extrapolate locations between base stations' Almanach data updates.

Help making OpenAGPS a Success: Host a Base Station

To make OpenAGPS a success, we need volunteers who are willing to host (actually: house) an OpenAGPS base station at their home or work place (or both). Users will only be able to use their self-hosted OpenAGPS SUPL server with their mobile devices (instead of e.g. Google SUPL), if we manage to establish sufficient coverage with those base stations in the area of interest, so that the OpenAGPS Almanach will get populated with sufficient satellite position data.

If you'd like to host/house such a base station, please get in touch and check the docs.

Support this project by Co-Funding it

If you realize that you have an interest in this project and would like to improve your level of digital sovereignty in your government, organization, at your home, etc. then consider sending financial support to the project. If you want to support us, please get in touch with Raoul Kramer at BetaBreak or Mike Gabriel at Fre(i)e Software GmbH. If you are a software developer and would like to contribute to OpenAGPS, also get in touch and let us meet at FOSDEM 2027.

Credits

A huge thanks to the NLnet Foundation for funding this project's bootstrap phase. Follow-up funding has been applied for, so please keep fingers crossed!

05:56

Page 13 [Flipside]

Page 13 is done.

02:00

Why are we all worked up about atomicity when applying hot-patches if we can just suspend all the threads? [The Old New Thing]

I noted that one of the concerns of the Windows hot-patching system is that the patch can be activated atomically. But why does it need to be atomic? Can’t just suspend all the threads of the process (except for the one doing the patching)? That way, nobody else can be executing a half-installed patch.

For processors with variable-length instructions (looking at you, x86), the patched instruction cannot be shorter than its replacement. This applies even if you can suspend all the threads of the process, because you might suspend a thread just as it’s about to execute bytes from what would be the second of half of the replacement instruction.

instruction
pointer
    ↓
original XX YY
 
patch AA BB

If you were unlucky and froze the thread after it executed the XX instruction and was about to execute the YY instruction, and then replaced both bytes with a two-byte instruction AA BB, then when the thread resumes, it will execute BB as if it were the start of a new instruction.

Okay fine, so we’ll make sure that the original instruction is at least as big as the replacement instruction, so that a frozen thread is never caught in the middle of the replacement instruction. But assuming we do that, can’t we just suspend all the threads, and then patch at will without having to worry about atomicity?

While it’s true that you suspended all the threads in the process, that doesn’t prevent new threads from being created in the process by a function like Create­Remote­Thread. The caller of Create­Remote­Thread can specify whether the new thread is suspended or not, and if it chooses non-suspended (or if it chose suspended and then decided to resume it), you now have a live thread running in the process while you are busy trying to patch it.

Atomicity is important so that you don’t accidentally patch code while an injected thread happens to be running it.

Bonus chatter: Now, atomicity is still not bulletproof, because even if you manage to suspend all the threads, and prevent new ones from being injected, you still have the case where somebody calls Write­Process­Memory to modify the bytes of the process while everything in it is suspended.

And we saw earlier that Write­Process­Memory is not atomic, so it’s possible that a two-byte Write­Process­Memory writes the first byte, and then you do your atomic update of both bytes, and then the Write­Process­Memory finishes by writing the second byte, leaving a mishmash of your patch and the rogue one.

On the other hand, anybody who was using Write­Process­Memory to do code patching was already broken because of this lack of atomicity, so we are not introducing a new problem.

Furthermore, since the hot-patching space is reserved for Windows Update, an outsider that uses Write­Process­Memory to apply a hot-patch from another process is already breaking the rules. At this point Windows Update says, “Look, I can’t protect myself from this, and you’re in double-unsupported territory by the time we got here, so whatever happens is your problem.”

The post Why are we all worked up about atomicity when applying hot-patches if we can just suspend all the threads? appeared first on The Old New Thing.

Friday, 06 November

23:42

Aaron Swartz's legacy lives on, but who profits from it? [Planet GNU]

November 8 is Aaron Swartz Day, when we remember a pioneer of free software and information sharing whose contributions helped shape the modern internet.

23:28

Musical Scares [Penny Arcade]

HORI made an electronic ocarina for the new Ocarina Of Time Gabe is obsessed with, good luck fuckin' finding one though. It can autoplay the traditional songs, or you can learn to play them yourself, and the game can hear you do it! It also has a headphone jack, which is a profound kindness and might save us a trip to the hospital.

22:49

Friday Squid Blogging: New Jurassic Squid Predecessors [Schneier on Security]

News story: “Scientists discover a bizarre Jurassic ‘squid’ unlike anything ever seen.”

Scientists have identified the “fattest” belemnite ever discovered, a bizarre, barrel-shaped squid relative that lived in Wyoming’s ancient seas 160 million years ago. The exceptionally rare fossils reveal a creature unlike anything previously known, potentially a predator of smaller squid-like animals and a surprising survivor of a supposedly vanished family.

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

Blog moderation policy.

22:00

View From a Hotel Window, 11/6/26: Royal Oak, MI [Whatever]

Oh, look, it’s a church! I have one of those.

My event tonight, however, is not in Royal Oak but in the neighboring Ferndale, at 215 W, at 6:30. Come down and say hello, if you would!

Tomorrow: Hudson, Ohio, at the Hudson Library and Museum. Note that this one will be a 2pm in the afternoon, not in the evening as my events so often are.

— JS

21:21

Isoken Ibizugbe: Seeing Accessibility in Debian [Planet Debian]

Recently, I’ve been noticing something on packaging around my house that I used to glance right past: raised Braille dots on a carton of medicine, and embossed markings on a container of body cream. I’ve always known what Braille looked like, but I never paid close attention to it. Now that I’m actively working on accessibility testing for the Debian Installer, I see it everywhere.

It made me reflect on how accessibility usually enters our consciousness. In tech, we’re taught about accessibility as a best practice when designing user interfaces or web apps. But realistically, you mostly see it implemented well in massive global software, like mobile operating systems or browsers like Firefox. You rarely see accessibility features integrated into local Nigerian physical products or everyday tech. Paying attention to these details made me realize how much care goes into making sure every person is considered, and how vital that mindset really is.

Manual Testing & The openQA Bottleneck

My recent work with Debian has been focused on automating tests for the Debian Installer’s accessibility features, specifically validating Braille display emulation.

I started out by manually testing following the official steps on the Debian Installer Accessibility Wiki. Once I understood the manual flow, the next goal was figuring out how to automate it inside openQA.

Initially, the idea was to initialize from the bootloader by adding parameters to the Grub (GRUB=”brltty=auto”)and it should start the installation with the braille visual. However, this didn’t work, the parameters never initiated the brttyl and it was a huge blocker going back and forth. Getting brltty to talk to the test runner in that environment would have required sweeping changes across the main Debian openQA instance configuration.

Instead of pushing for complex system-wide changes on the instance, we started looking for easier alternative approaches and noted the complicated ones, when we advance in the test.

We brainstormed streaming the display output directly to a dedicated file to capture and verify the Braille virtual display output. Ultimately, nested virtualization proved to be the most easiest path forward. 

You can check out the implementation details and changes in the Merge Request

Joining the Conversation

As part of this work, I joined the debian-accessibility mailing list to introduce what we were building and share our progress.

The responses were encouraging. I got some feedback and suggestions and the thread also created a discussion on how accessible the installation process currently feels for blind or visually impaired users, and where they also find issues. It served as a great reminder that test suites aren’t just about passing CI checks, they’re about serving actual people who rely on these systems every day.

20:42

Videos from XDC 2026 are available [LWN.net]

Videos from the 2026 X.Org Developers Conference (XDC) are now available on YouTube. XDC was held in Toronto, Ontario, Canada September 28-30.

19:49

19:14

[$] Locking down hibernation for the winter [LWN.net]

When a computer hibernates, the kernel writes the contents of memory to disk and then shuts the system down. Resuming from hibernation involves reading that data back into memory, and then having the kernel pick up where it left off. Unfortunately, the kernel does not have any way to know that the data it is reading back has not been tampered with, which is why lockdown, an optional kernel feature that attempts to prevent modifications to the running kernel, disables hibernation. Matthew Garrett, who has been working on lockdown for many years, has shared a patch set that aims to fix this problem. His solution must also protect against downgrade attacks (where an attacker reboots the computer with an older kernel version to bypass new protections), which complicates the implementation.

Seven stable kernels with fixes for three Xen vulnerabilities [LWN.net]

Hot on the heels of the previous two stable kernels, Greg Kroah-Hartman has announced the release of the 7.3.3, 6.18.62, 6.12.116, 6.6.162, 6.1.192, 5.15.225, and 5.10.274 stable kernels. Each one only contains fixes for three use-after-free vulnerabilities announced today by the Xen security team.

Two of the vulnerabilities could allow an attacker to cause a denial of service (DoS) for the entire Xen host machine with possible information leakage (CVE-2026-100080, CVE-2026-100082), and one may allow privilege escalation as well as a DoS of the host machine (CVE-2026-100081). Users should, of course, upgrade if they are using Xen.

19:00

18:28

Two stable kernels for Friday [LWN.net]

Greg Kroah-Hartman has released the 7.3.2 and 6.18.61 stable kernels. Each contains quite a few changes throughout the tree; users are advised to upgrade.

Egyptian journalist faces terrorism charges [Richard Stallman's Political Notes]

*Egyptian journalist faces terrorism charges after entire newsroom [jailed].*

*Last week, authorities arrested six journalists from the independent fact-checking and investigative platform Matsadaash – literally meaning "don't believe" – accusing them in a statement of being unlicensed and publishing false news on behalf of the outlawed Muslim Brotherhood.*

I have no basis to judge whether Matsadaash really supports the Muslim Brotherhood in any way. I also have no basis to judge whether Matsadaash advocates terrorism, though I don't think that the Muslim Brotherhood generally does that. But I don't trust the Egyptian military government's word — or its thugs — enough to take those accusations seriously just because the rulers say so.

The Muslim Brotherhood, when it is in power, would surely practice discrimination against non-Muslims, and perhaps even worse against Atheists such as me. But the Egyptian military government does that too.

Wikipedia: Blasphemy law in Egypt

Green Party of England categorized "Zionism" as racism [Richard Stallman's Political Notes]

The Green Party of England and Wales has voted to categorize "Zionism" as racism, and call for the elimination of Israel.

Many members of the Green Party disagree with that decision, and it may split the party. That disappoints me greatly, because on issues of environment and survival, the Green Party most deserves support.

I advocate creating a democratic state of Palestine alongside Israel and for both states to recognize and protect human rights and other individual rights of all persons.

*The Guardian view on the Green party and Palestine: rejecting two states is no shortcut to peace.*

Average words a person speaks in a day [Richard Stallman's Political Notes]

A survey of various countries, repeated over time, found that people spoke an average of 16,000 words per day in 2005, but this decreased gradually to under 13,000 per day in 2019.

British "investment" in slave trade [Richard Stallman's Political Notes]

A register of British people who profited directly from the slave trade shows that this form of "investment" pervaded English, later British, business and high society for a long time.

Excuses for FBI to meddle in US politics [Richard Stallman's Political Notes]

How the FBI finds excuses to meddle in US politics and repress views that the US government disapproves of.

Arkansas firing of Iranian-American professor [Richard Stallman's Political Notes]

Political accusations pressured the University of Arkansas into firing an Iranian-American professor based on allegations of "antisemitism" and working with the Iranian government, and of course allegations of plagiarism.

The faculty committee in charge rejected the criticism, but the administration fired her anyway. Now she is suing the university.

I have seen no facts about this case except what appears in that article. So I cannot assert, of my own knowledge, that she did not engage in antisemitism, that she was not working with the Iranian government, or that she did not violate the academic standards for citing previous work. But at least as for the last of those three, I am sure the faculty committee knows those standards and studied the question.

That they voted to support her unanimously is proof enough that the plagiarism accusation is bogus. Since all three accusations are standard in the playbook for getting rid of professors who don't stick to the magat political line, I expect they are all bogus.

Parents keeping tabs on their children [Richard Stallman's Political Notes]

The more parents keep tabs on their children, the more anxious it makes them.

Thick forests in Australia [Richard Stallman's Political Notes]

When British colonists took Australia, they stopped setting fires and allowed trees to grow big and form thick forests, which enabled bigger and hotter fires. Measurements at one site document this change over time.

Mathematical results from secret LLMs [Richard Stallman's Political Notes]

Generating mathematical results using secret LLMs threatens the openness of the mathematical community.

I suggest that results that mathematicians in general can neither verify or invalidate be considered mere conjectures.

WWII sugar rationing in Briton [Richard Stallman's Political Notes]

Britons who spent their first years under the WWII sugar rationing, which lasted until 1953, tend to have better health in many ways.

Boosting right-wing views in used of TikTok, Instagram and ex-Twitter [Richard Stallman's Political Notes]

A study of the behavior of TikTok, Instagram, and ex-Twitter towards users of age 18-24 found that they boost right-wing views substantially. This survey was done in Finland, France and Romania.

Local user groups in Britain are often used to spread lies, and people pay little attention to more careful news sources.

Repression of Abdullah Ibhais's testimony [Richard Stallman's Political Notes]

Qatar and Jordan persist in repression of Abdullah Ibhais's testimony about Qatar's cruelty to workers building stadiums for the soccer world cup.

Making machine learning companies contribute to public treasury [Richard Stallman's Political Notes]

Arguing that the best way to make machine learning companies contribute to the public treasury is to tax their energy use, and the best way to pressure them to respect freedom is to make a public activity to compete with them.

I must however criticize the assumption that "adherence to copyright" is, in a blanket way, a good thing. There has been no let-up in the use of copyright as an excuse to impose control on your computers.

Proposed live stream of execution [Richard Stallman's Political Notes]

Hegseth proposes to transmit a live stream of execution.

Fascists know that inviting people to watch, from a safe distance, acts of violence is likely to make some of them crave more violence. They want to teach their followers to crave violence, as a threat against their opponents.

New idea for housing poor in UK [Richard Stallman's Political Notes]

A new idea for housing for the poor in the UK: donating unbuilt land to community groups.

World must change way it produces food [Richard Stallman's Political Notes]

*World must change way it produces food to avoid biodiversity collapse, says WWF.* Total world populations of 5,000 wild vertebrates have declined by around 3/4, on some sort of average, since 1970. I wouldn't assign precise meaning to that figure, but it shows the magnitude of the threat humanity poses to itself.

Conference about disinformation [Richard Stallman's Political Notes]

The bully pressured various governments to drop support for a conference about disinformation.

It is not surprising that the event planned to discuss the idea of the US government as a source of disinformation, but it is distressing that the EU and Canada are afraid to acknowledge this.

Madman said Iran can take out Los Angeles or San Diego [Richard Stallman's Political Notes]

The madman said, "They (Iran) can take out a city. Let them take – let them take out Los Angeles. Let them take out San Diego. That's – this is a very small price to pay, and it's going to be over with very soon." What does this signify?

Up to the words "Let them take out San Diego", it sounded like direct encouragement for a foreign enemy of the US to destroy US cities. That's what the madman's audience cheered.

The rest of the text changes the spirit subtly. He was not wishing for those cities to be destroyed, merely saying that their destruction, implying the killing of as many as 20 million Americans, would be no great loss.

I never thought he cared

Religious hospitals denying abortions [Richard Stallman's Political Notes]

Religious hospitals in the US continue to deny women abortions, even when the denial risks causing death or permanent injury. This happens even in states such as Illinois where early abortion on demand is lawful. The staff of religious hospitals there face no legal threat if they do the abortion.

Price fixing at McDonalds [Richard Stallman's Political Notes]

McDonalds is accused in court of setting up a supposed intelligence system to enable independently owned franchises to fix prices together.

Ken Paxton favors trickle-down economics [Richard Stallman's Political Notes]

Texas Senate candidate Ken Paxton told a bunch of rich donors that he advocates trickle-down economics — cutting taxes for the rich and cutting spending for the non-rich — saying "we have no choice".

The citizens of Texas do have choices. First step: defeat him!

French know they won republic by protesting [Richard Stallman's Political Notes]

Thanks to French teaching of French history in school, French students (and French adults) know that they won their republic by protesting in the streets.

18:14

This Week in AI: The Cost of Progress [Radar]

New frontier models arrived this week as investors showed signs of growing cautious about AI spending. On the latest episode of This Week in AI, we examined those developments, along with research into how models learn and the less visible costs of AI adoption. From unequal pricing across languages to the environmental impact of data centers, the discussion raised questions about who benefits from AI progress and who pays for it.

Frontier models advance as investors question the spending

We started with three model announcements that show how quickly AI capabilities are expanding. Google introduced Gemini 4 Carbon, designed for cybersecurity and complex, multistep tasks. France’s Mistral published the weights for its trillion-parameter Large 4 model, also known as “Le Chonk,” giving developers more control over deployment and customization, provided they have the hardware to run it. Meanwhile, Google DeepMind previewed Genie 4, a world model that simulates environments, physical interactions, and sequences of events. Unlike language models that predict text, world models attempt to predict what happens when objects and people interact. With Genie 4, researchers could train AI systems in simulated worlds, an approach that would be especially useful in robotics, where teams could test AI designed to control robots before trying it on physical machines.

Investor enthusiasm for AI appeared to weaken even as model development accelerated. Anthropic moved closer to a public offering by filing its IPO paperwork publicly, although it hasn’t announced a date or share price. OpenAI has reportedly secured about $11 billion in funding for its latest round, well below its initial $30 billion target. Those developments coincided with sharp declines in several major technology stocks, and the tech-heavy Nasdaq ended October with its worst monthly decline since March 2025.

The scale of AI spending is attracting greater scrutiny, particularly as investors wait for returns. Companies investing in AI should pay attention to more than model performance. The economics of training and running increasingly expensive models could affect pricing, availability, and which providers remain competitive.

Researchers are rethinking how AI models learn

Researchers are investigating how AI models process information, retain knowledge, and generate responses. AI interpretability company Goodfire proposed a project modeled on the Human Genome Project, committing $10 million to begin mapping how large language models work internally. By studying which patterns activate in response to prompts and how changes to those patterns affect behavior, researchers hope to better understand why models produce particular outputs.

Google Research proposed a framework inspired by human cognition that introduces a “sleep” phase. During this offline period, models would consolidate new information and generate practice examples through a process researchers call “dreaming.” The goal is to address catastrophic forgetting, when learning new information degrades previously acquired capabilities, while helping models retain knowledge beyond individual conversations. The approach remains experimental, but it offers a possible way for models to continue learning without sacrificing existing skills.

We also examined Clover, a 35-billion-parameter diffusion language model released by China’s DiffuSpace. Most familiar language models use what’s called an autoregressive approach: They generate text sequentially, one token at a time. Diffusion language models instead work on multiple parts of an answer simultaneously, refining them over successive passes. DiffuSpace reports competitive performance and faster generation on some tasks when compared to autoregressive models of similar size. Alongside Goodfire’s and Google’s research, this work suggests that improvements in AI may increasingly come from rethinking how models learn and generate outputs rather than simply making them larger.

AI’s hidden costs extend beyond infrastructure spending

Research into the “tokenizer tax” revealed how AI pricing can disadvantage people who speak less widely represented languages. Researchers found that some languages require substantially more tokens than English to express the same message. In one example, the Malayalam translation contained slightly fewer characters than the original sentence in English, yet it required twice as many tokens: 26 compared with 13. Because AI providers commonly charge by token, these differences can translate into higher costs for users, particularly in communities where AI services may already be less affordable. Developers building multilingual applications need to consider tokenization efficiency alongside model quality.

In Finland, authorities are investigating Google’s clearing of more than 400,000 trees for planned data centers. The investigation centers on whether the company completed required environmental assessments before clearing the sites. The case shows why environmental reviews need to happen before land is cleared or construction begins. Once that happens, regulatory action can’t immediately restore the affected ecosystem.

Finally, several AI companies said they plan to honor a shared website opt-out signal that would let publishers indicate that their content shouldn’t be used for AI model training. The proposal could give website owners more control over future data collection, although participation remains voluntary. It can’t reverse the use of material already collected for training, and the standard will only help if AI companies follow the instructions publishers provide.

What’s next

This week’s developments show why evaluating AI progress requires more than tracking model releases and benchmark scores. We need to understand how systems learn, whether their economics are sustainable, and how their costs affect people and communities. As more businesses and individuals adopt AI, those considerations will become harder to ignore.

We’ll be back on Monday, November 9, 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.

17:28

Steve McIntyre: Geeks hacking in Cambridge... [Planet Debian]

We're at the Arm office in Cambridge for fun conversations and Debian hacking, as part of this year's mini-DebConf. Here's some geek pron... :-)

Geeks!

More geeks!

Massive thanks to the Arm folks for making us welcome: Steve Capper and especially Charlie Dixon for going above and beyond to set things up for us!

Cakes!

16:00

Link [Scripting News]

Screenshot of today's posts viewed in a different style sheet.

15:56

15:28

Free Software Directory meeting on IRC: Friday, November 20, starting at 12:00 EST (17:00 UTC) [Planet GNU]

Join the FSF and friends on Friday, November 20 from 12:00 to 15:00 EST (17:00 to 20:00 UTC) to help improve the Free Software Directory.

Free Software Directory meeting on IRC: Friday, November 13, starting at 12:00 EST (17:00 UTC) [Planet GNU]

Join the FSF and friends on Friday, November 13 from 12:00 to 15:00 EST (17:00 to 20:00 UTC) to help improve the Free Software Directory.

15:21

Pinpointing Location of Videos from Background Airplane Sounds [Schneier on Security]

This is fascinating:

The video describes a technique that can reveal where an otherwise unidentifiable recording was made by analyzing its audio for the faint sounds of passing aircraft. The technique is both fascinating and frightening.

It works by looking at Doppler curves, which plot the way a plane’s sound changes as it passes overhead because of the Doppler effect. This is the same familiar Doppler effect that causes the frequency of a siren to rise as it approaches and then fall as it passes by and moves away. More generally, it’s the phenomenon whereby the frequency of a wave perceived by an observer changes when the observer and the source of the wave are moving in relation to one another.

[…]

It’s sound that’s relevant here, though, and specifically the sound of aeroplanes. Early in his video, Colsto brings up a map of the flights that were in the air at the time the video he’s tracing was recorded. Much of this information is publicly available. Aircraft equipped with Automatic Dependent Surveillance–Broadcast (ADS-B) transmit data about their position, velocity, and altitude, which flight-tracking services collect and make available to the public. While not every plane is tracked, the system provides an enormous amount of information about aircraft movements.

15:14

Link [Scripting News]

Good morning and welcome to my idea of a new web. You'll be hearing a lot about this, it's a prototype for the web of Markdown, aka the Writers Web or BonBonWeb, and it'll probably get a few more names pretty soon. And all the tools you've seen me writing and releasing in 2026 play a role here, including RSS.chat and FeedLand. It's all one big new web that is easy to write for and even easier to read. It's the writersweb I've been talking about for so long, and textcasting, and every part is replaceable. Every part. There will be no silos here. It's my last big contribution to the world I believe in, one where software's value is expressed only in terms of price, performance and functionality. I have a funny feeling all your social network software will jump on this bandwagon before too long, and with your help that can happen. All you have to do is use it. I often do a screenshot of a new product on its opening day.

Link [Scripting News]

I'm going to post lots of links to my demo page, and on scripting.com. Example, here's a link to the Scripting News home page in Bonbon.

Link [Scripting News]

Now I know this can be confusing. That's because it's tough to make a web browser that runs inside another web browser. Bonbon, the full product, is itself a web browser, the demo let's you zoom around the BonBonWeb inside of a Chrome-like browser, one that's looking for HTML files instead of Markdown files, as BB does. When you use the full product, there will be no such confusion. It has a bookmarks menu and a history menu. You can put links in the browser chrome. You can view source, pretty anything you would want to do in an earlier browser works in BB. Thanks to Claude we were able to do endless experimentation. Not quite ready to release, but really soooon.

Link [Scripting News]

There will be comments in BonBonWeb. How will that work? You can see in demo.rss.chat. Not hooked up yet, but that's the plan.

Link [Scripting News]

Now in BonBonWeb, the content has no say in how the text is displayed, that belongs to the reader. You can play with that with the A icon next to the address box. When you click the A, a dialog pops up with three choices: Basic, Book, Classic, Mono and Newsprint. I had Claude on the web work with me on this set, for some reason it's better at graphic design than Claude code is. As a writer, I want control of the words, and to be able to use italic and bold, include links, lists with bullets and numbers, etc -- basically the features of web writing that were excluded from Twitter-like systems. I want those back. But I am a writer, and don't have an opinion on how CSS should be used. We all have different moods and preferences. There's a simple version of this in my iPad using iOS, and I use it all the time to filter out all the nonsense websites try to add to my reading experience. In BonBonWeb, we do all the filtering. Same with JavaScript. The content is meant to be read, not to be the user interface of an app.

Link [Scripting News]

Who do I think I am to create a web that works so differently? Just a developer with an idea.

Link [Scripting News]

Why do they have repos that are handling thousands of agents pushing into a single repository at once.

15:07

Vincent Bernat: Scriptable GeoDNS: leaving AWS for Bunny [Planet Debian]

To optimize the performance metrics of this blog, I relied on Amazon CloudFront to serve the assets,1 and Route 53 for the geo-aware DNS2 to direct readers to the closest host serving the content. But Route 53 is expensive: US$0.50 per zone per month, US$0.70 per million geolocation queries, and US$0.75 per healthcheck per month, plus US$1 per month for the KMS key needed to sign zones with DNSSEC. When I discovered that Bunny DNS is almost free for up to 500 domains and features scriptable answers, I made the jump! Plus, it's a European company based in Slovenia.

Bunny CDN

Bunny.net started as BunnyCDN in 2015. They added IPv6 support in 2017. Switching was uneventful. I don't bring a custom domain: I serve the content from the b-cdn.net domain. As I depend on content negotiation to serve AVIF and WebP images, I configure the CDN to cache each image format separately.

I disable logging to avoid collecting personal information. While the bunny.net GDPR page promises they anonymize data, it is unclear what CloudFront keeps in its own logs when logging is disabled.

The only downside of the bunny.net CDN offering is the lack of HTTP/3. I asked their support: two minutes later, they answered they are working on it but have no ETA to share.

Bunny DNS

Bunny.net introduced their DNS offering in 2022 and recently reduced its cost to almost zero. They support geographical routing, but a very cool feature is the scriptable DNS: it runs a piece of user-supplied JavaScript on each query to compute the answer.

I run seven small NixOS virtual machines to host this blog around the world: Paris, Nuremberg, Ashburn, Singapore, San Jose, São Paulo, and Sydney. Bunny's scriptable DNS lets me return the IP addresses of the two nearest servers. The browser falls back to the second server if the first one is down.

const servers = [
  {
    ipv4: "45.90.160.60",
    ipv6: "2a0c:8881:5:100::1",
    latitude: 48.88,
    longitude: 2.22,
  },
  /* […] */
  {
    ipv4: "139.180.162.114",
    ipv6: "2001:19f0:5800:1855:5400:6ff:fef0:4c0a",
    latitude: -33.87,
    longitude: 151.21,
  },
];
const families = { A: "ipv4", AAAA: "ipv6" };
const records = { A: ARecord, AAAA: AaaaRecord };

export default function handleQuery(query) {
  const type = String(query.request.queryType).toUpperCase();
  const family = families[type];
  if (!family) return [];
  // Get user location
  const location = query.request.geoLocation;
  // Build a list of candidates
  let candidates = servers.map(
    (s) => new Server(s[family], s.latitude, s.longitude, 100),
  );
  // Select the two closest alive servers
  const selected = [];
  while (selected.length < 2) {
    const server = RoutingEngine.getClosestServer(candidates, location, true);
    selected.push(server);
    candidates = candidates.filter((s) => s.ip !== server.ip);
  }
  // Return their IP addresses
  return selected.map((s) => new records[type](s.ip, 3600));
}

The above script relies on the RoutingEngine.getClosestServer() helper, which returns the closest alive3 server to the user.4 Thanks to Doggo, we can check it works as expected, at least for A:5

$ doggo --gp-from="Amsterdam" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Amsterdam, NL
                  vincent.bernat.ch.  A     3600s  45.90.160.60
                  vincent.bernat.ch.  A     3600s  116.203.18.48
$ doggo --gp-from="Texas" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Houston (TX), US
                  vincent.bernat.ch.  A     3600s  5.161.44.145
                  vincent.bernat.ch.  A     3600s  149.28.219.155

The most annoying drawback of this method is that a user from Buenos Aires gets both São Paulo (1000 mi, 30 ms RTT) and Ashburn (5200 mi, 140 ms RTT). Most resolvers randomize the order, so the user may pull the web page from Ashburn. We could return only the nearest server—and swap the scripted record with the built-in geographic routing instead. But if the server becomes unavailable, the browser has no alternative until the DNS cache expires. It leaves a short window of unavailability, even with a short TTL.

The HTTPS record solution

The HTTPS DNS record, defined in RFC 9460, solves both the availability and the latency issues. Modern browsers query this record to get additional information to reach an HTTP server, including an alternative port and the application layer protocol—HTTP/2 or HTTP/3. Each record has a priority. We can ask browsers to contact the nearest server first and fall back to the next one if the first is unavailable:

vincent    HTTPS  1 first.geo  alpn="h3,h2"
vincent    HTTPS  2 second.geo alpn="h3,h2"
vincent    HTTPS  3 .          alpn="h3,h2"

; Bunny DNS must provide the two closest servers as "first.geo"
; and "second.geo" with geographic or latency routing.
first.geo  A      45.90.160.60
first.geo  AAAA   2a0c:8881:5:100::1
second.geo A      116.203.18.48
second.geo AAAA   2a01:4f8:1c0c:5eb5::1

vincent    A      45.90.160.60
vincent    A      116.203.18.48
vincent    AAAA   2a0c:8881:5:100::1
vincent    AAAA   2a01:4f8:1c0c:5eb5::1

This looks like the ideal solution! Unfortunately, Chrome ignores any record whose target is not ., hence the last record at priority 3. Moreover, unlike with a CNAME, Bunny DNS does not return the IP addresses for first.geo and second.geo in the additional section. The resolver needs to send a first request to get the HTTPS record, and a second to resolve first.geo.

HTTPS records are still too new for this use case. Back to the drawing board! 📐

The hybrid solution

As a compromise, the script returns the two nearest servers if they are at a similar distance from the user. Otherwise, it returns only the nearest one with a lower TTL of 2 minutes.

export default function handleQuery(query) {
  const location = query.request.geoLocation;
  let candidates = servers.map(
    (s) => new Server(s.ipv4, s.latitude, s.longitude, 100),
  );

  // Select the two closest servers
  const selected = [];
  while (selected.length < 2) {
    const server = RoutingEngine.getClosestServer(candidates, location, true);
    selected.push(server);
    candidates = candidates.filter((s) => s.ip !== server.ip);
  }

  // Compute the distance to the user for each of them
  const [first, second] = selected.map((s) =>
    GeoDistance.calculate(s, location),
  );

  // If the second one is at twice the distance and at more than 1000 miles
  // from the first, return only the first one with a TTL of 2 minutes.
  if (second > 2 * first && second - first > 1000) {
    return [new ARecord(selected[0].ip, 120)];
  }

  // Otherwise, return both with a TTL of 1 hour.
  return selected.map((s) => new ARecord(s.ip, 3600));
}

We can check it with Doggo. From Chicago, we get only the Ashburn server with a TTL of 2 minutes, while from Mexico, we get both Ashburn and San Jose.

$ doggo --gp-from="Chicago" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Chicago (IL), US
                  vincent.bernat.ch.  A     120s   5.161.44.145
$ doggo --gp-from="Mexico" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Queretaro, MX
                  vincent.bernat.ch.  A     3600s  5.161.44.145
                  vincent.bernat.ch.  A     3600s  149.28.219.155
$ doggo --reverse 5.161.44.145 149.28.219.155
NAME                          TYPE  TTL    ADDRESS
145.44.161.5.in-addr.arpa.    PTR   7187s  web05.luffy.cx.
155.219.28.149.in-addr.arpa.  PTR   3600s  web07.luffy.cx.

Note

On the live page, the map below is interactive: point at a location to get the DNS answer, or disable servers to see how the answers change.

Map of the servers answered by Bunny DNS for each location

The complete code is a bit more complex. It works around RoutingEngine.getClosestServer() supporting only IPv4, and it handles the case where there are not enough alive servers to build an answer.

Bunny.net has a comprehensive Terraform provider. I leverage CDK Terrain to build the target state in TypeScript and OpenTofu to deploy it. Have a look at "Managing infrastructure with Terraform, CDKTF, and NixOS" for more details.6

ACME DNS with Hickory DNS

Route 53 covered one additional use case of mine: serving acme.luffy.cx to solve DNS-01 ACME challenges. Unlike Route 53, Bunny DNS cannot restrict access to a single zone with a fine-grained access policy. As this usage requires neither high availability nor low latency, I replaced Route 53 with Hickory, a memory-safe DNS server written in Rust. It supports automatic DNSSEC signatures and dynamic updates. Its configuration is simple:

[[zones]]
zone = "acme.luffy.cx"
zone_type = "Primary"

[zones.stores]
allow_update = true
type = "sqlite"
journal_path = "acme.luffy.cx.sqlite"
zone_path = "acme.luffy.cx.zone"

# Private key to sign the zone with DNSSEC. Generated with:
#  openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256
[[zones.keys]]
algorithm = "ECDSAP256SHA256"
key_path = "/etc/hickory-dns.acme.luffy.cx.pem"

# TSIG key to sign zone updates. Generated with:
#  openssl rand 32
[[zones.stores.tsig_keys]]
algorithm = "hmac-sha256"
key_file = "/etc/hickory-dns.acme.luffy.cx.update.acme.luffy.cx.tsig"
name = "update.acme.luffy.cx."

The provided zone file only seeds the database on first start. I delegate DNS-01 challenges to this zone with CNAME records:

_acme-challenge          CNAME bernat.ch.acme.luffy.cx.
_acme-challenge.vincent  CNAME vincent.bernat.ch.acme.luffy.cx.

Lego, the ACME client I use to get certificates from Let's Encrypt, answers the DNS-01 challenge by pushing entries with the DNS UPDATE protocol.

Unfortunately, Bunny DNS cannot publish a DS record in a zone.7 I need one to secure the acme.luffy.cx zone and certificate delivery. Therefore, I host the luffy.cx zone on deSEC,8 a free DNS hosting service run by a non-profit organization based in Berlin. I derive the DS record to publish in luffy.cx from the DNSKEY record of acme.luffy.cx:

$ ZONE=acme.luffy.cx
$ dig @nsupdate.luffy.cx $ZONE DNSKEY +noall +answer \
>   | dnssec-dsfromkey -a SHA-256 -f - $ZONE
acme.luffy.cx. IN DS 55628 13 2 4946E7508F20E15F1B577A231104B029A1A82E04699A80CD46ADCE31227EE81F


Overall, I am quite happy with the switch to bunny.net. There are still a few rough edges, like the inability to publish DS records, the lack of HTTP/3, and the IPv4-only RoutingEngine.getClosestServer() helper. The bill went from US$5 per month to US$1. So far, performance is on par with AWS, but I only finalized the current setup, including the server in Sydney, in late October. I need a bit more time to gather more data, and I'll post a short update. 📈

Update (2026-11)

This post was briefly discussed on Hacker News and Lobsters.


  1. I had been hosting media assets on CloudFront since 2011. ↩

  2. Route 53 had served bernat.ch since December 2021. I didn't use healthchecks as they were too expensive. I didn't host most of my zones there either, as queries for haproxy.debian.net alone would have cost me around US$10 per month. ↩

  3. A server is alive if it answers an ICMP ping. The bunny.net documentation gives more details about the checks. ↩

  4. The user queries Bunny DNS through a resolver. Usually, either the resolver is close to the user, or it exposes the user's subnet through EDNS client subnet. ↩

  5. Don't use this script as is: RoutingEngine.getClosestServer() only works with IPv4. The final script works around this limitation. ↩

  6. The article is a bit outdated. CDK Terrain replaces CDKTF, OpenTofu replaces Terraform, and I now use Colmena instead of NixOps. ↩

  7. I contacted bunny.net support to ask when they will support publishing a DS record and got an answer seven minutes later: they don't know. 😭

    This is a bummer, as they support automatic CDS, a DNS record to advertise a DS record to the parent zone. They handle one side of the delegation, not the other.

    I also reported a bug with the proof of non-existence, and they replied a day later with a detailed answer. ↩

  8. Why not use deSEC for ACME challenges? You can limit its tokens to a single RRset. I could say I prefer to self-host, but the truth is I only discovered this while writing this article. ↩

14:42

Security updates for Friday [LWN.net]

Security updates have been issued by AlmaLinux (cockpit-files, container-tools:rhel8, delve, gcc-toolset-12-binutils, gimp:2.8, glibc, go-toolset:rhel8, kernel, libfastjson, mariadb:10.3, mod_auth_openidc:2.3, mysql:8.0, php:8.0, pki-core:10.6 and pki-deps:10.6, squid:4, tang, tesseract, thunderbird, and virt:rhel and virt-devel:rhel), Debian (chromium, ntfs-3g, puppet-agent, and trapperkeeper-authorization-clojure), Fedora (freerdp, goose, gpsd, hatch, perl-HTTP-Headers-ActionPack, perl-MIME-tools, perl-Plack, perl-Starman, proftpd, python-mistune, ruby-build, rust-crypto-bigint, rust-ctutils, rust-elliptic-curve, rust-num-bigint, rust-num-bigint0.4, rust-num-modular, rust-num-modular0.6, rust-num-prime, rust-zmij, rust-zstd, rust-zstd-safe, rust-zstd-safe7, rust-zstd-sys, rust-zstd0.13, scribus, sofia-sip, tailscale, tor, and wordpress), Oracle (cockpit-files, delve, firefox, gimp:2.8, kernel, and osbuild-composer), Red Hat (delve, git-lfs, go-toolset:rhel8, grafana, ignition, opentelemetry-collector, osbuild-composer, python-pillow, and yggdrasil), Slackware (openssh), SUSE (bind, brotli, cpupower, expat, fuse-overlayfs, go1.26, google-guest-agent, helm, ibus-typing-booster, kernel, kyverno, libmodplug-devel, librsvg, libX11, nvidia-open-driver-G06-signed, owntone, parted, perl-Cpanel-JSON-XS, perl-Text-CSV_XS, php8, python-Brotli, regclient, roundcubemail, rsyslog, and tomcat), and Ubuntu (ca-certificates, frr, haproxy, linux-nvidia-7.0, linux-nvidia-bos, linux-nvidia-tegra, and nginx).

14:07

How to Get Signed & Personalized Books From Me For the Holidays, 2026 Edition [Whatever]

We’ve come to that time of the year again, where folks begin to think about their holiday gift giving, and at least some of you think about books as the perfect gift. Well, they are! But would make them even more perfect is getting those books signed and personalized. Every year I join forces with Jay and Mary’s Book Center in Troy, Ohio, to sign and personalize books so that you’ll have them available to give to the people you love, including yourself.

From today (Nov. 6) through Friday, December 4, you can order books I have written from Jay and Mary’s and I will come in and sign them for you, and then the bookstore will ship them to you (US only). I strongly encourage you to get your orders in early, so there are no delays in shipping the books to you this holiday season.

Here’s how to do it!

1. Call Jay & Mary’s at their number (937 335 1167) and let them know that you’d like to order signed copies of my books. Please call rather than send e-mail; they find it easier to keep track of things that way.

2. Tell them which books you would like (For example, Monsters of Ohio ), and what, if any, names you would like the book signed to. If there’s something specific you’d like written in the books let them know, but for their sake and mine, please keep it short. Also, if you’re ordering the book as a gift, make sure you’re clear about whose name the book is being signed to. If this is unclear, I will avoid using a specific name.

3. Order any other books you might think you’d like, written by other people, because hey, you’ve already called a bookstore for books, and helping local independent bookstores is a good thing. I won’t sign these, unless for some perverse reason you want me to, in which case, sure, why not.

4. Give them your mailing address and billing information, etc.

5. And that’s it! Shortly thereafter I will go to the store and sign your books for you.

Again, the deadline for signed/personalized books for 2026 is December 4. After December 4 all Scalzi stock will still be signed and available, but I will likely not be able to personalize.

Also, this is open to US addresses only. Sorry, rest of the world. It’s a cost of shipping thing.

What books are available?

CURRENT HARDCOVER: The current hardcover is Monsters of Ohio. There might be hardcovers of When the Moon Hits Your Eye and The Shattering Peace, both of which came out last year, but you should inquire because stock on those would be limited.

CURRENT TRADE PAPERBACK: As of now, all seven books the Hugo-winning Old Man’s War series (Old Man’s War, The Ghost Bridages, The Last Colony, Zoe’s Tale, The Human Division, The End of All Things, The Shattering Piece) are available in trade paperback with matching cover treatments, so if you wanted to give those seven books as a gift, they are all now a matching set. Other books in trade paperback: When the Moon Hits Your Eye, Starter Villain, The Kaiju Preservation Society, The Android’s Dream, Agent to the Stars and Fuzzy Nation, Redshirts (the 2013 Hugo Award winner), Twenty-First Century Science Fiction (which features a story of mine), Metatropolis (which I edited and contribute a novella to) are all also available in trade paperback format. Also available: Robots Vs. Fairies, the anthology that features the story of mine that was adapted for the “Three Robots” episode of the Netflix animated series Love, Death and Robots.

CURRENT MASS MARKET PAPERBACK: The Mass Market Paperback format is being phased out and stocks of it will become increasingly scarce over time (and the series I have in the format will migrate to trade paperback format eventually). That said, at the moment both my Interdependency series (The Collapsing Empire, The Consuming Fire, The Last Emperox) and my Lock In series (Lock In, Head On, companion novella Unlocked) are still available for purchase.

CURRENT NON-FICTION: Your Hate Mail Will Be Graded (essay collection, Hugo winner).

AUDIOBOOKS: The Kaiju Preservation Society, The Last Emperox, The Consuming Fire, The Collapsing Empire, The Dispatcher, The End of All Things, Lock In, Head On, The Human Division, Redshirts, Fuzzy Nation, The God Engines, Metatropolis and Agent to the Stars are all available on CD and/or MP3 CD, and Jay & Mary’s should be able to special order them for you. Check with them about other titles, which may or may not be currently available on CD.

Two things regarding audiobooks: First, if you want these, you should probably call to order these as soon as possible. Second, and this is important, because the audiobooks come shrinkwrapped, I will have to remove the shrinkwrap in order to sign the cover. You ordering a signed audiobook means you’re okay with me doing that and with Jay & Mary’s shipping it to you out of its shrinkwrap.

If you have any other questions, drop them in the comment thread and I’ll try to answer them!

Feeds

FeedRSSLast fetchedNext fetched after
@ASmartBear XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
a bag of four grapes XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Ansible XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
Bad Science XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Black Doggerel XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
Blog - Official site of Stephen Fry XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Charlie Brooker | The Guardian XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Charlie's Diary XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Chasing the Sunset - Comics Only XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Coding Horror XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
Comics Archive - Spinnyverse XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
Cory Doctorow's craphound.com XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Cory Doctorow, Author at Boing Boing XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
Ctrl+Alt+Del Comic XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Cyberunions XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
David Mitchell | The Guardian XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
Deeplinks XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
Diesel Sweeties webcomic by rstevens XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
Dilbert XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Dork Tower XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Economics from the Top Down XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
Edmund Finney's Quest to Find the Meaning of Life XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
EFF Action Center XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
Enspiral Tales - Medium XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Events XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Falkvinge on Liberty XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Flipside XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Flipside XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Free software jobs XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
Full Frontal Nerdity by Aaron Williams XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
General Protection Fault: Comic Updates XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
George Monbiot XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
Girl Genius XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
Groklaw XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Grrl Power XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Hackney Anarchist Group XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Hackney Solidarity Network XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
http://blog.llvm.org/feeds/posts/default XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
http://calendar.google.com/calendar/feeds/q7s5o02sj8hcam52hutbcofoo4%40group.calendar.google.com/public/basic XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
http://dynamic.boingboing.net/cgi-bin/mt/mt-cp.cgi?__mode=feed&_type=posts&blog_id=1&id=1 XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
http://eng.anarchoblogs.org/feed/atom/ XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
http://feed43.com/3874015735218037.xml XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
http://flatearthnews.net/flatearthnews.net/blogfeed XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
http://fulltextrssfeed.com/ XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
http://london.indymedia.org/articles.rss XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
http://pipes.yahoo.com/pipes/pipe.run?_id=ad0530218c055aa302f7e0e84d5d6515&amp;_render=rss XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
http://planet.gridpp.ac.uk/atom.xml XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
http://shirky.com/weblog/feed/atom/ XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
http://thecommune.co.uk/feed/ XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
http://theness.com/roguesgallery/feed/ XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
http://www.airshipentertainment.com/buck/buckcomic/buck.rss XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
http://www.airshipentertainment.com/growf/growfcomic/growf.rss XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
http://www.airshipentertainment.com/myth/mythcomic/myth.rss XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
http://www.godhatesastronauts.com/feed/ XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
http://www.tinycat.co.uk/feed/ XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
https://anarchism.pageabode.com/blogs/anarcho/feed/ XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
https://broodhollow.krisstraub.comfeed/ XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
https://debian-administration.org/atom.xml XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
https://elitetheatre.org/ XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
https://feeds.feedburner.com/Starslip XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
https://feeds2.feedburner.com/GeekEtiquette?format=xml XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
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 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
https://hackbloc.org/rss.xml XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
https://kajafoglio.livejournal.com/data/atom/ XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
https://philfoglio.livejournal.com/data/atom/ XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
https://pixietrixcomix.com/eerie-cutiescomic.rss XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
https://pixietrixcomix.com/menage-a-3/comic.rss XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
https://propertyistheft.wordpress.com/feed/ XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
https://requiem.seraph-inn.com/updates.rss XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
https://studiofoglio.livejournal.com/data/atom/ XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
https://thecommandline.net/feed/ XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
https://torrentfreak.com/subscriptions/ XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
https://web.randi.org/?format=feed&type=rss XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
https://www.baen.com/baenebooks XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
https://www.dcscience.net/feed/medium.co XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
https://www.DropCatch.com/domain/steampunkmagazine.com XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
https://www.DropCatch.com/domain/ubuntuweblogs.org XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
https://www.DropCatch.com/redirect/?domain=DyingAlone.net XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
https://www.freedompress.org.uk:443/news/feed/ XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
https://www.goblinscomic.com/category/comics/feed/ XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
https://www.loomio.com/blog/feed/ XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
https://www.newstatesman.com/feeds/blogs/laurie-penny.rss XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
https://www.patreon.com/graveyardgreg/posts/comic.rss XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
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 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
https://x.com/statuses/user_timeline/22724360.rss XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
Humble Bundle Blog XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
I, Cringely XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Irregular Webcomic! XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
Joel on Software XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
Judith Proctor's Journal XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
Krebs on Security XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
Lambda the Ultimate - Programming Languages Weblog XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
Looking For Group XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
LWN.net XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
Mimi and Eunice XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Neil Gaiman's Journal XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
Nina Paley XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
O Abnormal – Scifi/Fantasy Artist XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Oglaf! -- Comics. Often dirty. XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Oh Joy Sex Toy XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
Order of the Stick XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
Original Fiction Archives - Reactor XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
OSnews XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Paul Graham: Unofficial RSS Feed XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Penny Arcade XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Penny Red XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
PHD Comics XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Phil's blog XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
Planet Debian XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Planet GNU XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
Planet Lisp XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Pluralistic: Daily links from Cory Doctorow XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
PS238 by Aaron Williams XML 15:28, Tuesday, 10 November 16:16, Tuesday, 10 November
QC RSS v2 XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
Radar XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
RevK®'s ramblings XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
Richard Stallman's Political Notes XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Scenes From A Multiverse XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
Schneier on Security XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
SCHNEWS.ORG.UK XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
Scripting News XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Seth's Blog XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
Skin Horse XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Tales From the Riverbank XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
The Adventures of Dr. McNinja XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
The Bumpycat sat on the mat XML 15:21, Tuesday, 10 November 16:01, Tuesday, 10 November
The Daily WTF XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
The Monochrome Mob XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
The Non-Adventures of Wonderella XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
The Old New Thing XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
The Open Source Grid Engine Blog XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
The Stranger XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
towerhamletsalarm XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
Twokinds XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
UK Indymedia Features XML 15:42, Tuesday, 10 November 16:24, Tuesday, 10 November
Uploads from ne11y XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
Uploads from piasladic XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November
Use Sword on Monster XML 15:28, Tuesday, 10 November 16:15, Tuesday, 10 November
Wayward Sons: Legends - Sci-Fi Full Page Webcomic - Updates Daily XML 15:49, Tuesday, 10 November 16:35, Tuesday, 10 November
what if? XML 15:28, Tuesday, 10 November 16:09, Tuesday, 10 November
Whatever XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
Whitechapel Anarchist Group XML 15:28, Tuesday, 10 November 16:17, Tuesday, 10 November
WIL WHEATON dot NET XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
wish XML 15:35, Tuesday, 10 November 16:20, Tuesday, 10 November
Writing the Bright Fantastic XML 15:35, Tuesday, 10 November 16:19, Tuesday, 10 November
xkcd.com XML 15:35, Tuesday, 10 November 16:18, Tuesday, 10 November