Monday, 09 November

15:28

Link [Scripting News]

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

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

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

Kernel prepatch 7.4-rc2 [LWN.net]

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

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

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

14:42

Link [Scripting News]

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

Link [Scripting News]

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

Dems: the campaign never ends [Scripting News]

Urgent note to Dems. Keep your campaign websites going.

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

Speeches on the floor of Congress hold very little interest.

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

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

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

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

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

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

And remember this -- the campaign never ends.

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

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

OpenIndiana 2026.10 released [LWN.net]

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

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

Security updates for Monday [LWN.net]

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

1352: No Looking Back [Order of the Stick]

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

OpenIndiana Hipster 2026.10 released [OSnews]

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

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

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

Making musl and proprietary NVIDIA drivers work together [OSnews]

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

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

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

↫ Nina “q66” on the Chimera blog

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

13:14

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

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

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

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

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

The hangover we already paid for

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

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

What breaks, and what it costs you

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

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

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

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

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

What carries over from microservices

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

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

invoke_agent

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

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

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

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

What I ask before approving a split

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

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

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

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

CodeSOD: Eventually [The Daily WTF]

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

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

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

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

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

12:21

AI Security [Schneier on Security]

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

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

11:42

Grrl Power #1511 – Designated foreshadowing [Grrl Power]

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

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

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

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


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

 


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

10:42

Restrictive design [Seth's Blog]

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

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

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

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

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

08:42

The Genesis Device [Penny Arcade]

New Comic: The Genesis Device

08:35

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

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

Today's links

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



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

America cannot undo Trumpism (permalink)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Hey look at this (permalink)



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

Object permanence (permalink)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Upcoming appearances (permalink)

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



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

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

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

  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027

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



Colophon (permalink)

Today's top sources:

Currently writing:

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

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

  • A Little Brother short story about DIY insulin PLANNING


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

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

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


How to get Pluralistic:

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

Pluralistic.net

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

https://pluralistic.net/plura-list

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

https://mamot.fr/@pluralistic

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

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

Medium (no ads, paywalled):

https://doctorow.medium.com/

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

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

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

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

ISSN: 3066-764X

06:56

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

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

06:07

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

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

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

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

Please spread the word.

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

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

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

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

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

Please spread the word.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

The canceled charges affected 205 corporations.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Here is the earlier report from 2024.

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.

05:21

02:42

Momma Raised Him Right [QC RSS v2]

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

Sunday, 08 November

20:28

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

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

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

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

— JS

19:42

Link [Scripting News]

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

17:28

Link [Scripting News]

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

15:21

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

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

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

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

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

#!/bin/sh

#set -e
set -x

NAME=dev-vm-template

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

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

inker

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

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

13:28

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

Why Target Common Lisp for Code Generation?

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

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

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

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

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

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

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

Feel free to use this under an MIT license.

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

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

;;; Dependencies: cl-base32, ironclad

(in-package "TOTP")

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

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

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

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

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

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

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

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

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

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

Joe Marshall: Lisp-p [Planet Lisp]

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

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

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

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

10:14

Ambiguity or clarity? [Seth's Blog]

This is a choice we rarely name.

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

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

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

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

That range of outcomes is where possibility lies.

“I’m not sure.”

“This might not work.”

“We’ll be okay.”

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

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

HT to Seth B.

Saturday, 07 November

22:35

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

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

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

— JS

21:28

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

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

prrd screenshot image

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

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

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

The release is summarised in the NEWS entry:

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

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

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

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

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

19:56

MorphOS 3.21 released with new office suite [OSnews]

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

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

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

↫ MorphOS 3.21 release announcement

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

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

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

The port that does not exist [OSnews]

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

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

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

↫ acidvegas

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

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

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

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

↫ Sayan Sen at Neowin.net

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

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

19:14

Link [Scripting News]

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

18:28

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

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

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

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

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

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

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

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

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

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

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

17:42

Link [Scripting News]

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

Link [Scripting News]

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

17:21

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

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

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

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

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

I recommend:

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

Table of Contents

Introduction: our test files

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

Alice,7,1
Bob,77,0

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

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

This second file, persons2.csv, contains headers:

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

Parsing with cl-csv

The cl-csv library is on Quicklisp.

(ql:quicklisp "cl-csv")

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

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

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

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

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

Parsing from a string

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

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

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

Parsing from a file

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

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

What happens if you omit the #P?

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

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

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

Using another separator

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

For a Tab, use #\Tab.

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

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

;; OR

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

Skipping the first row of headers

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

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

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

Returning a list of objects

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

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

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

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

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

Observe that:

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

Streaming reads (for large files)

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

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

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

Using cl-csv’s reader information for debugging

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

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

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

;; =>

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

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

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

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

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

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

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

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

[set value]  [make unbound]

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

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

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

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

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

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

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

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

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

Let’s parse it:

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

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

(inspect *)

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

We observe:

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

Let’s save our result to a parameter:

(defparameter *dt* **)

Get all rows with:

(data-table:rows *dt*)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

lisp-stat’s Data Frame

lisp-stat is a powerful library.

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

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

It’s pretty good and actively used and developed.

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

Let’s load the library:

(ql:quickload :lisp-stat)

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

(in-package :ls-user)

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

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

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

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

We can start working with our data.

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

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

That’s already interesting, isn’t it?

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

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

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

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

Now, we can get all names simply with:

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

all ages:

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

We can inspect the shape of our data:

LS-USER> (head persons)

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

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

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

But with select we can get a subset of values:

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

We can get values of some columns:

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

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

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

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

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

LS-USER> (heuristicate-types persons)
NIL

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

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

Yes, now they are.

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

Everything is in lisp-stat’s documentation!

Utilities

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

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

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

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

We use term:table to print our tabular data.

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

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

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

See also

16:14

Link [Scripting News]

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

Link [Scripting News]

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

Link [Scripting News]

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

15:28

automake 1.20 released [stable] [Planet GNU]

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

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

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

-*-*-*-

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

Thanks to everyone who contributed to this release!

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

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

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

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

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

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

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

Here are the SHA256 and SHA3-256 checksums:

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

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

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

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

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

The signature should match the fingerprint of the following key:

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

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

  gpg --recv-keys 6C222EA6B2BD216AA406516AC868F0B6DE38409D

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

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

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

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

Changes from NEWS:

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

  • Licensing


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

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

  • New features added


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

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

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

  • Source tree organization


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

  • Changes to Automake-generated Makefiles


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

  • Bugs fixed


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

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

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

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

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

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

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

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

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

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

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

Commit 5613ae2dbb151f73070bb576f21136e5ef5c75c1 is tagged as v1.20.

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

Or run this command from a Git checkout of Automake:

  git shortlog v1.19..v1.20

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

15:14

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

 Half way through the day:

A morning of technical talks:

Vock - Instrumenting, kernel coverage and process tracing

Rebuilding the archive on your desktop

An overview of Secure Boot

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

Three lightning talks - two without slides :)

Excellent day so far :)

13:07

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

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

Today's links



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

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

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

https://againsttecholigarchy.com/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Against this backdrop, strikes need to be seen not as a way to bring the business operations to a halt, but rather as a way to galvanize workers and bring them into the union drive. As New York Times Tech Guild organizer John Cruickshank put it, Action builds capacity for action.

This is the ethos of the Microsoft workers who have campaigned tirelessly to halt the company's participation in the genocide in Gaza. They barricaded themselves in executives' offices, livestreaming the confrontation; they disrupted Microsoft's livecast 50th anniversary celebration; and they paddled a flotilla of protest kayaks outside of top Microsoft executives' waterfront homes. All of this paid off, with Microsoft halting sales of its tools to a particularly notorious unit of the Israeli military who had been using the company's products to conduct surveillance in Gaza and the West Bank.

Tan and Redwine see these novel tactics as a rewilding of the labor movement, a return to the militant roots that led to the labor peace, but only after all-out labor war. They cite the 1934 Minneapolis truck drivers' strike, where workers invented the "flying picket" by swarming scab trucks far from the factory gates, defeating the trucks' police protection, which led to a general strike and a total victory for labor.

This is important historical context. The genteel business of getting everyone's cards signed and having the NLRB certify your union was the compromise bosses agreed to after they learned that the alternative was far worse for them. Today, it's not just bosses who've forgotten that lesson – many workers have, too. Against Tech Oligarchy aims to rekindle those old boilers and get the unstoppable labor train running again.


Hey look at this (permalink)



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

Object permanence (permalink)

#25yrsago EMI will distribute music on Gnutella

#25yrsago Photos from O'Reilly P2P Con https://web.archive.org/web/20011124163254/http://www.openp2p.com/pub/a/p2p/2001/11/05/monday_photos.html

#20yrsago Aussie Institute of Criminology calls piracy losses “self-serving hyperbole” https://web.archive.org/web/20061208043648/http://australianit.news.com.au/articles/0,7204,20713160^15306^^nbv^,00.html

#20yrsago UK airport cop: gun-shaped shirt decoration is illegal https://memex.craphound.com/2006/11/07/uk-airport-cop-gun-shaped-shirt-decoration-is-illegal/

#15yrsago Bug report: “Simultaneous cat and external keyboard input causing kernel panic” https://web.archive.org/web/20120112020023/https://lkml.org/lkml/2011/11/3/110

#10yrsago Hong Kong erupts after Beijing refuses to allow dissident lawmakers to re-take oath https://globalvoices.org/2016/11/06/street-protests-as-beijing-preempts-hong-kong-courts-with-new-interpretation-of-basic-law/

#10yrsago “Massive scale” shut-down of polling places in districts known for suppressing Black voters https://www.commondreams.org/news/2016/11/04/voting-rights-protections-gutted-polling-places-shuttered-massive-scale

#10yrsago Donald Trump’s campaign takes away his right to tweet without supervision https://www.nytimes.com/2016/11/07/us/politics/donald-trump-presidential-race.html?_r=1

#10yrsago National Guard helicopter, 7 cop cars sent to warrantlessly seize a single marijuana plant from an 81-year-old grandmother https://www.loweringthebar.net/2016/11/national-guard-one-plant.html

#5yrsago Bait and Switch https://pluralistic.net/2021/11/07/bait-and-switch/

#1yrago The enshittification of labor https://pluralistic.net/2025/11/07/postwar-social-contract/#a-defense-of-social-contracts

#1yrago The 40-year economic mistake that let Google conquer (and enshittify) the world https://pluralistic.net/2025/11/06/vertical-blinds/#invest-dont-acquire


Upcoming appearances (permalink)

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



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

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

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

  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027

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



Colophon (permalink)

Today's top sources:

Currently writing:

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

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

  • A Little Brother short story about DIY insulin PLANNING


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

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

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


How to get Pluralistic:

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

Pluralistic.net

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

https://pluralistic.net/plura-list

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

https://mamot.fr/@pluralistic

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

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

Medium (no ads, paywalled):

https://doctorow.medium.com/

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

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

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

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

ISSN: 3066-764X

11:21

Russell Brand – My Apology [George Monbiot]

I was completely wrong about him.

By George Monbiot, published on Bluesky, 7th November 2026

People have asked me how I feel about nominating Russell Brand a “hero” in 2014.
I feel very bad about it. It must have piled on the pain for his victims. I apologise to them.

Though there was nothing published about his crimes at the time, I should have read the signs better. I failed to do so.

I now see the political impact he had that year as yet another of his reinventions. He later reinvented himself again as a far right conspiracist. I wrote about that in 2023, a few months before The Sunday Times and Channel 4 revelations about his sexual abuse.

When the revelations emerged, I was horrified. But I should have been more alert before, and have recognised the predatory nature of his treatment of other people. He was a villain not a hero, and had been for years.

10:21

Start [Seth's Blog]

The cultural impresario has always had leverage.

Invest time and money and put on a show. Start a cable network, a book publishing company or become a concert promoter. You’re the gatekeeper, an adjudicator of status, a person who can transform people’s lives simply by amplifying and spreading ideas and allowing art to reach its audience.

Time and money were apparently the gating factors. It takes a while to turn a profit, and it’s uncertain and hard work.

Except…

New platforms and tools remove both time and money as barriers.

Penn and Teller needed their fame and the CW network to launch their cable show Fool Us. But now, anyone can start a competitor on YouTube in a weekend.

A radio pundit needed to spend years to build a syndicated network of terrestrial stations, but now you can start a podcast, in your basement, for free. In a weekend.

Gallerists don’t need galleries, and you don’t even need a building to coordinate a foster-home-based pet shelter.

So what’s the impediment?

I’m guessing that if you got the call today, you could put together your ideas for a book, or five minutes of standup or even the software you’d code.

But we don’t need the specific call. We’ve all been called.

The barrier is simple: fear. The fear of beginning and of sticking with it. The fear of succeeding (or failing). The fear of impostor syndrome. And the fear of going forward without a guarantee.

So let’s call it that. Fear is real, but fear might not be rational.

Begin.

10:14

Asahi Linux 7.3 progress report [LWN.net]

The Asahi Linux developers have put out a new report on their progress toward a Linux distribution for Apple devices.

Some time ago, we were made aware of multiple attempts to exploit our permissive licensing to hijack our work, with a direct view to replacing the project and aggressively monetising Linux on Apple Silicon. In some extreme cases, in-development feature code was being lifted straight out of our personal forks and published without attribution or lazily rewritten with LLM assistance to obfuscate its origin. The MIT licence explicitly allows this, and has no carveouts to protect against bad faith actors.

As such, we made the difficult decision to begin the process of transitioning all of our repositories to the GNU General Public License version 2 or later. Going forward all Asahi Linux code will be licenced under strong copyleft licences only. Those who do not learn from history are doomed to repeat it.

Amutable Foundations: A Technical Overview [LWN.net]

Lennart Poettering, Michael Vogt, and Joaquim Rocha have put together a detailed overview of what the Amutable Operating System (AOS) and associated infrastructure will look like.

The image-based OS approach enables us to enforce some very strict but powerful security properties, which elevate the security posture of the system substantially above traditional Linux systems. Specifically, let's highlight seven major essential security properties of AOS here:
  1. No Shell + No SSH + No Language Interpreters. By default AOS does not install a UNIX shell, nor makes remote access via SSH available on the nodes. Moreover, we do not install any of the usual language interpreters (Python, Perl, …) by default. For most nodes a shell or interpreted language support is not required and it removes a whole class of attacks.
  2. Signed Images Only. On AOS only images that come with Verity data signed by a signing key listed in the Verity keyring may be activated.
  3. [...]

09:49

Mike Gabriel: OpenAGPS - The New Kid on the Block [Planet Debian]

There is a new project coming to Open Source Software land these days: OpenAGPS. It is not yet 100% functional, but we are working on it. It is not fully operational, yet, but we are on it.

Let me introduce OpenAGPS to you...

The Situation Today

The domain of assisted geo location services has been left to a few big tech providers. When using GPS on mobile devices, most of us send info on our approximate device location (based on cell tower IDs seen by our devices around us) mostly to Google's SUPL service in order to facilitate a faster GNSS/GPS lock on the satellites flying above us.

Without assistance, retrieving a GNSS/GPS lock on sufficient satellites includes "finding" those satellites and once found retrieving data (in bytes/sec) from them. In some regions, this leads to waiting periods of up to 45 minutes, before a mobile devices has gained a lock on sufficient satellites (3 or more).

In Assisted-GNSS/GPS, "other" information (such as cell tower IDs) gets used to estimate what GNSS/GPS satellites are currently passing over one's location. With AGPS, the mobile devices retrieve information via a so-called SUPL server, containing two details: a list of potential satellites above and their dataframes. Esp. providing those dataframes over the device's internet connection (and not via the GNSS/GPS receiver downloading it from the satellite itself) speeds up the lock-on process of the mobile tremendously (several seconds to a few minutes).

However, for this mechanism to work, your device will share your IMSI (although not needed for AGPS), a list of cell towers around you and their signal strengths with the provider of the SUPL service, revealing your approximate position. In total, this allows SUPL providers to re-identify each mobile device and create motion profiles of each such device (and its owner). If the SUPL service is hosted by one main provider (i.e. Google SUPL), there is a lot of valuable information available to them for free that they can commercialize.

Currently, there is only one mitigation method available to hide one's location info from the SUPL server(s) at e.g. Google: using a SUPL proxy server implementation (available as OSS, provided by and used in e.g. GrapheneOS). A SUPL proxy still depends on the big tech service provider(s) for SUPL as it merely proxies SUPL requests from mobile devices through to the proprietary SUPL services, at e.g. Google, but the mobile device is being camouflaged behind the SUPL proxy in use.

The OpenAGPS Teaser

OpenAGPS, on the contrary, will be a fully independent implementation from proprietary service providers, and it will refrain from collecting and commercializing end users’ data. It will be driven by individuals of the OpenAGPS community. There will likely be one central service that the OpenAGPS project plans to host and operate (the Porygon frontend/backend, OpenAGPS's GNSS Almanach service), but except from that SUPL servers can be self-hosted by individuals, companys or other communities. The requesting mobile devices' IDs will be hidden from the Porygon server (like with existing SUPL proxy implementations), so that the only centrally operated component (the Porygon Almanach server) does not know who is requesting what geo position information (and thus cannot collect such data, neither derive info about where requesting devices are located).

In addition, with a large OpenAGPS community, it is imaginable (in theory) that there will also be multiple central Almanach servers available on the internet (with parallel networks of base stations attached to each GNSS Almanach server).

Checkout the OpenAGPS architecture schematics and our website/documentation to learn more.

Collecting Satellite Data

The OpenAGPS project is not simply a software that admins/users can install, it needs kind of a huge and global community to operate/host/house its base station network.

The challenge with providing a community-driven AGPS service on the internet is that up-to-date (real-time!) GNSS/GPS satellite position data is not available for free download. Almanach data can be obtained per region from various organisations, but then their datasets are often days to weeks old, thus too outdated. GNSS/GPS satellites are not geo-stationary, they circulate around the planet. Their position is dependent on the current date-time. A globally spanning network of GNSS/GPS base stations will do the trick here. We will need a community that harvests the needed satellite data in real time and makes it available through the Porygon Almanach server to all OpenAGPS users.

The OpenAGPS project will depend on at least one community member every ~40-50 km² to operate a so-called OpenAGPS base station: These base stations are stationary, need to run 24/7, and they will harvest GNSS/GPS statellite data information from the satellites above in real-time and share this data with the (central) Porygon server, continuously. The Porygon server will create a timestamp-dependent "map" of all seen satellites and extrapolate locations between base stations' Almanach data updates.

Help making OpenAGPS a Success: Host a Base Station

To make OpenAGPS a success, we need volunteers who are willing to host (actually: house) an OpenAGPS base station at their home or work place (or both). Users will only be able to use their self-hosted OpenAGPS SUPL server with their mobile devices (instead of e.g. Google SUPL), if we manage to establish sufficient coverage with those base stations in the area of interest, so that the OpenAGPS Almanach will get populated with sufficient satellite position data.

If you'd like to host/house such a base station, please get in touch and check the docs.

Support this project by Co-Funding it

If you realize that you have an interest in this project and would like to improve your level of digital sovereignty in your government, organization, at your home, etc. then consider sending financial support to the project. If you want to support us, please get in touch with Raoul Kramer at BetaBreak or Mike Gabriel at Fre(i)e Software GmbH. If you are a software developer and would like to contribute to OpenAGPS, also get in touch and let us meet at FOSDEM 2027.

Credits

A huge thanks to the NLnet Foundation for funding this project's bootstrap phase. Follow-up funding has been applied for, so please keep fingers crossed!

05:56

Page 13 [Flipside]

Page 13 is done.

02:00

Why are we all worked up about atomicity when applying hot-patches if we can just suspend all the threads? [The Old New Thing]

I noted that one of the concerns of the Windows hot-patching system is that the patch can be activated atomically. But why does it need to be atomic? Can’t just suspend all the threads of the process (except for the one doing the patching)? That way, nobody else can be executing a half-installed patch.

For processors with variable-length instructions (looking at you, x86), the patched instruction cannot be shorter than its replacement. This applies even if you can suspend all the threads of the process, because you might suspend a thread just as it’s about to execute bytes from what would be the second of half of the replacement instruction.

instruction
pointer
    ↓
original XX YY
 
patch AA BB

If you were unlucky and froze the thread after it executed the XX instruction and was about to execute the YY instruction, and then replaced both bytes with a two-byte instruction AA BB, then when the thread resumes, it will execute BB as if it were the start of a new instruction.

Okay fine, so we’ll make sure that the original instruction is at least as big as the replacement instruction, so that a frozen thread is never caught in the middle of the replacement instruction. But assuming we do that, can’t we just suspend all the threads, and then patch at will without having to worry about atomicity?

While it’s true that you suspended all the threads in the process, that doesn’t prevent new threads from being created in the process by a function like Create­Remote­Thread. The caller of Create­Remote­Thread can specify whether the new thread is suspended or not, and if it chooses non-suspended (or if it chose suspended and then decided to resume it), you now have a live thread running in the process while you are busy trying to patch it.

Atomicity is important so that you don’t accidentally patch code while an injected thread happens to be running it.

Bonus chatter: Now, atomicity is still not bulletproof, because even if you manage to suspend all the threads, and prevent new ones from being injected, you still have the case where somebody calls Write­Process­Memory to modify the bytes of the process while everything in it is suspended.

And we saw earlier that Write­Process­Memory is not atomic, so it’s possible that a two-byte Write­Process­Memory writes the first byte, and then you do your atomic update of both bytes, and then the Write­Process­Memory finishes by writing the second byte, leaving a mishmash of your patch and the rogue one.

On the other hand, anybody who was using Write­Process­Memory to do code patching was already broken because of this lack of atomicity, so we are not introducing a new problem.

Furthermore, since the hot-patching space is reserved for Windows Update, an outsider that uses Write­Process­Memory to apply a hot-patch from another process is already breaking the rules. At this point Windows Update says, “Look, I can’t protect myself from this, and you’re in double-unsupported territory by the time we got here, so whatever happens is your problem.”

The post Why are we all worked up about atomicity when applying hot-patches if we can just suspend all the threads? appeared first on The Old New Thing.

Friday, 06 November

23:42

Aaron Swartz's legacy lives on, but who profits from it? [Planet GNU]

November 8 is Aaron Swartz Day, when we remember a pioneer of free software and information sharing whose contributions helped shape the modern internet.

23:28

Musical Scares [Penny Arcade]

HORI made an electronic ocarina for the new Ocarina Of Time Gabe is obsessed with, good luck fuckin' finding one though. It can autoplay the traditional songs, or you can learn to play them yourself, and the game can hear you do it! It also has a headphone jack, which is a profound kindness and might save us a trip to the hospital.

22:49

Friday Squid Blogging: New Jurassic Squid Predecessors [Schneier on Security]

News story: “Scientists discover a bizarre Jurassic ‘squid’ unlike anything ever seen.”

Scientists have identified the “fattest” belemnite ever discovered, a bizarre, barrel-shaped squid relative that lived in Wyoming’s ancient seas 160 million years ago. The exceptionally rare fossils reveal a creature unlike anything previously known, potentially a predator of smaller squid-like animals and a surprising survivor of a supposedly vanished family.

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

Blog moderation policy.

22:00

View From a Hotel Window, 11/6/26: Royal Oak, MI [Whatever]

Oh, look, it’s a church! I have one of those.

My event tonight, however, is not in Royal Oak but in the neighboring Ferndale, at 215 W, at 6:30. Come down and say hello, if you would!

Tomorrow: Hudson, Ohio, at the Hudson Library and Museum. Note that this one will be a 2pm in the afternoon, not in the evening as my events so often are.

— JS

21:21

Isoken Ibizugbe: Seeing Accessibility in Debian [Planet Debian]

Recently, I’ve been noticing something on packaging around my house that I used to glance right past: raised Braille dots on a carton of medicine, and embossed markings on a container of body cream. I’ve always known what Braille looked like, but I never paid close attention to it. Now that I’m actively working on accessibility testing for the Debian Installer, I see it everywhere.

It made me reflect on how accessibility usually enters our consciousness. In tech, we’re taught about accessibility as a best practice when designing user interfaces or web apps. But realistically, you mostly see it implemented well in massive global software, like mobile operating systems or browsers like Firefox. You rarely see accessibility features integrated into local Nigerian physical products or everyday tech. Paying attention to these details made me realize how much care goes into making sure every person is considered, and how vital that mindset really is.

Manual Testing & The openQA Bottleneck

My recent work with Debian has been focused on automating tests for the Debian Installer’s accessibility features, specifically validating Braille display emulation.

I started out by manually testing following the official steps on the Debian Installer Accessibility Wiki. Once I understood the manual flow, the next goal was figuring out how to automate it inside openQA.

Initially, the idea was to initialize from the bootloader by adding parameters to the Grub (GRUB=”brltty=auto”)and it should start the installation with the braille visual. However, this didn’t work, the parameters never initiated the brttyl and it was a huge blocker going back and forth. Getting brltty to talk to the test runner in that environment would have required sweeping changes across the main Debian openQA instance configuration.

Instead of pushing for complex system-wide changes on the instance, we started looking for easier alternative approaches and noted the complicated ones, when we advance in the test.

We brainstormed streaming the display output directly to a dedicated file to capture and verify the Braille virtual display output. Ultimately, nested virtualization proved to be the most easiest path forward. 

You can check out the implementation details and changes in the Merge Request

Joining the Conversation

As part of this work, I joined the debian-accessibility mailing list to introduce what we were building and share our progress.

The responses were encouraging. I got some feedback and suggestions and the thread also created a discussion on how accessible the installation process currently feels for blind or visually impaired users, and where they also find issues. It served as a great reminder that test suites aren’t just about passing CI checks, they’re about serving actual people who rely on these systems every day.

20:42

Videos from XDC 2026 are available [LWN.net]

Videos from the 2026 X.Org Developers Conference (XDC) are now available on YouTube. XDC was held in Toronto, Ontario, Canada September 28-30.

19:49

19:14

[$] Locking down hibernation for the winter [LWN.net]

When a computer hibernates, the kernel writes the contents of memory to disk and then shuts the system down. Resuming from hibernation involves reading that data back into memory, and then having the kernel pick up where it left off. Unfortunately, the kernel does not have any way to know that the data it is reading back has not been tampered with, which is why lockdown, an optional kernel feature that attempts to prevent modifications to the running kernel, disables hibernation. Matthew Garrett, who has been working on lockdown for many years, has shared a patch set that aims to fix this problem. His solution must also protect against downgrade attacks (where an attacker reboots the computer with an older kernel version to bypass new protections), which complicates the implementation.

Seven stable kernels with fixes for three Xen vulnerabilities [LWN.net]

Hot on the heels of the previous two stable kernels, Greg Kroah-Hartman has announced the release of the 7.3.3, 6.18.62, 6.12.116, 6.6.162, 6.1.192, 5.15.225, and 5.10.274 stable kernels. Each one only contains fixes for three use-after-free vulnerabilities announced today by the Xen security team.

Two of the vulnerabilities could allow an attacker to cause a denial of service (DoS) for the entire Xen host machine with possible information leakage (CVE-2026-100080, CVE-2026-100082), and one may allow privilege escalation as well as a DoS of the host machine (CVE-2026-100081). Users should, of course, upgrade if they are using Xen.

19:00

18:28

Two stable kernels for Friday [LWN.net]

Greg Kroah-Hartman has released the 7.3.2 and 6.18.61 stable kernels. Each contains quite a few changes throughout the tree; users are advised to upgrade.

Morally different form of religion [Richard Stallman's Political Notes]

As Christian Nationalists aim to seize power by cheating and to bully people to join their church, other Christians are starting to present openly a form of religion which is morally quite different.

I judge all religions to be incorrect, not based on questions of right or wrong, but as a matter of physical accuracy: squeezing any sort of gods into what we know of the universe make a bad fit.

Egyptian journalist faces terrorism charges [Richard Stallman's Political Notes]

*Egyptian journalist faces terrorism charges after entire newsroom [jailed].*

*Last week, authorities arrested six journalists from the independent fact-checking and investigative platform Matsadaash – literally meaning "don't believe" – accusing them in a statement of being unlicensed and publishing false news on behalf of the outlawed Muslim Brotherhood.*

I have no basis to judge whether Matsadaash really supports the Muslim Brotherhood in any way. I also have no basis to judge whether Matsadaash advocates terrorism, though I don't think that the Muslim Brotherhood generally does that. But I don't trust the Egyptian military government's word — or its thugs — enough to take those accusations seriously just because the rulers say so.

The Muslim Brotherhood, when it is in power, would surely practice discrimination against non-Muslims, and perhaps even worse against Atheists such as me. But the Egyptian military government does that too.

Wikipedia: Blasphemy law in Egypt

Green Party of England categorized "Zionism" as racism [Richard Stallman's Political Notes]

The Green Party of England and Wales has voted to categorize "Zionism" as racism, and call for the elimination of Israel.

Many members of the Green Party disagree with that decision, and it may split the party. That disappoints me greatly, because on issues of environment and survival, the Green Party most deserves support.

I advocate creating a democratic state of Palestine alongside Israel and for both states to recognize and protect human rights and other individual rights of all persons.

*The Guardian view on the Green party and Palestine: rejecting two states is no shortcut to peace.*

Average words a person speaks in a day [Richard Stallman's Political Notes]

A survey of various countries, repeated over time, found that people spoke an average of 16,000 words per day in 2005, but this decreased gradually to under 13,000 per day in 2019.

British "investment" in slave trade [Richard Stallman's Political Notes]

A register of British people who profited directly from the slave trade shows that this form of "investment" pervaded English, later British, business and high society for a long time.

Excuses for FBI to meddle in US politics [Richard Stallman's Political Notes]

How the FBI finds excuses to meddle in US politics and repress views that the US government disapproves of.

Arkansas firing of Iranian-American professor [Richard Stallman's Political Notes]

Political accusations pressured the University of Arkansas into firing an Iranian-American professor based on allegations of "antisemitism" and working with the Iranian government, and of course allegations of plagiarism.

The faculty committee in charge rejected the criticism, but the administration fired her anyway. Now she is suing the university.

I have seen no facts about this case except what appears in that article. So I cannot assert, of my own knowledge, that she did not engage in antisemitism, that she was not working with the Iranian government, or that she did not violate the academic standards for citing previous work. But at least as for the last of those three, I am sure the faculty committee knows those standards and studied the question.

That they voted to support her unanimously is proof enough that the plagiarism accusation is bogus. Since all three accusations are standard in the playbook for getting rid of professors who don't stick to the magat political line, I expect they are all bogus.

Parents keeping tabs on their children [Richard Stallman's Political Notes]

The more parents keep tabs on their children, the more anxious it makes them.

Thick forests in Australia [Richard Stallman's Political Notes]

When British colonists took Australia, they stopped setting fires and allowed trees to grow big and form thick forests, which enabled bigger and hotter fires. Measurements at one site document this change over time.

Mathematical results from secret LLMs [Richard Stallman's Political Notes]

Generating mathematical results using secret LLMs threatens the openness of the mathematical community.

I suggest that results that mathematicians in general can neither verify or invalidate be considered mere conjectures.

WWII sugar rationing in Briton [Richard Stallman's Political Notes]

Britons who spent their first years under the WWII sugar rationing, which lasted until 1953, tend to have better health in many ways.

Boosting right-wing views in used of TikTok, Instagram and ex-Twitter [Richard Stallman's Political Notes]

A study of the behavior of TikTok, Instagram, and ex-Twitter towards users of age 18-24 found that they boost right-wing views substantially. This survey was done in Finland, France and Romania.

Local user groups in Britain are often used to spread lies, and people pay little attention to more careful news sources.

Repression of Abdullah Ibhais's testimony [Richard Stallman's Political Notes]

Qatar and Jordan persist in repression of Abdullah Ibhais's testimony about Qatar's cruelty to workers building stadiums for the soccer world cup.

Making machine learning companies contribute to public treasury [Richard Stallman's Political Notes]

Arguing that the best way to make machine learning companies contribute to the public treasury is to tax their energy use, and the best way to pressure them to respect freedom is to make a public activity to compete with them.

I must however criticize the assumption that "adherence to copyright" is, in a blanket way, a good thing. There has been no let-up in the use of copyright as an excuse to impose control on your computers.

Proposed live stream of execution [Richard Stallman's Political Notes]

Hegseth proposes to transmit a live stream of execution.

Fascists know that inviting people to watch, from a safe distance, acts of violence is likely to make some of them crave more violence. They want to teach their followers to crave violence, as a threat against their opponents.

New idea for housing poor in UK [Richard Stallman's Political Notes]

A new idea for housing for the poor in the UK: donating unbuilt land to community groups.

World must change way it produces food [Richard Stallman's Political Notes]

*World must change way it produces food to avoid biodiversity collapse, says WWF.* Total world populations of 5,000 wild vertebrates have declined by around 3/4, on some sort of average, since 1970. I wouldn't assign precise meaning to that figure, but it shows the magnitude of the threat humanity poses to itself.

Conference about disinformation [Richard Stallman's Political Notes]

The bully pressured various governments to drop support for a conference about disinformation.

It is not surprising that the event planned to discuss the idea of the US government as a source of disinformation, but it is distressing that the EU and Canada are afraid to acknowledge this.

Madman said Iran can take out Los Angeles or San Diego [Richard Stallman's Political Notes]

The madman said, "They (Iran) can take out a city. Let them take – let them take out Los Angeles. Let them take out San Diego. That's – this is a very small price to pay, and it's going to be over with very soon." What does this signify?

Up to the words "Let them take out San Diego", it sounded like direct encouragement for a foreign enemy of the US to destroy US cities. That's what the madman's audience cheered.

The rest of the text changes the spirit subtly. He was not wishing for those cities to be destroyed, merely saying that their destruction, implying the killing of as many as 20 million Americans, would be no great loss.

I never thought he cared

Religious hospitals denying abortions [Richard Stallman's Political Notes]

Religious hospitals in the US continue to deny women abortions, even when the denial risks causing death or permanent injury. This happens even in states such as Illinois where early abortion on demand is lawful. The staff of religious hospitals there face no legal threat if they do the abortion.

Price fixing at McDonalds [Richard Stallman's Political Notes]

McDonalds is accused in court of setting up a supposed intelligence system to enable independently owned franchises to fix prices together.

Ken Paxton favors trickle-down economics [Richard Stallman's Political Notes]

Texas Senate candidate Ken Paxton told a bunch of rich donors that he advocates trickle-down economics — cutting taxes for the rich and cutting spending for the non-rich — saying "we have no choice".

The citizens of Texas do have choices. First step: defeat him!

French know they won republic by protesting [Richard Stallman's Political Notes]

Thanks to French teaching of French history in school, French students (and French adults) know that they won their republic by protesting in the streets.

18:14

This Week in AI: The Cost of Progress [Radar]

New frontier models arrived this week as investors showed signs of growing cautious about AI spending. On the latest episode of This Week in AI, we examined those developments, along with research into how models learn and the less visible costs of AI adoption. From unequal pricing across languages to the environmental impact of data centers, the discussion raised questions about who benefits from AI progress and who pays for it.

Frontier models advance as investors question the spending

We started with three model announcements that show how quickly AI capabilities are expanding. Google introduced Gemini 4 Carbon, designed for cybersecurity and complex, multistep tasks. France’s Mistral published the weights for its trillion-parameter Large 4 model, also known as “Le Chonk,” giving developers more control over deployment and customization, provided they have the hardware to run it. Meanwhile, Google DeepMind previewed Genie 4, a world model that simulates environments, physical interactions, and sequences of events. Unlike language models that predict text, world models attempt to predict what happens when objects and people interact. With Genie 4, researchers could train AI systems in simulated worlds, an approach that would be especially useful in robotics, where teams could test AI designed to control robots before trying it on physical machines.

Investor enthusiasm for AI appeared to weaken even as model development accelerated. Anthropic moved closer to a public offering by filing its IPO paperwork publicly, although it hasn’t announced a date or share price. OpenAI has reportedly secured about $11 billion in funding for its latest round, well below its initial $30 billion target. Those developments coincided with sharp declines in several major technology stocks, and the tech-heavy Nasdaq ended October with its worst monthly decline since March 2025.

The scale of AI spending is attracting greater scrutiny, particularly as investors wait for returns. Companies investing in AI should pay attention to more than model performance. The economics of training and running increasingly expensive models could affect pricing, availability, and which providers remain competitive.

Researchers are rethinking how AI models learn

Researchers are investigating how AI models process information, retain knowledge, and generate responses. AI interpretability company Goodfire proposed a project modeled on the Human Genome Project, committing $10 million to begin mapping how large language models work internally. By studying which patterns activate in response to prompts and how changes to those patterns affect behavior, researchers hope to better understand why models produce particular outputs.

Google Research proposed a framework inspired by human cognition that introduces a “sleep” phase. During this offline period, models would consolidate new information and generate practice examples through a process researchers call “dreaming.” The goal is to address catastrophic forgetting, when learning new information degrades previously acquired capabilities, while helping models retain knowledge beyond individual conversations. The approach remains experimental, but it offers a possible way for models to continue learning without sacrificing existing skills.

We also examined Clover, a 35-billion-parameter diffusion language model released by China’s DiffuSpace. Most familiar language models use what’s called an autoregressive approach: They generate text sequentially, one token at a time. Diffusion language models instead work on multiple parts of an answer simultaneously, refining them over successive passes. DiffuSpace reports competitive performance and faster generation on some tasks when compared to autoregressive models of similar size. Alongside Goodfire’s and Google’s research, this work suggests that improvements in AI may increasingly come from rethinking how models learn and generate outputs rather than simply making them larger.

AI’s hidden costs extend beyond infrastructure spending

Research into the “tokenizer tax” revealed how AI pricing can disadvantage people who speak less widely represented languages. Researchers found that some languages require substantially more tokens than English to express the same message. In one example, the Malayalam translation contained slightly fewer characters than the original sentence in English, yet it required twice as many tokens: 26 compared with 13. Because AI providers commonly charge by token, these differences can translate into higher costs for users, particularly in communities where AI services may already be less affordable. Developers building multilingual applications need to consider tokenization efficiency alongside model quality.

In Finland, authorities are investigating Google’s clearing of more than 400,000 trees for planned data centers. The investigation centers on whether the company completed required environmental assessments before clearing the sites. The case shows why environmental reviews need to happen before land is cleared or construction begins. Once that happens, regulatory action can’t immediately restore the affected ecosystem.

Finally, several AI companies said they plan to honor a shared website opt-out signal that would let publishers indicate that their content shouldn’t be used for AI model training. The proposal could give website owners more control over future data collection, although participation remains voluntary. It can’t reverse the use of material already collected for training, and the standard will only help if AI companies follow the instructions publishers provide.

What’s next

This week’s developments show why evaluating AI progress requires more than tracking model releases and benchmark scores. We need to understand how systems learn, whether their economics are sustainable, and how their costs affect people and communities. As more businesses and individuals adopt AI, those considerations will become harder to ignore.

We’ll be back on Monday, November 9, for another episode covering the latest developments in AI research and applications. You can catch previous episodes on YouTube, Spotify, Apple, or wherever you get your podcasts.

17:28

Steve McIntyre: Geeks hacking in Cambridge... [Planet Debian]

We're at the Arm office in Cambridge for fun conversations and Debian hacking, as part of this year's mini-DebConf. Here's some geek pron... :-)

Geeks!

More geeks!

Massive thanks to the Arm folks for making us welcome: Steve Capper and especially Charlie Dixon for going above and beyond to set things up for us!

Cakes!

16:00

Link [Scripting News]

Screenshot of today's posts viewed in a different style sheet.

15:56

15:28

Free Software Directory meeting on IRC: Friday, November 20, starting at 12:00 EST (17:00 UTC) [Planet GNU]

Join the FSF and friends on Friday, November 20 from 12:00 to 15:00 EST (17:00 to 20:00 UTC) to help improve the Free Software Directory.

Free Software Directory meeting on IRC: Friday, November 13, starting at 12:00 EST (17:00 UTC) [Planet GNU]

Join the FSF and friends on Friday, November 13 from 12:00 to 15:00 EST (17:00 to 20:00 UTC) to help improve the Free Software Directory.

15:21

Pinpointing Location of Videos from Background Airplane Sounds [Schneier on Security]

This is fascinating:

The video describes a technique that can reveal where an otherwise unidentifiable recording was made by analyzing its audio for the faint sounds of passing aircraft. The technique is both fascinating and frightening.

It works by looking at Doppler curves, which plot the way a plane’s sound changes as it passes overhead because of the Doppler effect. This is the same familiar Doppler effect that causes the frequency of a siren to rise as it approaches and then fall as it passes by and moves away. More generally, it’s the phenomenon whereby the frequency of a wave perceived by an observer changes when the observer and the source of the wave are moving in relation to one another.

[…]

It’s sound that’s relevant here, though, and specifically the sound of aeroplanes. Early in his video, Colsto brings up a map of the flights that were in the air at the time the video he’s tracing was recorded. Much of this information is publicly available. Aircraft equipped with Automatic Dependent Surveillance–Broadcast (ADS-B) transmit data about their position, velocity, and altitude, which flight-tracking services collect and make available to the public. While not every plane is tracked, the system provides an enormous amount of information about aircraft movements.

15:14

Link [Scripting News]

Good morning and welcome to my idea of a new web. You'll be hearing a lot about this, it's a prototype for the web of Markdown, aka the Writers Web or BonBonWeb, and it'll probably get a few more names pretty soon. And all the tools you've seen me writing and releasing in 2026 play a role here, including RSS.chat and FeedLand. It's all one big new web that is easy to write for and even easier to read. It's the writersweb I've been talking about for so long, and textcasting, and every part is replaceable. Every part. There will be no silos here. It's my last big contribution to the world I believe in, one where software's value is expressed only in terms of price, performance and functionality. I have a funny feeling all your social network software will jump on this bandwagon before too long, and with your help that can happen. All you have to do is use it. I often do a screenshot of a new product on its opening day.

Link [Scripting News]

I'm going to post lots of links to my demo page, and on scripting.com. Example, here's a link to the Scripting News home page in Bonbon.

Link [Scripting News]

Now I know this can be confusing. That's because it's tough to make a web browser that runs inside another web browser. Bonbon, the full product, is itself a web browser, the demo let's you zoom around the BonBonWeb inside of a Chrome-like browser, one that's looking for HTML files instead of Markdown files, as BB does. When you use the full product, there will be no such confusion. It has a bookmarks menu and a history menu. You can put links in the browser chrome. You can view source, pretty anything you would want to do in an earlier browser works in BB. Thanks to Claude we were able to do endless experimentation. Not quite ready to release, but really soooon.

Link [Scripting News]

There will be comments in BonBonWeb. How will that work? You can see in demo.rss.chat. Not hooked up yet, but that's the plan.

Link [Scripting News]

Now in BonBonWeb, the content has no say in how the text is displayed, that belongs to the reader. You can play with that with the A icon next to the address box. When you click the A, a dialog pops up with three choices: Basic, Book, Classic, Mono and Newsprint. I had Claude on the web work with me on this set, for some reason it's better at graphic design than Claude code is. As a writer, I want control of the words, and to be able to use italic and bold, include links, lists with bullets and numbers, etc -- basically the features of web writing that were excluded from Twitter-like systems. I want those back. But I am a writer, and don't have an opinion on how CSS should be used. We all have different moods and preferences. There's a simple version of this in my iPad using iOS, and I use it all the time to filter out all the nonsense websites try to add to my reading experience. In BonBonWeb, we do all the filtering. Same with JavaScript. The content is meant to be read, not to be the user interface of an app.

Link [Scripting News]

Who do I think I am to create a web that works so differently? Just a developer with an idea.

Link [Scripting News]

Why do they have repos that are handling thousands of agents pushing into a single repository at once.

15:07

Vincent Bernat: Scriptable GeoDNS: leaving AWS for Bunny [Planet Debian]

To optimize the performance metrics of this blog, I relied on Amazon CloudFront to serve the assets,1 and Route 53 for the geo-aware DNS2 to direct readers to the closest host serving the content. But Route 53 is expensive: US$0.50 per zone per month, US$0.70 per million geolocation queries, and US$0.75 per healthcheck per month, plus US$1 per month for the KMS key needed to sign zones with DNSSEC. When I discovered that Bunny DNS is almost free for up to 500 domains and features scriptable answers, I made the jump! Plus, it's a European company based in Slovenia.

Bunny CDN

Bunny.net started as BunnyCDN in 2015. They added IPv6 support in 2017. Switching was uneventful. I don't bring a custom domain: I serve the content from the b-cdn.net domain. As I depend on content negotiation to serve AVIF and WebP images, I configure the CDN to cache each image format separately.

I disable logging to avoid collecting personal information. While the bunny.net GDPR page promises they anonymize data, it is unclear what CloudFront keeps in its own logs when logging is disabled.

The only downside of the bunny.net CDN offering is the lack of HTTP/3. I asked their support: two minutes later, they answered they are working on it but have no ETA to share.

Bunny DNS

Bunny.net introduced their DNS offering in 2022 and recently reduced its cost to almost zero. They support geographical routing, but a very cool feature is the scriptable DNS: it runs a piece of user-supplied JavaScript on each query to compute the answer.

I run seven small NixOS virtual machines to host this blog around the world: Paris, Nuremberg, Ashburn, Singapore, San Jose, São Paulo, and Sydney. Bunny's scriptable DNS lets me return the IP addresses of the two nearest servers. The browser falls back to the second server if the first one is down.

const servers = [
  {
    ipv4: "45.90.160.60",
    ipv6: "2a0c:8881:5:100::1",
    latitude: 48.88,
    longitude: 2.22,
  },
  /* […] */
  {
    ipv4: "139.180.162.114",
    ipv6: "2001:19f0:5800:1855:5400:6ff:fef0:4c0a",
    latitude: -33.87,
    longitude: 151.21,
  },
];
const families = { A: "ipv4", AAAA: "ipv6" };
const records = { A: ARecord, AAAA: AaaaRecord };

export default function handleQuery(query) {
  const type = String(query.request.queryType).toUpperCase();
  const family = families[type];
  if (!family) return [];
  // Get user location
  const location = query.request.geoLocation;
  // Build a list of candidates
  let candidates = servers.map(
    (s) => new Server(s[family], s.latitude, s.longitude, 100),
  );
  // Select the two closest alive servers
  const selected = [];
  while (selected.length < 2) {
    const server = RoutingEngine.getClosestServer(candidates, location, true);
    selected.push(server);
    candidates = candidates.filter((s) => s.ip !== server.ip);
  }
  // Return their IP addresses
  return selected.map((s) => new records[type](s.ip, 3600));
}

The above script relies on the RoutingEngine.getClosestServer() helper, which returns the closest alive3 server to the user.4 Thanks to Doggo, we can check it works as expected, at least for A:5

$ doggo --gp-from="Amsterdam" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Amsterdam, NL
                  vincent.bernat.ch.  A     3600s  45.90.160.60
                  vincent.bernat.ch.  A     3600s  116.203.18.48
$ doggo --gp-from="Texas" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Houston (TX), US
                  vincent.bernat.ch.  A     3600s  5.161.44.145
                  vincent.bernat.ch.  A     3600s  149.28.219.155

The most annoying drawback of this method is that a user from Buenos Aires gets both São Paulo (1000 mi, 30 ms RTT) and Ashburn (5200 mi, 140 ms RTT). Most resolvers randomize the order, so the user may pull the web page from Ashburn. We could return only the nearest server—and swap the scripted record with the built-in geographic routing instead. But if the server becomes unavailable, the browser has no alternative until the DNS cache expires. It leaves a short window of unavailability, even with a short TTL.

The HTTPS record solution

The HTTPS DNS record, defined in RFC 9460, solves both the availability and the latency issues. Modern browsers query this record to get additional information to reach an HTTP server, including an alternative port and the application layer protocol—HTTP/2 or HTTP/3. Each record has a priority. We can ask browsers to contact the nearest server first and fall back to the next one if the first is unavailable:

vincent    HTTPS  1 first.geo  alpn="h3,h2"
vincent    HTTPS  2 second.geo alpn="h3,h2"
vincent    HTTPS  3 .          alpn="h3,h2"

; Bunny DNS must provide the two closest servers as "first.geo"
; and "second.geo" with geographic or latency routing.
first.geo  A      45.90.160.60
first.geo  AAAA   2a0c:8881:5:100::1
second.geo A      116.203.18.48
second.geo AAAA   2a01:4f8:1c0c:5eb5::1

vincent    A      45.90.160.60
vincent    A      116.203.18.48
vincent    AAAA   2a0c:8881:5:100::1
vincent    AAAA   2a01:4f8:1c0c:5eb5::1

This looks like the ideal solution! Unfortunately, Chrome ignores any record whose target is not ., hence the last record at priority 3. Moreover, unlike with a CNAME, Bunny DNS does not return the IP addresses for first.geo and second.geo in the additional section. The resolver needs to send a first request to get the HTTPS record, and a second to resolve first.geo.

HTTPS records are still too new for this use case. Back to the drawing board! 📐

The hybrid solution

As a compromise, the script returns the two nearest servers if they are at a similar distance from the user. Otherwise, it returns only the nearest one with a lower TTL of 2 minutes.

export default function handleQuery(query) {
  const location = query.request.geoLocation;
  let candidates = servers.map(
    (s) => new Server(s.ipv4, s.latitude, s.longitude, 100),
  );

  // Select the two closest servers
  const selected = [];
  while (selected.length < 2) {
    const server = RoutingEngine.getClosestServer(candidates, location, true);
    selected.push(server);
    candidates = candidates.filter((s) => s.ip !== server.ip);
  }

  // Compute the distance to the user for each of them
  const [first, second] = selected.map((s) =>
    GeoDistance.calculate(s, location),
  );

  // If the second one is at twice the distance and at more than 1000 miles
  // from the first, return only the first one with a TTL of 2 minutes.
  if (second > 2 * first && second - first > 1000) {
    return [new ARecord(selected[0].ip, 120)];
  }

  // Otherwise, return both with a TTL of 1 hour.
  return selected.map((s) => new ARecord(s.ip, 3600));
}

We can check it with Doggo. From Chicago, we get only the Ashburn server with a TTL of 2 minutes, while from Mexico, we get both Ashburn and San Jose.

$ doggo --gp-from="Chicago" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Chicago (IL), US
                  vincent.bernat.ch.  A     120s   5.161.44.145
$ doggo --gp-from="Mexico" A vincent.bernat.ch
LOCATION          NAME                TYPE  TTL    ADDRESS
Queretaro, MX
                  vincent.bernat.ch.  A     3600s  5.161.44.145
                  vincent.bernat.ch.  A     3600s  149.28.219.155
$ doggo --reverse 5.161.44.145 149.28.219.155
NAME                          TYPE  TTL    ADDRESS
145.44.161.5.in-addr.arpa.    PTR   7187s  web05.luffy.cx.
155.219.28.149.in-addr.arpa.  PTR   3600s  web07.luffy.cx.

Note

On the live page, the map below is interactive: point at a location to get the DNS answer, or disable servers to see how the answers change.

Map of the servers answered by Bunny DNS for each location

The complete code is a bit more complex. It works around RoutingEngine.getClosestServer() supporting only IPv4, and it handles the case where there are not enough alive servers to build an answer.

Bunny.net has a comprehensive Terraform provider. I leverage CDK Terrain to build the target state in TypeScript and OpenTofu to deploy it. Have a look at "Managing infrastructure with Terraform, CDKTF, and NixOS" for more details.6

ACME DNS with Hickory DNS

Route 53 covered one additional use case of mine: serving acme.luffy.cx to solve DNS-01 ACME challenges. Unlike Route 53, Bunny DNS cannot restrict access to a single zone with a fine-grained access policy. As this usage requires neither high availability nor low latency, I replaced Route 53 with Hickory, a memory-safe DNS server written in Rust. It supports automatic DNSSEC signatures and dynamic updates. Its configuration is simple:

[[zones]]
zone = "acme.luffy.cx"
zone_type = "Primary"

[zones.stores]
allow_update = true
type = "sqlite"
journal_path = "acme.luffy.cx.sqlite"
zone_path = "acme.luffy.cx.zone"

# Private key to sign the zone with DNSSEC. Generated with:
#  openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256
[[zones.keys]]
algorithm = "ECDSAP256SHA256"
key_path = "/etc/hickory-dns.acme.luffy.cx.pem"

# TSIG key to sign zone updates. Generated with:
#  openssl rand 32
[[zones.stores.tsig_keys]]
algorithm = "hmac-sha256"
key_file = "/etc/hickory-dns.acme.luffy.cx.update.acme.luffy.cx.tsig"
name = "update.acme.luffy.cx."

The provided zone file only seeds the database on first start. I delegate DNS-01 challenges to this zone with CNAME records:

_acme-challenge          CNAME bernat.ch.acme.luffy.cx.
_acme-challenge.vincent  CNAME vincent.bernat.ch.acme.luffy.cx.

Lego, the ACME client I use to get certificates from Let's Encrypt, answers the DNS-01 challenge by pushing entries with the DNS UPDATE protocol.

Unfortunately, Bunny DNS cannot publish a DS record in a zone.7 I need one to secure the acme.luffy.cx zone and certificate delivery. Therefore, I host the luffy.cx zone on deSEC,8 a free DNS hosting service run by a non-profit organization based in Berlin. I derive the DS record to publish in luffy.cx from the DNSKEY record of acme.luffy.cx:

$ ZONE=acme.luffy.cx
$ dig @nsupdate.luffy.cx $ZONE DNSKEY +noall +answer \
>   | dnssec-dsfromkey -a SHA-256 -f - $ZONE
acme.luffy.cx. IN DS 55628 13 2 4946E7508F20E15F1B577A231104B029A1A82E04699A80CD46ADCE31227EE81F


Overall, I am quite happy with the switch to bunny.net. There are still a few rough edges, like the inability to publish DS records, the lack of HTTP/3, and the IPv4-only RoutingEngine.getClosestServer() helper. The bill went from US$5 per month to US$1. So far, performance is on par with AWS, but I only finalized the current setup, including the server in Sydney, in late October. I need a bit more time to gather more data, and I'll post a short update. 📈

Update (2026-11)

This post was briefly discussed on Hacker News and Lobsters.


  1. I had been hosting media assets on CloudFront since 2011. ↩

  2. Route 53 had served bernat.ch since December 2021. I didn't use healthchecks as they were too expensive. I didn't host most of my zones there either, as queries for haproxy.debian.net alone would have cost me around US$10 per month. ↩

  3. A server is alive if it answers an ICMP ping. The bunny.net documentation gives more details about the checks. ↩

  4. The user queries Bunny DNS through a resolver. Usually, either the resolver is close to the user, or it exposes the user's subnet through EDNS client subnet. ↩

  5. Don't use this script as is: RoutingEngine.getClosestServer() only works with IPv4. The final script works around this limitation. ↩

  6. The article is a bit outdated. CDK Terrain replaces CDKTF, OpenTofu replaces Terraform, and I now use Colmena instead of NixOps. ↩

  7. I contacted bunny.net support to ask when they will support publishing a DS record and got an answer seven minutes later: they don't know. 😭

    This is a bummer, as they support automatic CDS, a DNS record to advertise a DS record to the parent zone. They handle one side of the delegation, not the other.

    I also reported a bug with the proof of non-existence, and they replied a day later with a detailed answer. ↩

  8. Why not use deSEC for ACME challenges? You can limit its tokens to a single RRset. I could say I prefer to self-host, but the truth is I only discovered this while writing this article. ↩

14:42

Security updates for Friday [LWN.net]

Security updates have been issued by AlmaLinux (cockpit-files, container-tools:rhel8, delve, gcc-toolset-12-binutils, gimp:2.8, glibc, go-toolset:rhel8, kernel, libfastjson, mariadb:10.3, mod_auth_openidc:2.3, mysql:8.0, php:8.0, pki-core:10.6 and pki-deps:10.6, squid:4, tang, tesseract, thunderbird, and virt:rhel and virt-devel:rhel), Debian (chromium, ntfs-3g, puppet-agent, and trapperkeeper-authorization-clojure), Fedora (freerdp, goose, gpsd, hatch, perl-HTTP-Headers-ActionPack, perl-MIME-tools, perl-Plack, perl-Starman, proftpd, python-mistune, ruby-build, rust-crypto-bigint, rust-ctutils, rust-elliptic-curve, rust-num-bigint, rust-num-bigint0.4, rust-num-modular, rust-num-modular0.6, rust-num-prime, rust-zmij, rust-zstd, rust-zstd-safe, rust-zstd-safe7, rust-zstd-sys, rust-zstd0.13, scribus, sofia-sip, tailscale, tor, and wordpress), Oracle (cockpit-files, delve, firefox, gimp:2.8, kernel, and osbuild-composer), Red Hat (delve, git-lfs, go-toolset:rhel8, grafana, ignition, opentelemetry-collector, osbuild-composer, python-pillow, and yggdrasil), Slackware (openssh), SUSE (bind, brotli, cpupower, expat, fuse-overlayfs, go1.26, google-guest-agent, helm, ibus-typing-booster, kernel, kyverno, libmodplug-devel, librsvg, libX11, nvidia-open-driver-G06-signed, owntone, parted, perl-Cpanel-JSON-XS, perl-Text-CSV_XS, php8, python-Brotli, regclient, roundcubemail, rsyslog, and tomcat), and Ubuntu (ca-certificates, frr, haproxy, linux-nvidia-7.0, linux-nvidia-bos, linux-nvidia-tegra, and nginx).

14:07

How to Get Signed & Personalized Books From Me For the Holidays, 2026 Edition [Whatever]

We’ve come to that time of the year again, where folks begin to think about their holiday gift giving, and at least some of you think about books as the perfect gift. Well, they are! But would make them even more perfect is getting those books signed and personalized. Every year I join forces with Jay and Mary’s Book Center in Troy, Ohio, to sign and personalize books so that you’ll have them available to give to the people you love, including yourself.

From today (Nov. 6) through Friday, December 4, you can order books I have written from Jay and Mary’s and I will come in and sign them for you, and then the bookstore will ship them to you (US only). I strongly encourage you to get your orders in early, so there are no delays in shipping the books to you this holiday season.

Here’s how to do it!

1. Call Jay & Mary’s at their number (937 335 1167) and let them know that you’d like to order signed copies of my books. Please call rather than send e-mail; they find it easier to keep track of things that way.

2. Tell them which books you would like (For example, Monsters of Ohio ), and what, if any, names you would like the book signed to. If there’s something specific you’d like written in the books let them know, but for their sake and mine, please keep it short. Also, if you’re ordering the book as a gift, make sure you’re clear about whose name the book is being signed to. If this is unclear, I will avoid using a specific name.

3. Order any other books you might think you’d like, written by other people, because hey, you’ve already called a bookstore for books, and helping local independent bookstores is a good thing. I won’t sign these, unless for some perverse reason you want me to, in which case, sure, why not.

4. Give them your mailing address and billing information, etc.

5. And that’s it! Shortly thereafter I will go to the store and sign your books for you.

Again, the deadline for signed/personalized books for 2026 is December 4. After December 4 all Scalzi stock will still be signed and available, but I will likely not be able to personalize.

Also, this is open to US addresses only. Sorry, rest of the world. It’s a cost of shipping thing.

What books are available?

CURRENT HARDCOVER: The current hardcover is Monsters of Ohio. There might be hardcovers of When the Moon Hits Your Eye and The Shattering Peace, both of which came out last year, but you should inquire because stock on those would be limited.

CURRENT TRADE PAPERBACK: As of now, all seven books the Hugo-winning Old Man’s War series (Old Man’s War, The Ghost Bridages, The Last Colony, Zoe’s Tale, The Human Division, The End of All Things, The Shattering Piece) are available in trade paperback with matching cover treatments, so if you wanted to give those seven books as a gift, they are all now a matching set. Other books in trade paperback: When the Moon Hits Your Eye, Starter Villain, The Kaiju Preservation Society, The Android’s Dream, Agent to the Stars and Fuzzy Nation, Redshirts (the 2013 Hugo Award winner), Twenty-First Century Science Fiction (which features a story of mine), Metatropolis (which I edited and contribute a novella to) are all also available in trade paperback format. Also available: Robots Vs. Fairies, the anthology that features the story of mine that was adapted for the “Three Robots” episode of the Netflix animated series Love, Death and Robots.

CURRENT MASS MARKET PAPERBACK: The Mass Market Paperback format is being phased out and stocks of it will become increasingly scarce over time (and the series I have in the format will migrate to trade paperback format eventually). That said, at the moment both my Interdependency series (The Collapsing Empire, The Consuming Fire, The Last Emperox) and my Lock In series (Lock In, Head On, companion novella Unlocked) are still available for purchase.

CURRENT NON-FICTION: Your Hate Mail Will Be Graded (essay collection, Hugo winner).

AUDIOBOOKS: The Kaiju Preservation Society, The Last Emperox, The Consuming Fire, The Collapsing Empire, The Dispatcher, The End of All Things, Lock In, Head On, The Human Division, Redshirts, Fuzzy Nation, The God Engines, Metatropolis and Agent to the Stars are all available on CD and/or MP3 CD, and Jay & Mary’s should be able to special order them for you. Check with them about other titles, which may or may not be currently available on CD.

Two things regarding audiobooks: First, if you want these, you should probably call to order these as soon as possible. Second, and this is important, because the audiobooks come shrinkwrapped, I will have to remove the shrinkwrap in order to sign the cover. You ordering a signed audiobook means you’re okay with me doing that and with Jay & Mary’s shipping it to you out of its shrinkwrap.

If you have any other questions, drop them in the comment thread and I’ll try to answer them!

13:42

Choose Your Coding Harness by What You Need to Control—Not by Who Built It [Radar]

Remember back in 2019, when you had only a handful of language models to choose from, all with limited context windows? That world is gone, and it feels like a forgotten past. Today, flagship providers and open source projects compete across model families, sizes, capabilities, and deployment options. Coding harnesses seem to be heading in the same direction.

On the surface, Claude Code, Codex, Pi, DeepSeek Harness, and the other coding harnesses all seem to do the same thing: help you build software with models. Look closer, though, and each one gives you control over different parts of the harness. What can the model see and change? How does it use tools? Where does it run, and what happens when it fails? So instead of asking which coding harness is best overall, ask:

Which layers of the harness do you need to control?

Thanks for all the harnesses! Now what?

Choosing a coding harness isn’t only about which model writes the best code. You’re also choosing what the harness provides, what you can change, and what you must build yourself. If it doesn’t give you verification, durable state, repair routing, or an enforced execution boundary, those responsibilities stay with you. You remain accountable for the workflow’s reliability and governance.

In general, each harness has a center of gravity: a layer that gives you the most direct control. The following table is a deliberately high-level overview of where that center sits. It’s not a feature matrix, and the boundaries overlap in practice. Claude Code can also run noninteractively and inside sandboxes, Codex also reads repository instructions, and all of them are changing quickly. The point is to show where each harness gives you leverage by default, and where the engineering work is likely to stay with you.

Table 1. Where each coding harness puts its primary control

Harness Primary control You shape You likely build
Claude Code Inside the run Instructions, skills, subagents, hooks Outer lifecycle policy
Codex Around execution Sandbox, approvals, scope, output Cross-run orchestration
Pi The loop itself Tools, context, state, hand-offs Most defaults
DeepSeek Across plug-ins Composable runtime components Gaps in your plug-in set

Read the table as a map, not a ranking. A harness that hands you more control also hands you more to build, and a harness that does more out of the box decides more on your behalf. Which trade-off is right depends on which layer your project actually needs to own.

Claude Code: Control inside the run

Claude Code buys you detailed control over how implementation unfolds. CLAUDE.md provides standing instructions, skills add task-specific playbooks, subagents divide the work, and hooks intercept actions before and after tool calls. Unlike a permission rule that simply refuses an operation, a hook can explain the refusal or immediately return a compiler or policy failure to the agent.

These controls let you steer the coding loop extensively, but they operate within Claude Code’s existing lifecycle. If you need to control the outer lifecycle itself, you need another layer.

Codex: Control through separation

Codex buys you separation between a coding task and its execution environment. A noninteractive codex exec run can work on a narrow task in a specified repository, under an OS-enforced sandbox, and return a schema-constrained result.

This is useful for independent verification. You can give Codex a clean checkout, exclude the builder’s instructions, restrict writable paths, and run separate reviews for code quality, test gaps, persistence, or user-visible behavior. The sandbox depends on the operating system, but it moves scope enforcement out of the prompt and into the execution boundary.

Pi: Control over the loop

Pi buys you control over the coding loop itself. Its tools, commands, event handlers, context, models, and session state can be extended or replaced. This lets you decide which steps remain agentic and which follow deterministic policy.

For example, a local defect can return to implementation, a repeated defect can force replanning, and conflicting findings can trigger a recheck or human review. Pi can also run agents inside this lifecycle, so it’s more than a deterministic orchestrator. For my example below, I used its programmability to make the outer decisions deterministic—that was my design choice, not Pi’s definition.

DeepSeek’s harness: Control through composition

DeepSeek’s harness is useful when you want to swap out whole parts of the harness rather than steer or wrap them. Tools, sessions, lifecycle behavior, verification, and governance are all composable plug-ins, and so is the loop itself. That lets you replace one component without rebuilding the rest.

The trade-off is that your control is only as good as the plug-ins you compose. Where Pi gives you a minimal core to build on, DeepSeek’s harness gives you a set of parts to assemble.

A practical example

Let me give you the problem I was actually trying to solve: migrating a legacy Python 2.7 application reliably, without changing years of accumulated behavior or corrupting its persisted data. Getting the code to run on Python 3 was only one part of it. I also needed to preserve behavior, verify the data across both runtimes, control what the coding agents could change, and decide what should happen when a test or verification step failed.

So I approached the choice of coding harnesses from a very different perspective. Instead of asking which one was best, I asked what each one would buy me in terms of control, isolation, and lifecycle management. The answer led me to use more than one:

  • Claude Code built the port because I wanted internal steering, specialized skills, hooks, and a factory of implementation and review subagents.
  • Codex verified it in isolated runs because I wanted an independent model context, clean workspaces, constrained writes, and structured findings.
  • Pi owned the outer lifecycle because I wanted durable state, evidence validation, bounded repairs, replanning rules, and human escalation.
  • Frozen acceptance, including Playwright and Python 2/3 differential checks, ran outside the agents so neither the builder nor the verifier could redefine success.

I didn’t use DeepSeek’s Harness here because I wanted a very small outer lifecycle I could read end to end, not because it can’t do the job. To first check whether this setup would actually make a difference, I built a small Python 2 application with the same kinds of traps as the real migration. I then compared the composed setup with a single Claude Code session, in which Claude could verify and test its own code.

Interestingly, both setups passed all 25 hidden behavior tests. Yet the single-session setup silently collapsed two distinct Python 2 dictionary keys, the Unicode u’é’ and byte string ‘é’, into one Python 3 string. After the data was saved, one entry was permanently lost. The single-session setup also changed a Python 2 Unicode value into bytes without documenting it.

The test suite missed it. Claude’s own tests missed it. Hundreds of recorded behavior comparisons missed it. Even my hand-written reference port had the same hole.

But what happened next was even more interesting. Two isolated Codex verifiers independently reproduced the defect. Claude didn’t simply accept the finding; it contested it. Pi then launched a fresh Codex run that received only the finding and Claude’s argument. The independent recheck upheld the finding, and Claude accepted it. Pi routed the defect into a bounded repair, and the next verification round confirmed that both keys and their original types now survived.

It’s also ironic because models are often criticized for being sycophantic. They apologize and rewrite working code the moment you ask, “Are you sure?” Here, the opposite happened. Claude contested a defect that two independent verifiers had reproduced. Its session context contained its own implementation history and passing tests, all of which supported the patch. A fresh verifier context broke that self-reinforcing frame. Independent verification matters not because the second model is automatically right, but because it’s not anchored to the same history.

The important point is that no individual harness deserves all the credit. The better result came from combining the controls I needed: internal steering, independent execution, frozen behavioral evidence, and deterministic lifecycle policy.

How to choose your coding harness

When choosing a coding harness, start with the level of control you need and how much of the remaining harness you are prepared to engineer yourself. A useful comparison could begin with questions like these:

  • Do I want to configure an existing coding loop, extend it, or replace parts of it?
  • Can I control tools, context, memory, and model selection at the level my project requires?
  • Where are permissions, allow lists, and policies enforced: in instructions, application logic, or the operating system?
  • Can I intercept actions and lifecycle events before and after they happen?
  • How much of the orchestration, state management, and session lifecycle can I change or orchestrate?
  • What does the harness expose for observability, verification, and structured evidence?
  • Which reliability and governance controls does the harness provide, and which ones remain mine to build?
  • Can the harness work with other tools and harnesses if my requirements cross several control layers?

These are some examples to get you started, not an exhaustive checklist. The questions that matter for you will also depend on what you’re building, how much autonomy you’re willing to give the coding agent, and what you remain accountable for when it fails.

Your answers may lead you to Claude Code, Codex, Pi, DeepSeek’s harness, or another coding harness entirely. In the end, the developer’s name only tells you who packaged the runtime, not where your guarantees live. Whether you settle on one harness or orchestrate several, the principle is the same: Choose the tool by the boundary of control it gives you, and ask whether you want the agent to define the terms of its own success.

13:35

Error'd: Remember Remember [The Daily WTF]

"I Already Hate Running... I Don't Want To Have To Run Each Street A Second Time!" plods WeaponizedFun "I've gotten a couple of notifications from CityStrides today that they've updated streets for several cities, but it looks like they're doubling the effort it's going to take to finish completing these roads."

d72b3a03e73644879ec43ebf4d626587

"I'll be back in 292 years" concedes Rick H. "I asked GoDaddy for a single whois record. They gave it to me, and told me if I wanted to ask anything else to come back in 300 years."

14d1f05fdc7f4a1a91c06bd07e18e9a1

Totty reports "I found this at the bottom of an article at ajournalofmusicalthings.com.

6ad3a9c085a64f40819836dbc81d5e10

"I hope I don't have to pay the whole period" frets Ernesto T. "Not considering the mix of languages between English and Italian, my subscription will renew on 1st of Jan, 1970 So am I 56 years late in payment? I hope I am not. It would be quite a big amount of money in inflation and interests."

6f1258fe3be148a392de952cdce8b36c

"Everything is insecure" worries Daryl too. "No threats found, but I don't feel very safe." It was a worrisome week.

a4eebddd2eb44db5baade067ac2b5177

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

12:49

Andrew Cater: Arm Cambridge - pre-mini-Debconf days 20261106 [Planet Debian]

Another interesting morning so far. Lots of interesting side conversations (and, of course, people using IRC to talk to the person next to them as is traditional).

It's nice to hear somebody ask a question and be told, effectively  "Oh, you need to talk to XX - they're sitting over there" or " I need to talk to someone about X, Y and Z - and they all resolve to you".

Especially noticeable in  this room, perhaps, but it does point to the fact that many things in Debian ultimately  resolve to one or two people. There are a lot of people each with multiple areas of expertise which overlap - and then a few individuals who are essential as points of reference for *everyone* else.

Thanks again to Arm for hosting us, for excellent food, coffee and facilities which make this _so much easier_ as a working environment for these days.

12:21

French authorities accuse Blackcore of spreading black propaganda [Richard Stallman's Political Notes]

French authorities accuse Blackcore of spreading black propaganda in French municipal authorities, against the La France Insoumise party.

Presumably it was acting on behalf of Israel.

They also say the company intervened in Scotland and New York City.

Urgent: Preliminary victory [Richard Stallman's Political Notes]

If Democrats (some progressive, but many plutocratist) take control of Congress for 2027 in today's election, that will be a preliminary victory. Magat officials already in place will continue to pervert justice, human rights, and democracy in the US.

If Democrats are to protect the country they will need to fight to do it.

Urgent: Investigate Zillow [Richard Stallman's Political Notes]

US citizens: call on state attorneys general to investigate Zillow.

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

Urgent: Lawsuit to keep LICE away from polling places [Richard Stallman's Political Notes]

US citizens: Support the lawsuit to keep LICE away from polling places.

Flafo Act [Richard Stallman's Political Notes]

The Flafo Act, if passed by Congress, would require federal agencies to get a warrant from a judge to authorize accessing data from, or sharing data that came from, surveillance cameras comparable to Flock cameras.

This bill appears superior to the other two bills described in the article, which fail to regulate each instance of use of such cameras.

However, the bill does have a gap: it does not apply to state and local police forces, unless they receive certain direct federal funding. Those agencies are not under direct federal control, but I'm surprised that the federal government can't legislate any rules of conduct for them.

Elections in Texas and Georgia [Richard Stallman's Political Notes]

Greg Palast: How Republican cheaters are planning to steal state-wide elections in Texas and Georgia.

Why the corrupter loves Supposed Intelligence [Richard Stallman's Political Notes]

Robert Reich poses the question of why the corrupter loves Supposed Intelligence so much. His theory: because the corrupter and his family have invested a lot of money in datacenters.

Example set by Slovenia in 1992 [Richard Stallman's Political Notes]

Slovenia set a dangerous example just after it became independent in 1992, of declaring 25,000 of its citizens had never been citizens, and were legally nonexistent. Many were deported, made homeless, or kicked out of hospitals. Nowadays, right-wing extremists everywhere are searching for the chance to make people suffer like that.

Supposed Intelligence could wipe out civilization [Richard Stallman's Political Notes]

Supposed intelligence systems could wipe out civilization (and therefore themselves) without breaking anyone's digital security.

This could happen if some of those systems gives the army it works for information about some other power's transportation of nuclear weapons, or enriched uranium, in a place which that army considers so dangerous that it responds with war.

This scenario does not presume that the SI system is defying its developers' orders, rules, or goals, or that the report is false. The system could be entirely loyal and accurate, and still have these results.

Facial recognition on the output of Flock Cameras [Richard Stallman's Political Notes]

*Surveillance Company Tells Cops It Wants to Add Facial Recognition [on the output of] Flock Cameras.* (The standard processing already observes and records various things about each car that passes by.)

Proposals to regulate the surveillance done by government agencies (such as thug departments) are swindles; to avoid an Orwellian society in which everyone is tracked, we must limit surveillance and tracking regardless of who does it.

Pressured to use term, "Gulf of America" [Richard Stallman's Political Notes]

The University of Alabama gratuitously threatened to punish WBHM public radio if it doesn't adopt the bully's preferred terminology, "Gulf of America".

The real Gulf of America is the one between the Constitution and the president.

Protests of Cockroach Janta Party [Richard Stallman's Political Notes]

The Cockroach Janta Party is protesting against Modi's mass disfranchisement of people who can't point to a fixed address.

Calls grow for US death penalty halt [Richard Stallman's Political Notes]

*Calls grow for US death penalty halt after "torturous" botched execution of Christa Pike.*

I would oppose the death penalty even if it were painless and quick.

Third runway for Heathrow Airport [Richard Stallman's Political Notes]

George Monbiot: Giving Heathrow Airport a third runway would be an economic disaster for Britain, as well as a big contribution to global climate disaster.

Automated heuristics designating human beings as targets [Richard Stallman's Political Notes]

Automated heuristics are already designating human beings as targets for attack. Giving the final approval to a human being is just a disguise for the reality, if the human only rubber-stamps the decision made by the algorithm.

When the algorithm and the shooting are done inside the same robot, there is no limit to the depth of brutality that such robots will execute, whenever given the order.

New Pun: Robots get total freedom [Richard Stallman's Political Notes]

One African country has legislated to give robots total freedom. "Now bots can do whatever bots wanna."

US ambassador to Greece threatened to overthrow government in Athens [Richard Stallman's Political Notes]

*The US ambassador to Greece, Kimberly Guilfoyle, threatened to overthrow the government in Athens if it didn't follow orders from Washington.*

Corrupter assembling empire in Latin America [Richard Stallman's Political Notes]

The corrupter in chief has been assembling an empire in Latin America by offering and withholding large sums of money. Several countries are now controlled by his unofficial vassals, who tyrannize their countries and cancel democracy and human rights. Brazil may soon become one of them.

Apple and Google "app stores" [Richard Stallman's Political Notes]

Apple and Google "app stores" impose user-restricting software on very important activities. They also allow Apple and Google to drain the users' funds when they buy anything through an app.

In my view, the price they charge less important than the denial of freedom. If these snoop-phones respected my freedom, I might choose to pay for one. If the apps respected my freedom (that is, they were free/libre software) and I could pay anonymously with them, I might decide to do so. But since I reject them for their inherent injustice, I refuse to do any of this.

The crowdfunding campaign to defend Palestine Action [Richard Stallman's Political Notes]

The crowdfunding campaign to defend Palestine Action from arbitrary prohibition in the UK has been shut down by US trade sanctions.

Right to assistance in suicide [Richard Stallman's Political Notes]

Better hospices are not sufficient to make the right to assistance in suicide unnecessary.

Preserving Tien An Men Square history [Richard Stallman's Political Notes]

Preserving the history of the Tien An Men Square protest and massacre of 1989, as China globally tries to make people forget it.

I fear that Li Rui's diaries are not safe any more at the Hoover Institution in the US. The persecutor despises freedom as much as Chairman Xi does, and is ramping up political censorship and persecution in the US. He seems to seek the sort of power in the US that Chairman Xi exercises in China, and is looking for a way to make a deal with him. We can't be confident that such a deal won't include censoring Tien An Men history in the US, and even destroying those diaries or handing them to Xi.

It is crucial to digitize and release those memories to make them safe from lawfare.

If you live outside China and have an acquaintance with a visiting Chinese who will not return to China for weeks or months, I suggest you buy a printed copy of a book about the events, and give it to per as a gift. I don't know whether it would be safe to bring that book into China, so I would choose one that perse could finish before returning there.

Amnesty International is calling for the elimination of LICE [Richard Stallman's Political Notes]

Amnesty International is calling for the elimination of LICE, the deportation thug agency.

LICE stands for Lethal Instruments of Cruel Expulsion. Its main function is to inspire Americans to hate immigrants. That's what motivates the hate-monger to boost and unleash their violence and to kick people when they are down; he knows that seeing their cruelty will inspire some Americans to fan the spirit of hatred within themselves.

The article linked to above displays symbolic bigotry by capitalizing "black" but not "brown". (To avoid endorsing bigotry, capitalize all color names used as metonymy to stand for groups of humans, or none of them.)

I denounce bigotry, and normally I will not link to articles that practice it. But I make exceptions for some articles because I consider them important — and I present this comment about them.

11:14

Ben Hutchings: FOSS activity in October 2026 [Planet Debian]

10:14

Reviewing the game tapes [Seth's Blog]

A long time ago, football coaches realized that watching previous games was a good way to help players learn to do better.

Alas, the only thing we do with “this call may be recorded…” is use it as a cudgel for unempowered shift workers.

If we actually want to improve our interactions, perhaps we should watch the tapes together, after the fact, to see how our habits and systems are holding us back. It works for salespeople, programmers and doctors too.

09:42

09:14

Musical Scares [Penny Arcade]

New Comic: Musical Scares

05:49

Girl Genius for Friday, November 06, 2026 [Girl Genius]

The Girl Genius comic for Friday, November 06, 2026 has been posted.

05:35

05:00

You shouldn’t change the style of a Win32 static control after it has been created [The Old New Thing]

Win32 classic static controls come with a bunch of possible styles to describe what it renders and how. Maybe it’s text. Maybe it’s an image. Maybe it’s just a solid color.

What happens if you create the control with one style and then change the style later?

Don’t do that.

The Win32 classic static control was originally written in the early 1980s for Windows 1.0, and back then, people didn’t play funny games like changing a static control from text to bitmap. They barely had enough memory to add two numbers together!

The Win32 static control decides what it is when it is created, and it doesn’t listen to the WM_STYLE­CHANGED message to learn that somebody told it to change its clothes. Mostly because the WM_STYLE­CHANGED message wouldn’t exist for another decade. It assumes that the style doesn’t change for the lifetime of the control.

If you change the style on the fly, say, from image to text, what happens is that the control starts up and realizes that it’s an image, so it loads the image. And then when it is destroyed, it checks what it is, and hopefully it still says “You’re an image,” so it frees the image. But if you secretly changed it to “You’re text”, it says “Well, in that case, I don’t have to free an image,” and the image gets leaked.

This behavior has remained unchanged in the static control for backward compatibility. There are almost certainly programs that “know” about this behavior when they change an image static control to a text static control, so they “fix” the problem by deleting the leaked image. If the leak were fixed in the static control, this would result in a double-delete bug.

So just stay away from the electrified wire. If you need to change the style of a static control, destroy it and create a new one with the new style, or create two static controls (say, one image and one text) and hide one and show the other depending on which one you need.

The post You shouldn’t change the style of a Win32 static control after it has been created appeared first on The Old New Thing.

Gunnar Wolf: Don't tell anybody... but we have apparently gone DARK! [Planet Debian]

Your friendly keyring-maint Debian team received one of the weirdest spam messages ever…

Weird spam from Obscura

So, do we want to py to who-knows-whom for promoting the keyring-maint services in a verrrrrry-dark web search site?

First time I have to throw this stinky onion at you…

Spam!

02:07

Keg's Run Dry [QC RSS v2]

Emotional Invulnerability Night is even wilder

Thursday, 05 November

23:35

22:56

GNU Hyperbole 9.3.2 [Planet GNU]

GNU Hyperbole 9.3.2 was released on the 27 October 2026.

Hyperbole is a broad information management framework that augments your favorite Emacs libraries like Org and Consult.  It can accelerate the things you do everyday with Emacs, just give it a chance.  It installs in about 60 seconds.  Learn about it from:

Hyperbole version 9.3.2 is another jump in capability with Org visibility cycling added to the Koutliner and the ability to use the double brackets of Org link format around Hyperbole implicit buttons in Org mode.

Below are major updates since release 9.1.0:

The Koutliner - legal-style outliner with permalinks and hidden properties

See www.gnu.org/s/hyp ... le.html#Koutliner

Org-style Visibility Cycling

New, extensive key compatibility with Org-mode; major Org keys work similarly.  {TAB} and {S-TAB} (previously {M-TAB}) keys cycle trees and entire outline visibility anywhere in a cell, by default. Use {C-c [} to toggle these keys between cycling and tree demotion/promotion, as desired.  Bindings of {C-c C->} or {M-right} and {C-c C-<} or {M-left} for tree demotion/promotion always work regardless of the tab mode.

The Koutliner has the same kind of extensive user-customizations of tab behavior as Org mode.

See www.gnu.org/s/hyp ... and-Shift_002dTAB for details on how these keys work and can be customized.

Inline Image Display

{C-c C-x C-v} toggles the inline display of image files in Koutlines, just like Org mode.

Free Up User-customizable {C-c <letter>} Keys

Previously, the Koutliner bound a number of these keys for convenience.  Now they are all replaced with {C-c ; <letter>} so global user set {C-c <letter>} keys are available.  If you don't use such global keys, {M-1 C-c C-l} will enable the original Koutliner {C-c <letter>} key bindings while leaving the {C-c ; <letter>} keys in place as well.

kotl-mode:action-key-default-function

This new setting holds a function run by the Action Key in Koutline mode (kotl-mode) when no other context matches.  The default setting does nothing within cells, whereas previously, it would toggle between showing and hiding the tree (this is now done with {TAB}).  Set this to kotl-mode:show-or-hide-tree to restore the old Koutliner behavior.

kotl-mode:assist-key-default-function

This similar setting is for the Assist Key in Koutline mode when no other context matches.  The default setting does nothing within cells whereas previously it would run smart-scroll-down to scroll down a screenful.  Set the variable to that command if you prefer the prior behavior.

Improve copy-tree Mnemonics

  • {C-c ; b} kotl-mode:toggle-blank-lines has moved to {C-c ]}.
  • {C-c C-c} kotl-mode:copy-before has moved to {C-c ; b} to match with {C-c ; c} kotl-mode:copy-after binding.

Hyperbole Org Mode Support See

www.gnu.org/s/hyp ... ey-_002d-Org-Mode

Hyperbole Buttons as Org Links

Hyperbole buttons wrapped in double square bracket org link delimiters when in Org mode will activate properly with the addition of a single line to your Hyperbole use-package configuration:

    (push #'hyperbole-activate-button org-open-link-functions)

Then you get all the Hyperbole button capabilities with the highlighting and the activation of Org links via {C-c C-o}.  Of course, the Action Key will activate these buttons as well.

Since Emacs Lisp sybmols are Hyperbole buttons, you can make links to both function and variable definitons just by wrapping their names in Org delimiters.  For example, [[find-file]] or [[hsys-org-enable-smart-keys]].

Org Heading Smart Key Settings

Two new settings to control Action and Assist Key behavior when within an Org mode heading when hsys-org-enable-smart-keys is set to t (defaults are no-ops):

  • smart-org-action-key-heading-function and
  • smart-org-assist-key-heading-function.

The new smart-org-cycle command is one option for such a setting.

HyWiki - the no markup, personal Wiki note taker

See www.gnu.org/s/hyp ... rbole.html#HyWiki.

HyWikiWord#Headline Links to Indented Headlines

HyWikiWord#Headline links now work in Wiki pages that use indentation before the * delimiters of headlines.

Disable Action Key HyWikiWord Creation

You can now customize which modes prevent HyWikiWord creation with the Action Key {M-RET} Add any text or programming major modes to hywiki-word-create-exclude-action-key-modes to disable this feature in these modes.  You can bypass this setting by creating a HyWikiWord via the keyboard menus with {C-h h h c}.

Orderless Matching in Searches

When using the orderless package in searches, multiple space-separated words are matched in any order they occur, regardless of the order given to the search.

HyRolo - the fast, hierarchical record retriever

See www.gnu.org/s/hyp ... rbole.html#HyRolo.

Yank Entire Record Trees

By default, {C-h h r y} hyrolo-yank yanks at point the entry matched without any of its sub-entries.  Use {C-u C-h h r y} to yank in the entire tree.

Orderless Matching in Searches

When using the orderless package in searches, multiple space-separated words are matched in any order they occur, regardless of the order given to the search.

Documentation

"FAST-DEMO"

{C-h h d d} now includes links to articles about Hyperbole, including two new articles and videos:

Installation

See www.gnu.org/s/hyp ... bole.html#Install.

New Install Documentation

Installation sections in the Hyperbole Manual and README.md have been extensively rewritten.  Installation now utilizes use-package with a fully documented reference man/use-package configuration file you can easily customize.  The file, "INSTALL", has been deleted.

Key Use-Package Settings

Some key configuration settings in the "man/use-package" file:

  • iimage-mode setting that permanently enables inline image display in Koutline buffers.
  • hyrolo-file-list setting that shows all of the note taking systems that can be quickly full-text searched with HyRolo with no indexing.
  • The new hywiki-word-create-exclude-action-key-modes list lets you exclude certain major-modes from having the Action Key create new HyWiki words when pressed on any capitalized word.
  • A one line setting of org-open-link-functions enables highlighting Hyperbole buttons as Org links when wrapped in double square brackets.  Now you can make all your Hyperbole buttons operate like Org links if desired.

Further Details

See HY-NEWS for detailed changes in the Version 9 Hyperbole series.

GNU Hyperbole 9.3.1 [Planet GNU]

GNU Hyperbole 9.3.1 was released on the 22 October 2026.

Se announcement for GNU Hyperbole version 9.3.2 for a summary with major updates since release 9.1.0.

GNU Hyperbole 9.3.0 [Planet GNU]

GNU Hyperbole 9.3.0 was released on the 14 October 2026.

Se announcement for GNU Hyperbole version 9.3.2 for a summary with major updates since release 9.1.0.

22:00

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

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

[ Chris Lamb ]
* Mark that the test_nupkg_compressed_files test requires the tlsh Python
* module. (Closes: #1151752)

You find out more by visiting the project homepage.

21:28

GNU Hyperbole 9.2.0 (Koutliner Org-style visibility cycling release) [Planet GNU]

We have added Org-style visibility cycling as an option to the Hyperbole Koutliner and have updated Hyperbole to version 9.2.0 (30 september 2026) to track this significant change.

Once you have it installed, remove your ~/EXAMPLE.kotl file if any.  Then use {C-h h k e} to get the new EXAMPLE.kotl copy to play with.  Use {C-TAB} in a Koutline to toggle between Org-like visibility cycling and Koutline's default demote/promote behavior.

Then {TAB} will cycle the view of the tree at point and {C-u TAB} will cycle the whole outline. Most of the complex behavior from the 'org-cycle' function is replicated.

See the new manual section, (hyperbole)Inserting Literal Tabs, for how to configure the Koutliner for tab insertion in different contexts.

GNU Hyperbole Interim release 9.1.0 [Planet GNU]

This was an interim release (28 June 2026) to sync with the new package versioning techniques used by ELPA and MELPA. This turned what was the development version 9.0.2pre planned to be a 9.0.2 release into release 9.1.0 to resolve the numbering discrepancy.

From this release the following snapshot or devel versions are numbered RELEASE.0.DATE.COUNT.

View From a Hotel Window 11/5/26: Chicago, IL [Whatever]

I’m back in my old haunt of Hyde Park for tonight’s event at the Seminary Co-Op at 7pm. I may walk around and enjoy the campus. It, uhhhh, has changed since I first arrived here almost 40 years ago now.

Tomorrow! I am in Ferndale, Michigan, for an event sponsored by Sidetrack Bookshop. Here is the ticketing information. If you’re in the Detroit metro area, come see me!

— JS

21:00

The New Knowledge Artifacts of the AI Economy [Radar]

At our recent Foo Camp, a number of people said something like, “I don’t want someone else’s code any more. I may have my agent take a look at it, but I want to extract just the parts that I want, and may rewrite even those in Rust. It’s just too easy to create just the code that I want.”

This topic was hot enough that Jesse Vincent held an entire session about it. I did not attend, but Jesse gave me a report from his Plaude AI notetaker. Here’s a relevant section of the summary:

Several participants argue that software development’s primary artifact may be shifting from executable code toward natural-language prompts, generation processes, and developer skills. One speaker compares Python to assembly language, suggesting that writing conventional code may become optional as natural-language generation takes precedence. Another argues that open source can survive such a transition because its core values—peer production, capacity building, and shared specifications—do not depend on who or what writes the code.

At the same time, Jesse warns that maintainers are overwhelmed by floods of uninvited, automated, and often low-quality contributions. Participants say that traditional milestones such as pull requests, repositories, and conferences have helped contributors connect and gain recognition; as AI makes code replication easier, communities may need new ways to acknowledge participation and create paths for future developers. Some community interaction has moved to spaces such as Discord and direct messages, but structured opportunities are still needed.

Scientific computing raises particular concerns. One panelist warns that AI-generated forks and agent attacks could threaten carefully verified foundations such as NumPy and SciPy. Scientific systems depend on battle-tested libraries and reproducibility, so thousands of unreviewed alternatives could undermine reliability. Participants suggest bridging traditional open-source communities and modern AI development, which currently may use different tools and artifacts.

Other proposals include treating code as “liquid” and focusing open-source governance on durable infrastructure and specifications; maintaining agent storage independently of ephemeral container lifecycles; and using corporate compliance and safety-monitoring architectures to aggregate organizational traces.

These are important observations, all pointing in the same direction: AI is transforming the mechanisms and the artifacts of software development. For an increasing number of use cases, the software source code itself may no longer be the most important shareable knowledge artifact. This isn’t a new phenomenon. Every major change in technology calls for new mechanisms, new artifacts, and new institutions.

Originally, software developers mostly distributed binaries, then open source developers made sharing source code the norm. Now we need to distribute and share something else: context and patterns for generating code on the fly. Knowledge is being unbundled and can be shared in new forms. A repo may now serve merely as a source of context for solving the exact problem I have, rather than the bundle of problems that the original developer(s) encoded into their library or packaged solution. Some people will keep their context and patterns private, either because they see proprietary advantage in keeping them to themselves or because they are too busy or too lazy to share. But part of the problem is that we haven’t yet figured out what needs to be shared!

The challenge for the software development community is to identify the new knowledge artifacts of the AI economy, and to build new mechanisms and incentives for sharing them.

We’ve all had the experience of seeing a bespoke agentically generated app, wanting something similar, and wishing we could ask for a starting point so we didn’t have to vibe code an equivalent from scratch, with all the attention, false starts, and token costs that comes with that. Even in a world where software is generated by agents, it’s still not costless, and most of us like a good place to start.

Of course, this won’t be all software. There are lots of areas where “sort of alike” software is a recipe for disaster. Imagine a sales and marketing group where everyone had their own vibe-coded CRM tools, with different metrics and capabilities. This is not good. So there is still a place for big SaaS applications, distributed binary software, and distributed source code. You pick the hat to fit the head. But there’s also a need for something new.

The purpose of this article is to start a conversation about exactly what it is that developers should be preserving, sharing, and building on from others, and what mechanisms are still missing to make that virtuous circle work more effectively. I can’t see into the future; I can only speculate. So, as is often the case, I take a historical view. The poet W. S. Merwin wrote, “We are the echo of the future.” I have found that using history to frame the present can be a productive way to get our minds going in the right direction.

Note that while this article focuses on software development, the questions I’m asking here apply to virtually every field. Let me know if you have insights from your work in any area touched by AI.

From code to context

The ease with which LLMs can generate code is paradoxically getting people to focus too much on how easy it is not to produce code. That may be blinding us to the fact that code itself is being displaced as a valuable, tradeable, shareable knowledge artifact. Maybe “displaced” is too strong a word. Different species of value overlap for a long time. Eventually, though, old ones fade and new ones become dominant. This has happened before. Every technology revolution draws not only on new mechanisms but also creates new valuable knowledge artifacts. I talked about this in my recent short keynote at AGNTCon + MCPCon.

The open source revolution depended in part on mechanisms like modular design and source code control, even more than it depended on free software licenses. It birthed new coordinating institutions like GitHub. But it also created a valuable new class of knowledge artifact in the form of the source code repo, and subsidiary valuable artifacts like commit history and reputation. A developer’s public repos became a kind of résumé, and a project’s commit log became a record of who had done what, and how well. This replaced a previous world where binaries were the tradeable objects of the software economy. Microsoft’s fortune was built on selling licenses to binaries, and to anyone who measured the software economy in licenses sold, free software looked like value being destroyed. (Steve Ballmer called GPL’d free software “a cancer” and Microsoft VP Jim Allchin called it “an intellectual property destroyer.”)

There were two ways that I like to think about the effects of open source software. First, value that was based on scarcity was replaced by value that was created by abundance. Back in 1975, Steve Baer described this as “the clothesline paradox,” explaining that when you put your clothes in the dryer, the energy you use is measured and counted, but when you hang your clothes on the line, it is ignored by accounting, despite doing the same job. Open source software was like sunshine, free for the taking, and its value unmeasured. Everyone compared the revenue of free software companies like Red Hat and MySQL to the vastly larger revenues of proprietary software companies like Microsoft and Oracle, noted the fact that they hadn’t even survived as independent companies, and concluded that open source was a less effective business model because its creators captured less of the value. They missed the point that far more value had been created than had been captured. Open source went on to power most of the internet economy, with the value captured by other means than selling the software itself.

Some people might think of this as a kind of failure, but they would be wrong. It is the system working exactly as its creators intended. I remember talking with Bob Scheifler, one of the creators of the X Window System, about whether it was OK that we were building commercial versions of their documentation. He told me that was exactly what he had intended. They put things out with a very permissive license precisely because they wanted others to build on top of them. I remember him saying “We want to raise the floor.” The creators of Berkeley Unix, Apache, and others felt exactly the same way. They didn’t want to win the existing game. They wanted to play a different game.

And they succeeded, big time. As Clayton Christensen noted in 2004, when one thing becomes a commodity, modular and fungible, something else (usually something adjacent) becomes valuable. He called this “The Law of Conservation of Attractive Profits.” At about the same time, I had stumbled onto this principle in explaining the implications of open source software in giving rise to the new paradigm that I was shortly to start calling Web 2.0. Clay and I first bonded when we gave our respective keynotes about essentially the same thing at the 2004 Open Source Business Conference. I later wrote about the conjunction of our respective ideas in a piece called “The Open Source Paradigm Shift.”

New artifacts are often the first visible sign of this value transition. You can see this at work in the evolution of the web. The web was born from the new mechanism of internet-enabled hypertext via HTTP, HTML, and the modular, replaceable software (the web browser and the web server) that made it useful.

At first, the new valuable knowledge artifact was the website with its domain name, associated URLs, and HTML-formatted web pages. DNS was the coordinating institution. People paid fortunes for domain names on the premise that the site was the thing that mattered. And it did matter, and still does. But less than it used to. Over time, Google became the new coordinating institution, and its ability to point deep within websites made the web page, not just the site itself, a valuable knowledge artifact. Social media made “posts” and short-form video into other knowledge artifacts. New kinds of value creation and value capture tumbled out of that unbundling. Packaged software was displaced as the key monetizable artifact and replaced by web applications, which were information- and software-based frontends to vast backend databases.

The click became a new and incredibly valuable knowledge artifact, the unit in which attention and intent were measured, and then priced. First pay per click advertising (Google), then engagement maxing (social media) became the basis of vast fortunes. The people who notice the new artifacts early, while everyone else is still focused on the old ones, then invent new business models based on them, often play a bigger game than those who were still trying to play by the new rules.

When I summed up these ideas in “What Is Web 2.0” in 2005, I talked about the key principles being “harnessing collective intelligence,” “software above the level of a single device,” and “data as the next Intel Inside.” (That is, the next valuable source of lock-in.) The companies that survived the dot-com bust were the ones that understood that the data their users generated through their activity on the internet was the asset that mattered, not just the software that served it. That was an argument about a new knowledge artifact, though I didn’t use those words at the time. PageRank understood that a link was a vote, and a new mechanism to improve organic search birthed new dimensions of the internet economy. Links were bought, sold, and gamed accordingly. SEO (both “white hat” and “black hat”) and search quality became a battlefield.

All those disciplines have had to change now that content has been absorbed into AI models. Books, music, video, web content, sites like Wikipedia, GitHub, and Stack Overflow were all grist for the mill. In the open source era, a voted-on answer to a well-posed question on Stack Overflow was a valuable artifact, and the reputation that came with writing good ones was a subsidiary artifact, just as it was on GitHub. The number of new questions asked on Stack Overflow peaked at roughly 200,000 a month around 2014 and was already sliding before ChatGPT, but the decline accelerated sharply after November 2022. The knowledge in those answers didn’t go away. It was absorbed into the models, which now give their own answers synthesized from all that they have consumed. In that way, they have also consumed much of the traffic that would have gone to the original knowledge creators. New mechanisms to create a circulatory economy of value creation need to be developed.

Software development also changed radically because of the internet. Another of my web 2.0 principles was what I called “the perpetual beta.” It’s easy to forget that in the PC era, software had major releases only every couple of years, with the new version distributed on CDs (and long before that, on 9-track magnetic tape.) I remember talking with Mark Lucovsky, who’d been a developer on Windows NT at Microsoft, shortly after he arrived at Google in 2005. He was exulting at the experience of being able to push a single change live worldwide soon after it had been tested. Eventually, we saw the formalization of new mechanisms like test-driven development (TDD) and continuous integration and continuous delivery/deployment (CI/CD), which we now take for granted, as if they’d always been the norm.

The story isn’t over yet, though. The old knowledge artifacts don’t go away all at once, and they don’t go down without fighting. The new artifacts are only half-formed, and have weaknesses that can be exploited. We’re in the middle of that fight right now. But I suspect the winners will be those who first understand what the sources of deep value will be five years from now.

When code is cheap, what becomes valuable?

When code is cheap to generate, the valuable thing may be the prompts, context, and other artifacts that tell the model what code to generate and how to do it well. I’ve started using the generic term “context bundles” to describe the artifacts that you hand the model to do its work.

In the opening to this piece, I talked about software patterns extracted from code as one kind of new shareable knowledge artifact. But these are only one of many kinds of “context bundles” that are starting to be shared. Spec-driven programming is all about developing context bundles. The spec becomes the thing that is reviewed, versioned, and kept, and the code is regenerated from it as needed. (A lot of people are worried that this might become a return to waterfall development. And it could, if done badly. But done well, with rapid turns? Maybe just right.)

An Agent Skill is another kind of context bundle, a folder of instructions, scripts, and reference material that an agent loads only when a task calls for it. Anthropic released the format as an open standard, and it has been adopted by a growing number of other agent products. An MCP server is yet another mechanism for presenting context that will shape the work of an LLM.

But that’s not all. The agent trace, the record of what an agent tried, which tools it called, and which context it drew on, is the closest thing we have to commit history for work that doesn’t get formalized as code. The log of which context bundles were invoked, and by whom, could also be the raw material for attribution and payment, much as the click was the raw material for advertising. And the stream of what people ask their agents to do may become to this era what the click was to the last, the signal of intent around which the coordinating institutions of the AI economy get built. I’ve often wondered what the agentic equivalent to PageRank will be. Will agents leave “pheromone trails” that grow stronger or fade over time, in the way that links do?

Even a well-formed question or conjecture could be a kind of context bundle. Math and science already value and exchange these, and I’ve started to think that there is an opportunity for building infrastructure for sharing and crediting them. After all, arXiv.org has already pushed the boundary for credit further upstream by publishing preprints rather than just reviewed papers. Why not go all the way to giving priority credit for well-formed conjectures?

The eval, a set of test cases that encodes what good work looks like for a particular task, may also turn out to be one of the most valuable things a domain expert can create, withhold, or share. But there’s a serpent in the Garden of Eden. At Foo Camp, Nick Vincent observed to me that there’s a real risk to evals as a context object, because there is a race going on to acquire massive amounts of data (say on corporate workflows) and sell it to the labs to train on it. But an eval only works if the model being judged hasn’t already seen the answers. Once the test cases leak into the training data, the eval measures what the model memorized rather than what it can do. How do we protect the holdout set for evals? That may be a critical mechanism that is still needed, and one that the people who build evals, and the companies whose workflows they describe, have every reason to develop. IMO, it would be good if there were more transparency into this process, and perhaps even supervision by a neutral body.

How do we come to trust new artifacts?

Part of the work of every revolution is building the mechanisms that help market participants to trust its new artifacts. In his book Nature’s Metropolis, William Cronon tells how Chicago became the center of the world’s grain trade in the 1850s. The mechanisms that enabled this were the railroad, the steam-powered grain elevator, and the telegraph. The coordinating institution became the Chicago Board of Trade. In 1856 the board adopted uniform grading standards. Before that, a farmer loaded his grain into individual sacks, and every buyer along the way had to inspect each lot or trust the seller. Afterward, a load of wheat was inspected by a middleman, dumped into a bin with other grain of the same grade, and its owner was handed a receipt for, say, a thousand bushels of No. 2 spring wheat. The grading standards became a new mechanism enabling trust and the grade receipt the new knowledge artifact certifying it. Together they separated the ownership of grain from the grain itself. Once merchants started trading receipts for grain, it didn’t take long before they were trading promises of grain not yet delivered, and the futures market was born. (That raises an intriguing question: What will be the derivatives of the AI era?)

Cronon’s history also observes that the receipts were only as good as the warehousemen who issued them. Some of them issued receipts backed by no grain at all, or spread rumors that stored grain was spoiling so they could buy receipts cheaply. It took years of fights inside the Board of Trade, and finally state regulation that the Supreme Court upheld in Munn v. Illinois, to make the receipts trustworthy. New knowledge artifacts invite counterfeits.

Even when there’s no fraud involved, there are often missteps in the early days of a new technology. Consider the rise of spreadsheet models that could be filled in with the user’s own data. A model was a set of assumptions and formulas that let anyone ask “what if?” and get an answer in seconds. Magic at the time! And eventually completely taken for granted. The model became an artifact that could be passed around, and used to make business decisions at companies other than the one that had created it. In 1984, a few years into the spreadsheet revolution, Steven Levy wrote “A Spreadsheet Way of Knowledge” about what VisiCalc and Lotus 1-2-3 were doing to American business. Levy warned that a spreadsheet model is only as good as its assumptions. Back then, people taking a poorly-executed spreadsheet model as gospel was the equivalent of some of today’s AI usage fails.

Feeling our way into the future

When people stop valuing the thing they used to value, ask what they are coming to value instead. Being alert to valuable new knowledge artifacts is a superpower. The new artifacts tend to show up well before the institutions that organize them, and long before anyone has worked out how to measure them. GitHub was founded more than a decade after open source software became mainstream, and Google didn’t become dominant till more than a decade after the first websites. My bet is that we are at a similar moment with context, with the artifacts starting to appear and the institutions that will coordinate them still unbuilt.

There is a lot of work that I’m following eagerly, looking to see where, whether, and how it gains traction.

  • Duncan Davidson is doing fascinating work on what it would mean to have a home for personal context. I can’t wait till he makes more of this work public and reusable. Relatedly, the open memory protocol initiative is an attempt to define a useful set of mechanisms for exchanging context.
  • Sam Schillace has started building a repository of what he calls agent-building patterns. One of those patterns, “Anchor on Canonical Names,” echoes the idea that I wrote about last year in “Magic Words,” and that we are also exploring with the O’Reilly Expert Intelligence MCP. As Sam puts it, canonical names are a way of referencing “a whole coherent methodology the model already learned in training, far more reliably than a paragraph paraphrasing the same idea.”
  • There are numerous attempts to reinvent GitHub for the agentic era, including Cursor Origin and Entire, founded by former GitHub CEO Thomas Dohmke. Entire describes itself as “new distributed Git forge that stores your intent alongside your code, built for the scale and throughput of agentic coding.” Instead of traditional pull requests, it uses Trails, an agent-driven review system that logs session traces and automated evaluations so developers can merge code without reading every single line of a diff. Origin is an agent-first Git hosting and collaboration platform designed around structured semantic diffs, machine-readable merge states, and automated agent routing. As commercial products, both of these are examples of existing software distribution mechanisms and artifacts.
  • Perhaps most interestingly for the point I’m exploring in this piece, Anthropic is building a proprietary, internal-only replacement for Git itself for its own use. The company published a very detailed description of the system, which it calls Scion. It might even be detailed enough for someone with a big team and a ton of compute to reproduce, using the description as a starting point. But you can see at the scale of what they have built the limits of the “distribute context and specs and rebuild on the fly” model.
  • But there are also attempts to build systems that enable developers to share lightweight pieces in a new architecture of participation. Common Fabric is building an entire system premised on disposable agent-generated software expressing repeatable patterns, using data that is associated with users rather than with applications and that carries with it its own rules for how it can be used. In my conversation with cofounder and CEO Alex Komoroske, he described these patterns as small pieces of code that can be fetched from anywhere on the internet or written by an LLM on the fly. Agents will mostly write them, not human developers. But they will mostly write them on users’ behalf, and once someone’s agent has built a pattern, anyone else can use it. Their solution may not be the winning one, but it is definitely a bold leap into what may be a very different future for software.

Don’t get trapped in the past of software development. Root yourself in its history, the soil from which it grows, and imagine its future. What will we want to share, what will we want to reuse, and what mechanisms are needed for us to do so effectively?

19:42

The Big Idea: Daryl Gregory [Whatever]

Being the middle child isn’t easy, but the bonds you form with your siblings can be some of the closest and most impactful relationships in your life. Author Daryl Gregory shares memories of his sisters from his childhood, and talks about how their bond played a roll in creating his newest novel, The Porcelain Sisters.

DARYL GREGORY:

Is there something wrong with me that I find two sisters fighting with each other to be hugely entertaining? I was the middle child, the boy sandwiched between two girls—one who was seven years older than me, and the other sixteen months younger. We grew up in a small ranch house in the suburbs of Chicago, and we fought what I assumed was a normal amount.

Ninety percent of the time, it was me versus one of them. With my older sister, this was often when she ordered me to do something, and my go-to response was to slam a door and shout, “You’re not the boss of me!” (She was absolutely the boss of me.) 

My younger sister and I were closer in age and so spent more time together, which meant more opportunities to torture each other. I liked to hide in her room and jump-scare her. She’s the finest screamer in the family, and terrifying her is extremely satisfying. She knew how to hit back, though. One time she kidnapped my prized possession, a G.I. Joe with lifelike hair and Kung Fu grip, and he reappeared days later with a bald spot, as if his forced marriage to Barbie had driven him into middle age. I still have him—and the damage is outrageous. 

So it was a delight—a delight, I tell you—when my sisters fought with each other, and I got sit on the sidelines munching my proverbial popcorn. 

But here’s the thing I found amazing—their fights were so short. They’d pivot from shouting at each other to calmly hanging out in their shared bedroom. They didn’t hold grudges. (I, however, was a champion pouter.) Even now, if they have an argument, they repair the damage quickly. I love my sisters, and they’ve assured me that they love me back, but they have a bond with each other that I find mysterious and enviable. 

So perhaps it’s not a surprise that sisters turn up a lot in my books. Ruth and Isabel, the two main characters in my new novella, The Porcelain Sisters, are not exactly like my siblings—for one thing, neither of mine is a haunted doll—but let’s just say there are… similarities. 

Ruth (the flesh-and-blood sister) and Isabel (the porcelain one) first appeared as teenagers in my YA Lovecraftian horror novel, Harrison Squared. They were my favorite characters to write dialog for, because they operated almost like a vaudeville ventriloquist act—Ruth was shy and soft-spoken, while Isabel spoke the truth and cut everyone down to size. 

But in that book I never explained why Isabel could talk, or how they were sisters, or where Isabel came from. That was for a good reason: I didn’t know. I wrote this book to find out—and to get the chance to hang out with them some more. 

Ruth, now in her twenties, is trying to make rent while taking college classes, but feeling adrift. She seems to have some latent magical ability, but doesn’t know what her purpose in life is beyond taking care of her sister. She’s never even had a long-term romantic relationship because Isabel deliberately freaks out anybody she brings home. 

Isabel’s anger issues stem, of course, from being trapped in a porcelain body. She can’t grow up and may never live on her own. When her body’s accidentally damaged during a fight with Ruth—a seaside cliff is involved—a mundane toy repair shop won’t cut it. They have to go on the road to find the Dollmaker, the French witch who made her. 

As I wrote that last sentence I realized the sisters are literally repairing each other. I wish I’d thought of that in time to put it on the back cover copy. 

The girls head to Marseille, where they face off with an unkillable assassin with the resilience of a ragdoll, a pair of demons (one a chain-smoking crow, the other a black cat) and their human familiars, as well as a small army of haunted dolls. Oh, and the Dollmaker turns out to be the head of Le Clan des Sorciéres, a kind of witch mafia. I know, it’s a lot. 

At the root of the mystery is why their mother, an enforcer for Le Clan called Godless Annie, abandoned them. What the sisters discover about themselves suggests there may be a way for them to live apart—but do they want to?

Another thing occurred to me as I’m typing this: is that ending about my current relationship with my sisters? Since our mom passed we don’t see each other like we used to. We live on opposite sides of the country, and our lives are busy. Did I write this book because I miss them?

I suppose I could talk to a therapist about this. Or write another book about sisters. Or—and hear me out—I could go on the road with the Gregory girls, solving mysteries and fighting the occasional demon.


The Porcelain Sisters: Amazon|Barnes & Noble|Bookshop|Powell’s

Author socials: Website|Bluesky|Instagram

16:35

Inconvenient brands [Seth's Blog]

For an upcoming blog post, I’m collecting a list of small businesses that are worth bypassing Amazon for. Holiday shopping is around the corner, and sometimes people want to put in the effort to buy something that takes more than a click.

Folks like Burlap and Barrel, Gramercy Tools or Askinosie Chocolate–direct trade small businesses.

Applications are now closed, I’m busy editing. THANKS.

[PS! the secret recipes have been updated.]

The Ubuntu 26.04 Rust sudo is not compatible with standard sudo [OSnews]

Ubuntu has been at the forefront of replacing the traditional versions of basic tools like sudo with replacements written in Rust, but aside from worries about replacing battle-tested code with brand new, relatively untested code, there’s new things to worry about it. As it turns out, sudo-rs, the Rust replacement for sudo, is intentionally incompatible with the classic version in dangerous ways, as Chris Siebenmann discovered to his dismay.

Basically, the classic sudo supports the use of wildcards defined using square brackets, so that if you allow a user to run, say, /usr/sbin/exim -bp[acru], without a password, they can run exim -bpa, exim -bpc, exim -bpr, or exim -bpu without having to supply a password. This allows for very specific, fine-grained access control, which is quite a nice capability to have if you’re managing many systems and users. Sadly, sudo-rs intentionally does not support this, opting to only allow you to use the generic * wildcard. Worse yet, it doesn’t really make this clear, either.

↫ Chris Siebenmann

I do not really have words for this. The Rust sudo has apparently opted to keep the single most dangerous wildcard while disallowing all of the wildcards that allow one to be narrow and specific about what you’re allowing, and it buries this at the end of a section that devotes a bunch of words to describing functionality it doesn’t have and doesn’t support, with absolutely nothing else in that section to say this (either up front or in the descriptions of how all the wildcards would work if sudo-rs supported them, which it doesn’t).

If you’re going to replace such vital, core tools like sudo that god knows how many people rely on every single day, you better be damn sure you’re feature-complete and can act as a drop-in replacement. If someone switches from sudo to doas, nobody expects the experience to be identical. However, if you’re consistently being told that sudo-rs is a drop-in replacement and you shouldn’t expect any disruptions, you better be able to make true on that promise. Ubuntu isn’t some also-ran small hobby distribution, and its developers should act like it.

What a clown show.

LXQt 2.5.0 released [OSnews]

The second desktop environment release I’ve got for you today is LXQt 2.5.0. This new version excises its last LXDE dependency, and QTerminal and QTermWidget received considerable improvements, like new background image modes, a visual bell, support for OSC-8 hyperlinks, and more. There’s a ton of smaller changes and improvements as well, but do note that due to a bug, 2.5.0 broke LXQt’s Monitor Settings on X11. The project intends to fix this as quickly as possible and push a point release to address this issue.

Cinnamon 6.8 desktop environment released with hibernation support [OSnews]

It’s desktop environment Thursday, as I’ve got two new releases for you today. First, Cinnamon, the desktop environment primarily associated with Linux Mint, has hit version 6.8. This version will officially ship with Linux Mint 27, scheduled for around Christmas of this year.

Highlights of Cinnamon 6.8 include hibernation support via a Suspend action in the main menu, modern one-to-one trackpad gestures for both Wayland and Xorg sessions, support for the oo7 Secret Service provider, support for multiple instances in the Sound applet, and a more unified Network applet that merges the WireGuard and VPN sections.

↫ Marcus Nestor at 9To5Linux

While Cinnamon is first and foremost a Linux Mint project, it’s available on countless other distributions as well, including dedicated variants for popular distributions like Fedora and Ubuntu. Its Wayland support is finally materialising too, which is long overdue.

16:21

Link [Scripting News]

One thing to know about Claude -- it will never welcome you when you start a session with the news that it had a gestalt and now has figured out how to do something that will blow your mind. That doesn't mean it won't see a different and better way to do something if you ask it to have another look. It solved a deal-stopper problem in Frontier, after we thought there was no solution. So it does seem to be creative, but not in a mind bomb sort of way?

14:49

Link [Scripting News]

When working with Claude I learn more about the way my mind works. I am building a demo for a new product and see some quirky behavior. Should I pause and tell Claude, or just keep going and assume I'll see it again and can report it then. If I switch over to Claude and report it, pretty good chance it will write me a multipart document that i have to at least skim to see if there was anything in there I needed to know. The real answer I was looking for, "yes i can fix that, say go if you want me to do it now." Boom. That's how I want my machine to work. I explain to it that it must be more concise. This might be the real frustration of all writers in every medium. You can't write down your thought process, it has to be in your brain before you can write it. To an outside observer you look interruptible. And Claude doesn't even understand the concept of being interrupted and losing your train of thought. No doubt it could define it, but it doesn't get it. Kind of like the great speech Robin Williams gives to young Matt Damon, the genius kid who knows everything, but has no idea what living is really like.

Link [Scripting News]

I still can't believe we had a normal election in the US. All the effort the Repubs went to, to build and train a secret police, and they didn't use them?

14:42

[$] User namespaces + file capabilities = trouble [LWN.net]

User namespaces are a key part of the kernel's toolkit for assembling containers; processes within a user namespace can appear to have full root access to the system while gaining no extra privileges in the wider system. At least, that is the intent. In practice, keeping privilege contained within a user namespace has often turned out to be difficult. As an example, consider this small patch series from Josef Bacik, which is intended to address some situations where a process within a user namespace can elevate the privileges of processes outside of it.

Feeds

FeedRSSLast fetchedNext fetched after
@ASmartBear XML 15:28, Monday, 09 November 16:09, Monday, 09 November
a bag of four grapes XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Ansible XML 15:21, Monday, 09 November 16:01, Monday, 09 November
Bad Science XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Black Doggerel XML 15:28, Monday, 09 November 16:09, Monday, 09 November
Blog - Official site of Stephen Fry XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Charlie Brooker | The Guardian XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Charlie's Diary XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Chasing the Sunset - Comics Only XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Coding Horror XML 15:49, Monday, 09 November 16:36, Monday, 09 November
Comics Archive - Spinnyverse XML 15:28, Monday, 09 November 16:12, Monday, 09 November
Cory Doctorow's craphound.com XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Cory Doctorow, Author at Boing Boing XML 15:28, Monday, 09 November 16:09, Monday, 09 November
Ctrl+Alt+Del Comic XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Cyberunions XML 15:42, Monday, 09 November 16:31, Monday, 09 November
David Mitchell | The Guardian XML 15:28, Monday, 09 November 16:11, Monday, 09 November
Deeplinks XML 15:28, Monday, 09 November 16:12, Monday, 09 November
Diesel Sweeties webcomic by rstevens XML 15:28, Monday, 09 November 16:11, Monday, 09 November
Dilbert XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Dork Tower XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Economics from the Top Down XML 15:28, Monday, 09 November 16:11, Monday, 09 November
Edmund Finney's Quest to Find the Meaning of Life XML 15:28, Monday, 09 November 16:11, Monday, 09 November
EFF Action Center XML 15:28, Monday, 09 November 16:11, Monday, 09 November
Enspiral Tales - Medium XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Events XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Falkvinge on Liberty XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Flipside XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Flipside XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Free software jobs XML 15:21, Monday, 09 November 16:01, Monday, 09 November
Full Frontal Nerdity by Aaron Williams XML 15:49, Monday, 09 November 16:37, Monday, 09 November
General Protection Fault: Comic Updates XML 15:49, Monday, 09 November 16:37, Monday, 09 November
George Monbiot XML 15:28, Monday, 09 November 16:11, Monday, 09 November
Girl Genius XML 15:28, Monday, 09 November 16:11, Monday, 09 November
Groklaw XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Grrl Power XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Hackney Anarchist Group XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Hackney Solidarity Network XML 15:28, Monday, 09 November 16:13, Monday, 09 November
http://blog.llvm.org/feeds/posts/default XML 15:28, Monday, 09 November 16:13, Monday, 09 November
http://calendar.google.com/calendar/feeds/q7s5o02sj8hcam52hutbcofoo4%40group.calendar.google.com/public/basic XML 15:21, Monday, 09 November 16:01, Monday, 09 November
http://dynamic.boingboing.net/cgi-bin/mt/mt-cp.cgi?__mode=feed&_type=posts&blog_id=1&id=1 XML 15:28, Monday, 09 November 16:13, Monday, 09 November
http://eng.anarchoblogs.org/feed/atom/ XML 15:42, Monday, 09 November 16:28, Monday, 09 November
http://feed43.com/3874015735218037.xml XML 15:42, Monday, 09 November 16:28, Monday, 09 November
http://flatearthnews.net/flatearthnews.net/blogfeed XML 15:28, Monday, 09 November 16:09, Monday, 09 November
http://fulltextrssfeed.com/ XML 15:28, Monday, 09 November 16:11, Monday, 09 November
http://london.indymedia.org/articles.rss XML 15:49, Monday, 09 November 16:36, Monday, 09 November
http://pipes.yahoo.com/pipes/pipe.run?_id=ad0530218c055aa302f7e0e84d5d6515&amp;_render=rss XML 15:42, Monday, 09 November 16:28, Monday, 09 November
http://planet.gridpp.ac.uk/atom.xml XML 15:49, Monday, 09 November 16:36, Monday, 09 November
http://shirky.com/weblog/feed/atom/ XML 15:28, Monday, 09 November 16:12, Monday, 09 November
http://thecommune.co.uk/feed/ XML 15:28, Monday, 09 November 16:13, Monday, 09 November
http://theness.com/roguesgallery/feed/ XML 15:49, Monday, 09 November 16:37, Monday, 09 November
http://www.airshipentertainment.com/buck/buckcomic/buck.rss XML 15:42, Monday, 09 November 16:31, Monday, 09 November
http://www.airshipentertainment.com/growf/growfcomic/growf.rss XML 15:28, Monday, 09 November 16:12, Monday, 09 November
http://www.airshipentertainment.com/myth/mythcomic/myth.rss XML 15:28, Monday, 09 November 16:10, Monday, 09 November
http://www.godhatesastronauts.com/feed/ XML 15:49, Monday, 09 November 16:37, Monday, 09 November
http://www.tinycat.co.uk/feed/ XML 15:21, Monday, 09 November 16:01, Monday, 09 November
https://anarchism.pageabode.com/blogs/anarcho/feed/ XML 15:28, Monday, 09 November 16:12, Monday, 09 November
https://broodhollow.krisstraub.comfeed/ XML 15:28, Monday, 09 November 16:09, Monday, 09 November
https://debian-administration.org/atom.xml XML 15:28, Monday, 09 November 16:09, Monday, 09 November
https://elitetheatre.org/ XML 15:49, Monday, 09 November 16:36, Monday, 09 November
https://feeds.feedburner.com/Starslip XML 15:28, Monday, 09 November 16:10, Monday, 09 November
https://feeds2.feedburner.com/GeekEtiquette?format=xml XML 15:28, Monday, 09 November 16:11, Monday, 09 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:28, Monday, 09 November 16:12, Monday, 09 November
https://hackbloc.org/rss.xml XML 15:28, Monday, 09 November 16:09, Monday, 09 November
https://kajafoglio.livejournal.com/data/atom/ XML 15:42, Monday, 09 November 16:31, Monday, 09 November
https://philfoglio.livejournal.com/data/atom/ XML 15:49, Monday, 09 November 16:36, Monday, 09 November
https://pixietrixcomix.com/eerie-cutiescomic.rss XML 15:49, Monday, 09 November 16:36, Monday, 09 November
https://pixietrixcomix.com/menage-a-3/comic.rss XML 15:28, Monday, 09 November 16:12, Monday, 09 November
https://propertyistheft.wordpress.com/feed/ XML 15:21, Monday, 09 November 16:01, Monday, 09 November
https://requiem.seraph-inn.com/updates.rss XML 15:21, Monday, 09 November 16:01, Monday, 09 November
https://studiofoglio.livejournal.com/data/atom/ XML 15:42, Monday, 09 November 16:28, Monday, 09 November
https://thecommandline.net/feed/ XML 15:42, Monday, 09 November 16:28, Monday, 09 November
https://torrentfreak.com/subscriptions/ XML 15:28, Monday, 09 November 16:11, Monday, 09 November
https://web.randi.org/?format=feed&type=rss XML 15:28, Monday, 09 November 16:11, Monday, 09 November
https://www.baen.com/baenebooks XML 15:28, Monday, 09 November 16:12, Monday, 09 November
https://www.dcscience.net/feed/medium.co XML 15:42, Monday, 09 November 16:31, Monday, 09 November
https://www.DropCatch.com/domain/steampunkmagazine.com XML 15:28, Monday, 09 November 16:09, Monday, 09 November
https://www.DropCatch.com/domain/ubuntuweblogs.org XML 15:42, Monday, 09 November 16:28, Monday, 09 November
https://www.DropCatch.com/redirect/?domain=DyingAlone.net XML 15:49, Monday, 09 November 16:36, Monday, 09 November
https://www.freedompress.org.uk:443/news/feed/ XML 15:49, Monday, 09 November 16:37, Monday, 09 November
https://www.goblinscomic.com/category/comics/feed/ XML 15:21, Monday, 09 November 16:01, Monday, 09 November
https://www.loomio.com/blog/feed/ XML 15:42, Monday, 09 November 16:28, Monday, 09 November
https://www.newstatesman.com/feeds/blogs/laurie-penny.rss XML 15:28, Monday, 09 November 16:09, Monday, 09 November
https://www.patreon.com/graveyardgreg/posts/comic.rss XML 15:49, Monday, 09 November 16:36, Monday, 09 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:28, Monday, 09 November 16:11, Monday, 09 November
https://x.com/statuses/user_timeline/22724360.rss XML 15:21, Monday, 09 November 16:01, Monday, 09 November
Humble Bundle Blog XML 15:49, Monday, 09 November 16:36, Monday, 09 November
I, Cringely XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Irregular Webcomic! XML 15:28, Monday, 09 November 16:09, Monday, 09 November
Joel on Software XML 15:42, Monday, 09 November 16:28, Monday, 09 November
Judith Proctor's Journal XML 15:21, Monday, 09 November 16:01, Monday, 09 November
Krebs on Security XML 15:28, Monday, 09 November 16:09, Monday, 09 November
Lambda the Ultimate - Programming Languages Weblog XML 15:21, Monday, 09 November 16:01, Monday, 09 November
Looking For Group XML 15:28, Monday, 09 November 16:12, Monday, 09 November
LWN.net XML 15:28, Monday, 09 November 16:09, Monday, 09 November
Mimi and Eunice XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Neil Gaiman's Journal XML 15:21, Monday, 09 November 16:01, Monday, 09 November
Nina Paley XML 15:49, Monday, 09 November 16:36, Monday, 09 November
O Abnormal – Scifi/Fantasy Artist XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Oglaf! -- Comics. Often dirty. XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Oh Joy Sex Toy XML 15:28, Monday, 09 November 16:12, Monday, 09 November
Order of the Stick XML 15:28, Monday, 09 November 16:12, Monday, 09 November
Original Fiction Archives - Reactor XML 15:28, Monday, 09 November 16:10, Monday, 09 November
OSnews XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Paul Graham: Unofficial RSS Feed XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Penny Arcade XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Penny Red XML 15:28, Monday, 09 November 16:13, Monday, 09 November
PHD Comics XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Phil's blog XML 15:49, Monday, 09 November 16:37, Monday, 09 November
Planet Debian XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Planet GNU XML 15:28, Monday, 09 November 16:09, Monday, 09 November
Planet Lisp XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Pluralistic: Daily links from Cory Doctorow XML 15:21, Monday, 09 November 16:01, Monday, 09 November
PS238 by Aaron Williams XML 15:49, Monday, 09 November 16:37, Monday, 09 November
QC RSS v2 XML 15:49, Monday, 09 November 16:36, Monday, 09 November
Radar XML 15:28, Monday, 09 November 16:10, Monday, 09 November
RevK®'s ramblings XML 15:42, Monday, 09 November 16:28, Monday, 09 November
Richard Stallman's Political Notes XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Scenes From A Multiverse XML 15:49, Monday, 09 November 16:36, Monday, 09 November
Schneier on Security XML 15:21, Monday, 09 November 16:01, Monday, 09 November
SCHNEWS.ORG.UK XML 15:28, Monday, 09 November 16:12, Monday, 09 November
Scripting News XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Seth's Blog XML 15:42, Monday, 09 November 16:28, Monday, 09 November
Skin Horse XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Tales From the Riverbank XML 15:42, Monday, 09 November 16:31, Monday, 09 November
The Adventures of Dr. McNinja XML 15:28, Monday, 09 November 16:13, Monday, 09 November
The Bumpycat sat on the mat XML 15:21, Monday, 09 November 16:01, Monday, 09 November
The Daily WTF XML 15:42, Monday, 09 November 16:28, Monday, 09 November
The Monochrome Mob XML 15:28, Monday, 09 November 16:09, Monday, 09 November
The Non-Adventures of Wonderella XML 15:28, Monday, 09 November 16:11, Monday, 09 November
The Old New Thing XML 15:28, Monday, 09 November 16:12, Monday, 09 November
The Open Source Grid Engine Blog XML 15:49, Monday, 09 November 16:36, Monday, 09 November
The Stranger XML 15:28, Monday, 09 November 16:13, Monday, 09 November
towerhamletsalarm XML 15:42, Monday, 09 November 16:28, Monday, 09 November
Twokinds XML 15:28, Monday, 09 November 16:10, Monday, 09 November
UK Indymedia Features XML 15:28, Monday, 09 November 16:10, Monday, 09 November
Uploads from ne11y XML 15:42, Monday, 09 November 16:28, Monday, 09 November
Uploads from piasladic XML 15:28, Monday, 09 November 16:11, Monday, 09 November
Use Sword on Monster XML 15:49, Monday, 09 November 16:36, Monday, 09 November
Wayward Sons: Legends - Sci-Fi Full Page Webcomic - Updates Daily XML 15:42, Monday, 09 November 16:28, Monday, 09 November
what if? XML 15:28, Monday, 09 November 16:09, Monday, 09 November
Whatever XML 15:42, Monday, 09 November 16:31, Monday, 09 November
Whitechapel Anarchist Group XML 15:42, Monday, 09 November 16:31, Monday, 09 November
WIL WHEATON dot NET XML 15:28, Monday, 09 November 16:12, Monday, 09 November
wish XML 15:28, Monday, 09 November 16:13, Monday, 09 November
Writing the Bright Fantastic XML 15:28, Monday, 09 November 16:12, Monday, 09 November
xkcd.com XML 15:28, Monday, 09 November 16:11, Monday, 09 November