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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.”
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.
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.
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.
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.
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.
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.
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:
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.
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.
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:
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.
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.
Keeping Up by Jamie Ramsden [Oh Joy Sex Toy]
Brun With The Assist [QC RSS v2]

she's helping
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.
What they don’t say about corruption, when you take a payoff you’re selling out the people.
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.
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:
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.
Over-reliance on chatbots [Richard Stallman's Political Notes]
*Over-reliance on chatbots can diminish critical-thinking skills, study finds.*
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".
Putin forces attacking ships transporting grain [Richard Stallman's Political Notes]
The Putin forces are attacking ships transporting grain from Ukraine through the Black Sea.
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.
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.
We’re Asking an Appeals Court to Require a Warrant for ALPR Searches [Deeplinks]
Today, along with the ACLU, EFF filed an amicus brief in the Sixth Circuit court of appeals in United States v. Sturdivant, a case where police warrantlessly tracked a suspect’s movements using Automated License Plate Reader (ALPR) data. Our brief details the vast, interconnected network of ALPRs that constantly track drivers around the country and argues that this tracking is a “search” under the meaning of the Fourth Amendment.
Sturdivant involves a series of robberies in and around Cleveland, Ohio. Using surveillance camera footage, police identified the make, model, and color of the robber’s car, but they did not know its license plate number. After running an open-ended search of two ALPR databases, Flock and ELSAG, officers learned a car belonging to the defendant had been tracked near sites of the robberies, eventually leading to his arrest. Faced with a motion to suppress the ALPR evidence, the district court held that Mr. Sturdivant had no reasonable expectation of privacy in his license plate number because it could be observed by members of the public, and that therefore he had no Fourth Amendment interest in not having his car tracked in public places.
But ALPRs are simply not comparable to observing an individual license plate on a passing car. As we’ve explained in many amicus briefs and in our lawsuits directly challenging ALPR use in San Jose, California and Wisconsin, ALPRs give law enforcement “a virtual time machine to view suspects’, or anyone else’s, past movements (and much more) with just the click of a button.” Just last month, a federal district court agreed and held that ALPRs are a “form of indiscriminate mass surveillance” that can violate the Fourth Amendment.
We hope the Sixth Circuit will reverse the lower court in this case and hold that ALPR searches require a warrant.
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.

(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:

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:

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.

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.

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!

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:

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
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.
I tested four scenarios:
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
I tested three scenarios:
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
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!
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. ↩
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(). ↩
Linux 7.5 will be the first stable release including this fix. ↩
At 2.4 GHz, one cycle is about 0.42 ns. ↩
This requires avoiding bpf_fib_lookup(),
which relies on the same kernel lookup. ↩
Why Fewer People Are Challenging Bad Patents [Deeplinks]
The number of petitions being filed at the Patent Trial and Appeal Board (PTAB) has collapsed. That’s not reason for celebration. The PTAB is an important line of defense against low-quality software patents being used in lawsuits against people and companies.
The drop didn’t happen because suddenly patents have become higher quality. It’s simply because USPTO leadership is increasingly refusing to consider good challenges to patents, for reasons unrelated to the merits. The process has become so unreliable that many would-be patent challengers aren’t even trying.
Inter partes review (IPR) is a process that allows people to challenge patents at the Patent Office, rather than having to fight an expensive lawsuit in federal court. It’s one of the most important ways to get bad patents out of the system.
In the third quarter of 2026, July through September, only 97 IPR petitions were filed at the PTAB, compared to 327 petitions during the same period in 2025. Similarly, only 37 IPR petitions were filed in September 2026, compared to 129 petitions in December 2024—the last full month before the current USPTO leadership began reshaping how the Board handles patent challenges.
This dramatic decline shouldn’t just concern patent lawyers. EFF has fought bad patents because so many software and internet patents make claims to the basic tools of free expression online, like sending email, using online ads, or publishing web pages. When bad patents go unchallenged, they affect everyone who cares about the freedom to write new code and make new technology.
That’s why EFF has defended IPR since it came on the scene more than a decade ago. It provides a faster and less expensive way to challenge patents that should never have been granted. Congress created IPRs because the Patent Office makes mistakes. District court litigation is an extraordinarily expensive way to correct them. Without a meaningful administrative review process, bad patents remain powerful weapons in the hands of patent trolls and others seeking to extract settlements from companies that often did nothing wrong.
Now, USPTO leadership is dismantling that safeguard.
Since Congress created the IPR patent challenge process in 2012, the PTAB has always had some discretion in deciding which petitions deserve review. But institution rates today are much lower than their typical historical range.
Between fiscal years 2022 and 2024, the PTAB instituted between 66% and 68% of IPR petitions. In fiscal year 2026, which concluded in September 2026, the institution rate fell to 41%. And institution is only the first step of an IPR—it means the PTAB has agreed to hear the challenge, not that the challenger won, and the patent will be invalidated.
That decline helps explain why fewer petitions are being filed in the first place. Preparing an IPR petition takes substantial time and money. While cheaper than federal court, it’s still a complicated administrative process. Before filing, a challenger typically needs to search for prior art, hire experts, and develop detailed technical and legal arguments about why the patent never should have been granted.
Companies were willing to pay for IPRs because, historically, they could expect a predictable process. Petitions that met the statutory standard generally had a reasonable prospect of being heard and decided on the merits. But the USPTO has made it harder to get petitions heard and is throwing them out for reasons that have nothing to do with the merits of the challenges. Faced with these odds, many potential challengers aren’t filing at all.
When the PTAB decides to hear an IPR case, that means the petition has been “instituted”—but that has never meant that the petitioner will definitely win. It means the PTAB has determined the challenge warrants a full merits review, and the parties could expect the proceeding to continue toward a final written decision. But under the current USPTO leadership, that expectation has disappeared. The PTAB’s institution decisions are being repeatedly vacated by the Director.
USPTO Director John Squires has vacated at least 29 decisions granting institution of IPR proceedings, and subsequently denied the petitions, terminating those proceedings before a final written decision. These include cases that PTAB judges had already agreed to hear, as well as proceedings that Squires himself had previously allowed to proceed. This level of retroactive intervention is unprecedented.
In some cases, the parties had already invested substantial time and money litigating before the PTAB, only to have the proceeding terminated based on new reasoning by the Director’s office that arose after institution.
For example, in Revvo Technologies v. Cerebrum Sensor Technologies, the Director vacated an institution decision and remanded the case to the Board. The Board then instituted review again, but the Director reversed that decision. Using a new approach, the Director said that the petition had inconsistencies between claim construction positions taken before the PTAB and in district court. Since then, that decision has been cited as a basis for terminating several other instituted proceedings.
The result is another layer of uncertainty for people who want to challenge bad patents. Getting through the front door of an institution decision is much harder than it used to be—and now, even getting through that door doesn’t mean the PTAB will decide your challenge. Predictability is one of the things that made IPRs work.
Congress created IPRs in part because challenging a questionable patent in federal court is enormously expensive and risky. Patent examiners work under serious time constraints, and some patents that shouldn’t have been granted will inevitably issue. Not every patent dispute requires years of expensive district court litigation. Congress recognized that, and created an administrative process, staffed with experts more capable of correcting those mistakes.
That system has benefited the public. Since 2012, it has helped invalidate thousands of patent claims that never should have been issued. The IPR process has protected startups, software developers, nonprofits, and small businesses that otherwise would have faced crushing litigation costs simply for building products or offering services that use everyday internet technology.
EFF supports a balanced IPR system because it should be easier to fight against bogus patents that should never have been issued. The cost of fighting a patent can be a weapon in itself, and weak patents don't just burden large technology companies. Patent trolls routinely target small businesses and independent developers, and have gone after podcasters, retailers, and even coffee shops and nonprofits. These organizations have neither the resources nor the desire to spend years litigating over potentially invalid patents in federal court. IPR offers a chance to challenge those patents before litigation costs get out of control.
If we weaken the IPR system, bad patents become much harder and more expensive to challenge.
Some defenders of the current approach argue that lower institution rates reflect more balance in the patent system. But institution rates at the PTAB have plummeted from 68% to 41% in just two years—a nearly 40% decline. IPR petition filings have reached historic lows. And even proceedings that have already been instituted can now be terminated months later, without a decision on the merits.
These developments send a troubling message to members of the public who might want to use the PTAB: don't bother. The PTAB doesn’t need to institute every petition. But it does need to provide a process that is transparent, predictable, and fair. Right now, confidence in the system is disappearing.
If companies, individuals, and nonprofits conclude that IPRs aren’t worth pursuing, the consequences won't stop at the PTAB. More weak patents that never should have been granted will survive, and patent trolls will use them. That means more defendants facing expensive district court litigation or paying settlements driven by the cost of litigation.
That's not what Congress intended when it created IPRs. It should not become the PTAB's “new normal.”
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
U.S. Supreme Court Deals Final Blow to Corporate Human Rights Accountability [Deeplinks]
For the past two decades, the U.S. Supreme Court has been slowly weakening the Alien Tort Statute (ATS), a key human rights law that allows foreign nationals to sue persons or entities in civil court for harms resulting from violations of international law. The court’s recent ruling in Cisco Systems, Inc. v. Doe I dealt the law a final blow, foreclosing—absent new legislation by Congress—any future ability by plaintiffs to use the law to hold technology companies accountable for aiding and abetting human rights abuses. EFF filed multiple amicus briefs in the case, including most recently in the Supreme Court.
The ATS was passed by the very first Congress in 1789 and in just a few words gives U.S. federal courts jurisdiction to hear civil claims brought by foreign nationals against defendants who violated “the law of nations or a treaty of the United States." There has been a longstanding question about what counts as a valid civil claim under “the law of nations.”
In Sosa v. Alvarez-Machain (2004), the Supreme Court had noted three historical international law claims that the First Congress likely had in mind: violation of safe conducts, infringement of the rights of ambassadors, and piracy, collectively known as the Blackstone Three.
The Sosa court also held that federal courts may recognize other substantive causes of action under the ATS if they reflect international norms that are “specific, universal, and obligatory,” stating that this “door is still ajar subject to vigilant doorkeeping, and thus open to a narrow class of international norms today.”
Thus, the Sosa court recognized that the ATS could be used to bring claims related to historical violations of international law as well as select newer claims reflecting modern concepts of human rights.
In Cisco, the Supreme Court overruled the second Sosa holding. The majority held that the current case, a technology company aiding and abetting torture and other human rights abuses, was beyond the scope of the original three ATS claims and it was not for the court to create new ways of enforcing international law. The court said:
[W]e close the door that Sosa cracked to judicially created ATS liability. We do not disturb Sosa’s holding that the ATS is a jurisdictional statute; nor do we revisit its assumption that causes of action are available for torts corresponding to the Blackstone three. We conclude only that Sosa was overly optimistic in its prediction that there might be a narrow class of cases in which courts may create ATS actions without infringing on the prerogatives of the political branches. In truth, this class is a null set.
What result for this case? Cisco argues that the Ninth Circuit erred in holding that aiding-and-abetting liability exists under the ATS for the torts alleged by the plaintiffs. Cisco is correct. Courts cannot create new rights of action to remedy violations of international law, so there is necessarily no liability for aiding and abetting such violations. Plaintiffs’ ATS claims against Cisco must be dismissed.
The Supreme Court’s ending of the plaintiffs’ case against Cisco is hugely disappointing given that the case has been going on since 2011 and the Ninth Circuit in 2023 allowed the case to move forward in an excellent and well-reasoned opinion. The court held, in part:
We conclude that Plaintiffs’ allegations, accepted as true, are sufficient to state a plausible claim that Cisco provided essential technical assistance to the douzheng [violent struggle] of Falun Gong with awareness that the international law violations of torture, arbitrary detention, disappearance, and extrajudicial killing were substantially likely to take place.
The plaintiffs sued Cisco for the company’s role in building and deploying the “Golden Shield,” also referred to as “The Great Firewall of China”—a vast surveillance system that Cisco began building in the late 1990s and that the company customized to enable the Chinese government to target disfavored minorities, including members of the Falun Gong religion.
The thirteen plaintiffs—Falun Gong practitioners—alleged arrest, detention, and torture, including of themselves and family members, at least one of whom died by beating while being detained. The allegations were horrific: the plaintiffs were placed in forced labor camps, beaten with steel rods, shocked with electric batons, and endured sleep deprivation and violent force-feeding.
Importantly, the plaintiffs also alleged that their private emails, text messages, and other information—intercepted by the Golden Shield—were shown to them and used as part of their torture and forced conversion sessions, which included threats to their family members and others who had communicated with them.
And now, Cisco is off the hook for all of this.
As we argued in our amicus brief to the Supreme Court, a robust federal statute is necessary given that voluntary and informal mechanisms of corporate human rights accountability are inadequate.
The plaintiffs filed their lawsuit in 2011. The following year, in 2012, Cisco first published its Global Human Rights Policy. Since then, the company has never provided redress to the plaintiffs, despite its currently operative human rights policy stating:
Where we have identified that we have caused or contributed to an adverse human rights impact, we are committed to providing access to and cooperating in remediation for affected individuals, workers, and communities through legitimate processes.
What’s more, the Associated Press conducted an extensive 2025 investigation, which recently won the Pulitzer Prize, further mapping Cisco’s and other American tech companies’ involvement in creating China’s surveillance state over the past three decades. When questioned by the AP reporters, the companies dismissed any notion of human rights obligations and simply “said they adhere to relevant export controls, laws and regulations where they operate.”
In short, Cisco’s commitment to human rights is a fiction.
Given that the U.S. Supreme Court has effectively read the ATS into non-existence, Congress must now step up. While there might be other avenues for redress including under state law, there must also be a comprehensive federal human rights law allowing any plaintiff to hold American companies—especially technology companies—accountable for aiding and abetting human rights abuses, with knowledge or intent that those abuses would occur, and whether the victims suffered those abuses in the U.S. or in foreign countries.
The implications of this gap in U.S. human rights law are significant. As Prof. Harold Koh considered:
[T]he Justices should ask whether affording such immunity in Cisco would implicitly signal to U.S. companies that they could not be held liable for assisting the U.S. government in committing gross violations. Such violations could include constructing a mass surveillance system that may be used to surveil, persecute, retaliate against, and punish real and perceived opponents and constructing systems that autonomously commit war crimes.
American companies should not have a free pass to build out surveillance states (or other technologically sophisticated systems) that not only violate personal privacy or facilitate censorship, but that can also lead to real-world physical violence and even death.
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.
How to follow this blog in BonBon-land and more.
John Palfrey, a friend and former colleague from Berkman wrote a fantastic post about people at the lawfirms who caved to Trump.
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]
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:
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.
This month I uploaded a new upstream version or a bugfix version of:
This work is generously funded by Freexian!
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!
This month I uploaded a new upstream version or a bugfix version of:
Unfortunately I had no time to work in this category this month.
This month I uploaded a new upstream version or a bugfix version of:
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.
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.
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.
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.
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.
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.
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.
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:

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.
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.
My Super Mid-Life Crisis – Issue 1 – 11 [Comics Archive - Spinnyverse]
The post My Super Mid-Life Crisis – Issue 1 – 11 appeared first on Spinnyverse.
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.
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.
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.
The Genesis Device [Penny Arcade]
New Comic: The Genesis Device
Pluralistic: America cannot undo Trumpism (09 Nov 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

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:
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?
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.

The New York Times Doesn’t Understand AI’s Role in Suppressing Wages https://gizmodo.com/the-new-york-times-doesnt-understand-ais-role-in-suppressing-wages-2000836392
Into the Blueniverse https://catvalente.substack.com/p/into-the-blueniverse
Scamwich: Inside a Restaurant Delivery Payment-Skimming Campaign https://www.infohawk.com/news/2026-11-05-scamwich-restaurant-skimming
Customer or product? https://customerorproduct.org/
#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

Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Folkestone Writers Festival, Nov 16
https://www.creativefolkestone.org.uk/whats-on/cory-doctorow-the-internet-is-broken-now-what/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Santa Barbara: UCSB Reads, Apr 29
https://www.library.ucsb.edu/events-exhibitions/ucsb-reads-2027-presents-author-cory-doctorow
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027
"Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027
"The Memex Method," Farrar, Straus, Giroux, 2027
Today's top sources:
Currently writing:
"The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Fourth draft completed. Submitted to editor.
A Little Brother short story about DIY insulin PLANNING

This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.
https://creativecommons.org/licenses/by/4.0/
Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):
https://mostlysignssomeportents.tumblr.com/tagged/pluralistic
"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla
READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.
ISSN: 3066-764X
Girl Genius for Monday, November 09, 2026 [Girl Genius]
The Girl Genius comic for Monday, November 09, 2026 has been posted.
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.
UK needs to throw off trickle-downers' rules [Richard Stallman's Political Notes]
The UK government needs to follow Keynes and throw off the trickle-downers' rules, which were designed to ensure the rich get richer.
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.
ICJ judge Navi Pillay wins Nobel peace prize [Richard Stallman's Political Notes]
*ICJ judge Navi Pillay wins Nobel peace prize for promoting international law.*
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.
Beginning of the end or end of the beginning? [Richard Stallman's Political Notes]
Robert Reich: The Beginning of the End or the End of the Beginning?
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.
Actually fired for lying [Richard Stallman's Political Notes]
One of the bullshitter's staff has been actually fired for lying. Will wonders never cease?
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.
Snooper glasses recording audio without consent [Richard Stallman's Political Notes]
New snooper glasses were found recording audio without the user's even asking to do so.
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.
Hunting, p04 [Ctrl+Alt+Del Comic]
The post Hunting, p04 appeared first on Ctrl+Alt+Del Comic.
Momma Raised Him Right [QC RSS v2]

he's a good boy. an idiot, but a good boy
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
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?
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.
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.
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.
Joe Marshall: Why vibe code in Lisp? [Planet Lisp]
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.
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.
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.
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
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.

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.
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
0x0000fits 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.
And this is what my long-form Markdown-based posts look like.
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.
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.
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.
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:
cl-csvlisp-statscl-csv’s
:row-fn argument.fare-csv, or DuckDB
with cl-duckdb,
which can also ingest much more file
formats than CSV, including Excel.Table of Contents
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
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*)
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.
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.
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*))
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)
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:
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))
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.
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:
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 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!
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.
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.
BTW, this is what the MD version of one of my blog posts looks like.
Poll: If we want democracy we have to have a web that isn't controlled by the big tech companies.
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):
- 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 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.
- 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/.
- 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)
- 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)
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 :)
Pluralistic: JS Tan and Clarissa Redwine's "Against Tech Oligarchy" (07 Nov 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

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.

Every Past and Tomorrow: The Physical Landscape of AI https://www.kickstarter.com/projects/stephenvoss/every-past-and-tomorrow-a-survey-of-virginia-data-centers
Reflecting on Digital Rights Wins and Losses in Sacramento https://www.eff.org/deeplinks/2026/11/reflecting-digital-rights-wins-and-losses-sacramento
Join EFF to Celebrate the Life of Aaron Swartz https://www.eff.org/deeplinks/2026/11/join-eff-celebrate-life-aaron-swartz
Goodbye from Salon https://www.salon.com/2026/11/05/goodbye-from-salon/
#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

Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Folkestone Writers Festival, Nov 16
https://www.creativefolkestone.org.uk/whats-on/cory-doctorow-the-internet-is-broken-now-what/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Santa Barbara: UCSB Reads, Apr 29
https://www.library.ucsb.edu/events-exhibitions/ucsb-reads-2027-presents-author-cory-doctorow
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027
"Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027
"The Memex Method," Farrar, Straus, Giroux, 2027
Today's top sources:
Currently writing:
"The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Fourth draft completed. Submitted to editor.
A Little Brother short story about DIY insulin PLANNING

This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.
https://creativecommons.org/licenses/by/4.0/
Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):
https://mostlysignssomeportents.tumblr.com/tagged/pluralistic
"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla
READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.
ISSN: 3066-764X
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.
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.
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:
- 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.
- 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.
- [...]
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 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.
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.
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.
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.
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.
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!
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
CreateRemoteThread. The caller of
CreateRemoteThread 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 WriteProcessMemory to
modify the bytes of the process while everything in it is
suspended.
And we saw earlier that
WriteProcessMemory is not atomic, so
it’s possible that a two-byte
WriteProcessMemory writes the first byte,
and then you do your atomic update of both bytes, and then the
WriteProcessMemory finishes by writing the
second byte, leaving a mishmash of your patch and the rogue
one.
On the other hand, anybody who was using
WriteProcessMemory 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
WriteProcessMemory 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.
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.
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.
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.
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
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.
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
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.
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.
Google Forcing AI on Students Is BS [Deeplinks]
Google is rightfully facing blowback for forcing K-12 schools to enable AI if they wanted to keep using Google search. The company quickly backtracked and decoupled and turned off the services by default, but made it clear search will continue to be just another AI chatbot. This mandate forces an ultimatum on educators: accept generative AI or de-google your school.
Students, teachers, and parents across the U.S. are now years into an argument about how schools should respond to the growth of AI-enabled tools. Google decided to skip this debate and take this choice from schools. In August it activated AI chatbot Gemini for 150 million K-12 students on Google Classroom, leaving educators scrambling to respond. A few months later, Google introduced a new way to turn it off — but now administrators would also be turning off Google search.
Google walked this back somewhat, clarifying that Gemini, Gemini notebook, and Search will have their own controls and will be off by default. But because of Google’s broader approach to force AI on all search users, this change is still an example of a tech monopolist pushing unwanted changes into the classroom.
It’s no secret that the biggest companies in AI are operating at a huge loss, in the hope they can follow Uber’s enshittification playbook. Offer a cheap convenience at a major loss until old systems atrophy, then flip the script to reduce wages and raise consumer costs—whether that’s paying with cash or with data.
This puts Google in the odd position of an incumbent, with around 90% of search traffic. It needs to not only make good on its own AI investment, but protect its dominance from new AI tools. It’s not just enough to offer its own AI mode, it needs to turn search into AI mode, while engaging in clumsy self-preferencing that is eating its own ad revenue.
The problem with this approach is the public is split on AI, to put it mildly. Some users will welcome these changes, but the rest are stuck in an all-or-nothing bargain. Anyone concerned about the accuracy of AI overviews or their impact on click-through rates for online communities and small publishers can just deal with it. The bet is any inconvenience in switching to an alternative is enough to keep you trapped.
Google can and should offer a way to disable AI overviews. Smaller services like DuckDuckGo* and Brave search have simple and persisting AI settings which don’t require login. These services also don't mince words and make a distinction between generated AI summaries, suspected AI results, and the backend use of AI to curate links.
It’s not enough to point to opaque workarounds, either. Adding “-ai” to your Google search will usually remove AI Overview, but so will “-unicorn”. This trick isn’t meant to be an AI off-switch, it’s a quirk of how AI Overview was implemented and can change at any time. These tricks also don’t generalize well to settings for system administrators. Hacks might work for now, but everyone—including administrators—deserve clear set-and-forget controls for the tools they rely on.
De-googling your life isn’t easy, and for schools it can be even more difficult. For decades Google has gone after schools to foster life-long Google users—resulting in many institutions being deeply entrenched in its ecosystem despite data privacy concerns. That’s because schools face major switching costs when moving to a competitor. It takes more than flipping a setting—it means a lengthy contract process, staff retraining, and a cumbersome migration of past work.
The difficulty of switching makes granular controls even more essential, particularly for a hot-button issue like generative AI. Few parents would send their kids to AI-driven schools, but they may want their kids to learn tools like search as they exist outside of the classroom. However, many parents and teachers concerned with AI disrupting learning are pushing major school districts to implement temporary AI moratoriums for young students. These pauses are meant to make sure any introduction of AI fits the needs of students and is done in a way that actually makes sure educators are prepared.
But in either camp, this is a choice that must be made by schools, not Google. Teachers know more about what their students need than a trillion-dollar tech company, and this expertise should be respected in their own classrooms.
Google’s self-preferencing and desperate attempt to eventually recoup on an AI money pit must be tempered with more fine-tune controls over generative AI. It’s in Google’s own interest to stop abusing its dominance to piss off users, advertisers, and school communities. It’s also Google’s responsibility as an adjudicated monopolist.
*DuckDuckGo is an EFF donor. EFF donors do not influence our agenda or our positions.
[$] 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.
Presenting 'Desire Lines: Encoding Queer Digital Futures' [Deeplinks]
What does the digital future look like? Who gets to imagine it, shape it, and make it real?
Building a freer, more inclusive digital age requires not only challenging systems of surveillance and control, but also making space for creativity, community, and radical imagination.
That's why earlier this year with the queer arts collective, we put out a call for submissions inviting people to explore the intersections of technology, identity, and digital liberation—whether that involved pointing the lens towards an underrepresented issue in digital justice efforts; sharing personal accounts of joy, pleasure, or sorrow under surveillance; or painting wide imaginations for our communities using technology for good instead of carcerality and doom.
And we’re excited to share that the project is now live! Desire Lines: Encoding Queer Digital Futures explores a digital world that dreams wilder and exists louder. Seven artists share their visions of digital liberation, spanning from early internet-coded yearning to escapist steamy chat rooms and seed-laced battle suits for revolution.
These essays and stories remind us that digital rights aren't just about the existence of technology and its deployment as existing in a vacuum, but instead about how tech tools are a way for people to express themselves freely, find communities, explore identities, and build spaces to exist and seek joy without fear. Too often, conversations about technology focus on innovation, efficiency, and the next big thing while overlooking the people and communities most affected by the systems being built. This project was an effort to break containment and make space for something different: a chance to imagine digital futures rooted in queer creativity, resistance, and possibility.
Together with the queer arts collective, we were excited to launch the magazine and celebrate the artists and ideas that brought it to life through our session at Mozilla Festival last week, ‘Privacy x Queer Desire,’ where we started out by co-curating a community privacy plan grounded in digital fairness before launching the magazine.
If the stories in Encoding Queer Digital Futures teach us one thing, it’s that we don't have to accept the digital future handed to us by oppressive governments and tech companies. We already have pre-Big Tech internet experiences encoded in our fondest memories that can inform our dreams for something better, and together we can build a new reality.
Read Desire Lines: Encoding Queer Digital Futures here.
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.
Food safety scandals in US [Richard Stallman's Political Notes]
Robert Reich: Due to magat corruption, food safety scandals are spreading through cooking in the US.
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.
Putin forces bombarding buses of civilians [Richard Stallman's Political Notes]
The Putin forces are bombarding buses full of civilians in Ukraine, killing many.
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.
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.
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 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.
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.
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.
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... :-)
![]()
![]()
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!
![]()
Screenshot of today's posts viewed in a different style sheet.
EFF Submission to OHCHR Consultation on Child Rights and Safety in the Digital Environment [Deeplinks]
“The safety of young people in the digital environment cannot be assessed without also considering the safety of young people in offline environments. For millions of young people around the world, the digital environment is their safe place, their haven from an unsafe physical environment, community, or family situation. The digital environment may be the best, perhaps only, place for them to find critical safety information and community, to explore ideas that are controversial in their families and larger physical environments, and to otherwise nourish their personal autonomy.
“For these young people, regulatory efforts that limit their access to online services or to certain features they find valuable, make their lives, in total, less safe, even if there has been some marginal safety benefit to their digital environment.
“The OHCHR must thus consider the whole of young persons' lives in any recommendations that come out of this process and not treat ‘safety, physical or mental health, and rights in the digital environment’ as disconnected from safety, physical or mental health, and rights elsewhere.”
So begins EFF’s submission to the global Call for Inputs on Child Rights and Safety in the Digital Environment conducted by the United Nations Office of the High Commissioner on Human Rights. The OHCHR is preparing a report on the issue to be presented to the UN Human Rights Council at its 64th session in the first quarter of 2027. The Human Rights Council requested the OHCHR to solicit input from a wide range of stakeholders, including child and youth perspectives, and convene five regional consultations to assess the risks to the safety of the child in the digital environment and best practices to address these risks in different geographical areas, bearing in mind current and emerging business models.
The OHCHR acknowledges that young people today navigate a digital environment with both “unprecedented opportunities” and “serious and evolving risks,” and sets out a rights-based framing whereby “Children's 'safety' is therefore addressed through the full framework of their rights — with freedom from violence (Art. 19) and protection from exploitation and abuse (Arts. 34–36) as clearly defined obligations, situated alongside privacy (Art. 16), access to information (Arts. 13 and 17), expression (Art. 13), participation (Art. 12), and development (Art. 6). Protection and the full range of children's rights are understood as reinforcing rather than competing imperatives, and measures taken in the name of safety must not be used to restrict the enjoyment of other rights, such as the right to privacy and the right to participate.”
In light of this, EFF’s submission focused on the current general disregard for young people's speech and privacy rights by regulators around the world, all of whom seem far more interested in empowering parents rather than young people themselves, or meaningfully involving young people in the regulatory process. We emphasized the human rights-centered uses young people make of social media that were not specifically set out in the concept note. We also explained that too often, policy proposals aiming to remedy the issues of online safety for young people introduce limitations on access to online services and content rather than tackling the specific problems that people experience.
More specifically, our submission looks at:
The internet is where young people learn, find community, explore their identities, access important information, and express themselves. Curtailing these opportunities doesn't make them safer. And requiring everyone to hand over sensitive personal information just to access online spaces creates privacy risks for all users.
As the OHCHR has acknowledged, the solution to the issue of online safety should not require a choice between protecting young people from danger or protecting their rights. Instead of restricting access, governments should focus on the systems that create these risks in the first place; tech companies must be accountable for their design choices, data practices, and surveillance-driven business models; and young people need to be included in the decisions that affect them.
Read our full submission here.
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.
Cybersecurity & machine learning: Preparing for an unpredictable future with Sean O’Brien and Mike Wilkes [Planet GNU]
November 13, 2026 at 13:30 EST.
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.
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.
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.
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.
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.
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.
Who do I think I am to create a web that works so differently? Just a developer with an idea.
Why do they have repos that are handling thousands of agents pushing into a single repository at once.
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.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.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 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! 📐
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.
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
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.
I had been hosting media assets on CloudFront since 2011. ↩
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. ↩
A server is alive if it answers an ICMP ping. The bunny.net documentation gives more details about the checks. ↩
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. ↩
Don't use this script as is:
RoutingEngine.getClosestServer() only works with IPv4.
The
final script works around this limitation. ↩
The article is a bit outdated. CDK Terrain replaces CDKTF, OpenTofu replaces Terraform, and I now use Colmena instead of NixOps. ↩
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. ↩
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. ↩
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).
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!
| Feed | RSS | Last fetched | Next 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&_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 |