In recent years, alongside India, Brazil has consolidated itself as a global protagonist in the field of Digital Public Infrastructures (DPI). Pix, launched in 2020 by the Brazilian Central Bank (BCB), reached around 170 million users, becoming the main payment system in the country. A similar number of people use
GOV.br
, the digital government and identification scheme that integrates over 4,600 digital services. Unlike the Indian governance arrangement, which can accord varying roles to the state (e.g., Aadhaar is backed by the government as a provider, while the Unified Payments Interface (UPI) is owned by commercial banks, hence the government is just an enabler), the Brazilian context is often cited in international fora as an example of how governments may provide scalable, free of charge, and inclusive DPI.
Nonetheless, a structural contradiction lies behind that recognition. Although Brazil leads the development and adoption of DPI, these systems are still primarily governed through technocratic instances. Individuals and organized social movements do not have a seat in decisions on the design, development, and maintenance of major DPI. Pix is regulated by the BCB with indirect participation of private financial companies and consumer protection non-profit organizations in the Pix Forum, but those spaces are quite opaque, with very limited visibility to broader society. Similarly,
GOV.br
is controlled by the Ministry of Management and Innovation in Public Services, partnered with state IT company Serpro, without binding instances of popular participation.
This gap is not a minor issue. On the contrary, as
Governance, Openness and Security of Digital Public Infrastructure in India
by the internet Research Lab (hereafter, the “GOSDPI paper”) demonstrates through the Indian model (Aadhaar, UPI, FASTag, etc.), the lack of sufficient public governance is not an accident but a structural feature that enables private appropriation and data misuse. As the GOSDPI paper documents, this was exemplified by how the National Payments Corporation of India, the entity in charge of 80 percent of digital payments in India, argues that it does not function as a state institution, hence avoiding transparency and access to information. Brazil has not reached that situation yet, precisely because only systems operated by the state are considered DPI. The risk, however, lies in rigid vertical structures and in the privatization legacy, if there is no structured social control over these systems. There is an urgent need to reflect upon how to build broader democratic governance in DPI already massively adopted.
MTST as a bottom-up laboratory
It is within this context that the Homeless Workers Movement (MTST) gains relevance. Founded on the accumulated experience of the Landless Rural Workers Movement (MST), but focused on urban contexts, the MTST has been fighting for and organizing workers whose labor relations are not covered by traditional unionism. Their main form of struggle is the occupation of land that does not fulfill a social function in urban centers, especially in the peripheries of large metropolises. The MTST is a popular, urban movement fighting for housing, but it is also more than that.
Since 2020, differently from a purely claim-making approach, the
MTST started to build its own digital infrastructures
. There are several examples, among them the Victory App, which allows the organization of the movement and communication among members, and Hire Those Who Struggle (Contrate Quem Luta), a WhatsApp-based tool that connects workers from the movement with supporters who want to hire services such as cleaning and construction. All initiatives were built through the movement’s own resources, governed through assemblies, and oriented towards a common social goal rather than profit.
The movement has also been articulating a coalition for
popular digital sovereignty
with other social organizations, such as the MST, the World Women’s March, and the Brazilian Network for Digital Sovereignty, thus having the power to bring solid representation to broader debates. It is worth mentioning that the MTST already works as an external auditor for Brazil’s electronic voting machines and has developed digital participation tools for electoral campaigns with inclusive and accessible interfaces.
Brasil Participativo as digital public infrastructure for participation
Beyond Pix and
GOV.br
, there are other digital public infrastructures taking shape in Brazil. One of them is Brasil Participativo (Participatory Brazil), which allows citizens to contribute to making public policies. Originally launched for the elaboration of the
Participatory Multi-Year Plan (PPA) 2024-2027
, Brasil Participativo reached about 1.4 million users, proving to be technically viable and socially appealing. However, its first version was for a one-time consultation, without binding power and subject to being discontinued by a future government.
Brasil Participativo (BP) was developed using a
digital public good, the free software Decidim
, allowing anyone to access the code and propose eventual changes. Yet in practice, no one beyond the laboratory responsible for development has contributed to the system. Moreover, like other mainstream DPI in the Global South, BP runs on cloud infrastructure from major Big Tech companies (the Achilles heel of DPI). Beyond a direct channel with society, Brasil Participativo can also be thought of transversally across other DPIs. That is, using Brasil Participativo as a cross-cutting governance axis, connecting civil society to different sectoral forums. The same citizen, authenticated through the digital ID
GOV.br
, could contribute proposals to the Pix Forum (the participatory instance of the instant payment system), and participate in consultations regarding digital policies and governance more broadly, such as the National Strategy for Digital Government.
That means making BP a structural and permanent layer of the Brazilian state. Moreover, in late 2025, one of the major leaders of the MTST became the Secretary-General of the Presidency of the Republic, the ministry in charge of the digital participation agenda. This institutional bridge opens unprecedented possibilities for convergence.
The state-society convergence and political risks
The federal government took an important step in April 2026 when it released the results of the public consultation for the
elaboration of the Brazilian Digital Transformation Strategy
. The government expected to gather diffuse contributions, precisely through BP. The result, however, was surprisingly convergent. Among multiple stakeholders (academia, the private sector, civil society organizations, and ordinary citizens), the points of greatest consensus were the demand for digital sovereignty based on Digital Public Infrastructures and the need to guarantee popular participation in governance processes, thus democratic alternatives to digital sovereignty. In other words, when the government opens listening channels, society responds clearly. The public consultation thus creates a legitimate mandate for the construction of participatory mechanisms. And it is exactly at this point that Brasil Participativo can become a key DPI that enables democratic control and avoids capture by large foreign providers.
However, there is a clear political risk. The elections of 2026 could bring a change in government that decides to discontinue or weaken Brasil Participativo, as has happened with other participatory tools in the past. To ensure its survival beyond electoral cycles, it is essential to structure effective participation from multiple actors that create distributed ownership and shared responsibility. That means involving municipalities that can adopt and adapt the platform for local participatory budgets, implementing companies that provide sustainable technical support, the developer and civic tech community that contributes to coding and auditing, and academia that produces evidence-based improvements and monitors outcomes. Without this multi-layered ecosystem, Brasil Participativo remains dependent on the political will of a single federal administration, which is a fragile foundation for any digital public infrastructure.
Concrete mechanisms can still be pursued. DPIs can be designed or altered to guarantee binding seats on governance councils for representatives of popular movements and union federations. Ideally, though not very probable in the short term, these organizations would have veto power over changes that undermine fundamental rights. The introduction of new features in major and sectoral DPIs could be qualified through Brasil Participativo, making it an obligation for the institutions in charge to hold participatory processes, even on highly technical subjects. Furthermore, social movements could be formally recognized as auditing bodies, receiving public funding to conduct independent inclusion, security, and privacy audits.
Finally, to broaden the "public" aspect of DPI, they could be developed with community modules that are not controlled entirely by the state. Pix and
GOV.br
could consider adopting open modules that would enable faster adoption and bottom-up development of solutions, hence increasing capillarity and efficiency for those acting in the territories, such as the MTST.
The central question is not whether popular movements like the MTST can participate in DPI governance, but under what conditions that participation becomes possible and sustainable. The MTST has already shown representativeness, organizational capacity, and hands-on experience with digital technology, from internal apps to external audits of electoral systems. What is missing is an institutional architecture that articulates state and society without subordinating one to the other. Brasil Participativo, if anchored in a distributed ecosystem of municipalities, civic tech communities, implementers, and academia, can become that permanent bridge.
Therefore, a genuine digital public infrastructure for social participation would not treat popular movements as mere consultants or beneficiaries. It would recognize them as legitimate co-governors, precisely because they bring territorial roots, democratic practice, and a proven ability to build technology from below. The risk of political discontinuity after 2026 is real, but so is the opportunity to lock in a participatory model that no future government can easily dismantle. That is the concrete horizon for DPI and the MTST: one that promotes public-popular partnerships instead of public-private ones; and does not deny the material dimension of infrastructure in general.
Alexandre is currently a coordinator of digital participation at the General Secretariat of the Presidency of Brazil, PhD candidate in design of DPI at UdK Berlin-Weizenbaum and member of the Homeless Workers Movement Tech Sector.
Mallory Knodel Named Chicago Council Fellow
IX’s Mallory Knodel
has joined the Chicago Council on Global Affairs
as a senior nonresident fellow on technology and governance. She is one of four new fellows appointed by the Council, a nonpartisan nonprofit that publishes research and hosts discussions on global affairs. In the role, Knodel will contribute to the Council’s research, programming and analysis on how technology affects power, security and human rights around the world.
If you find our emails useful, consider becoming a paid subscriber! You'll get access to our members-only Signal community where we share ideas, discuss upcoming topics, and exchange links. Paid subscribers can also leave comments on posts and enjoy a warm, fuzzy feeling.
Not ready for a long-term commitment? You can always
leave us a tip
.
From the NetNewsWire blog:
The latest version of NetNewsWire for iOS supports iPhone
Duo, which is very much a novel iPhone with toolbars running up
the side and all kinds of behavior.
How we did it: we didn’t do any work at all. We built the app
using Xcode 27.1 and the default iOS SDK that co...
The
latest version
of NetNewsWire for iOS supports iPhone Duo, which is very much a novel iPhone with toolbars running up the side and all kinds of behavior.
How we did it: we didn’t do any work at all. We built the app using Xcode 27.1 and the default iOS SDK that comes with it, and that’s it.
Here’s the thing, though: we were already using standard controls — toolbars, navigation controllers, split views, etc. — and we were paying attention to size classes and such (as opposed to just looking at device type).
There is a good list of reasons to use standard controls in the standard ways, and near the top of that list is to be ready for these kinds of days, so we’re not bogged down for a month or more trying to adapt to big changes like this.
Here’s a secret: Brent didn’t even run this in the Duo simulator before releasing it. We were ready to
not
claim Duo support and just handle Duo in the next release. But here it is.
PS Of course there may be edge cases and issues in our Duo support we haven’t caught yet. We stand by, as always, ready to field and fix bugs.
PPS Thank you to all the engineers, designers, and testers at Apple who made this work so easily! Again, we didn’t do anything but build with the new SDK. Their achievement is pretty remarkable.
Steinar H. Gunderson: Decompilation patterns, part 13: Reverse loop
PlanetDebian
blog.sesse.net
2026-10-16 16:45:25
Anyone who's read “bro-coder” C from before that was a name will recognize
this idiom:
var_t1_2 = 0x7F;
...
do {
...
var_t1_2 -= 1;
} while (var_t1_2 >= 0);
Why does the loop count backwards? It's because comparison with zero
is cheaper on some (many) platforms....
Anyone who's read “bro-coder” C from before that was a name will recognize
this idiom:
var_t1_2 = 0x7F;
...
do {
...
var_t1_2 -= 1;
} while (var_t1_2 >= 0);
Why does the loop count backwards? It's because comparison with zero
is cheaper on some (many) platforms. Some people would reverse the loop
manually, but compilers quickly managed to do that themselves. So you want:
for (i = 0; i < 0x80; ++i) {
...
}
and tomorrow, we'll have a look at what's inside the loop as well.
The NIST Elliptic Curves Seeds Bounty Has Been Claimed
We now know how the seeds of the NIST elliptic curves were generated: they’re not the hash of some saucy sentence, but the output of
drand48
seeded with the time, which was indeed in 1997–98.
John Wood, Henry de Valence, Ava Howell, Zack Voase, Lucy Sweet, Amir Omidi, Paul Crowley, Iain McGinniss, Nicholas Carlini, and Steve Weis from Anthropic
solved the riddle
and on October 15th, 2026, at 01:07:51 UTC, claimed
the full bounty I announced three years ago
. They chose to donate the prize to
ISRG
, the non-profit that operates Let’s Encrypt, tripling its value to $36,864 (36 Ki$). Thank you to Amir Omidi, Chris Palmer, Colm MacCárthaigh, David Adrian, David Anderson, Jeff Hodges, Matt Green, Matthew McPherrin, Paul Kehrer, Ryan Sleevi, and Soatok for contributing to the bounty.
This helps fill out a page of cryptographic history, and reinforces our confidence in these critical cryptographic primitives.
The NIST elliptic curves (P-192, P-224, P-256, P-384, and P-521) were published by NIST in FIPS 186-2 in 2000. They were generated at random according to ANSI X9.62 by taking an arbitrary seed, hashing it with SHA-1, and using the output to derive some of the parameters. Until this week, we had no idea how those arbitrary seeds were picked.
Turns out memory can play tricks on everyone: we now know they were instead generated with the POSIX-standard
drand48
random number generator.
The algorithm is as simple as passing the then-current UNIX timestamp to
srand48()
and then producing one byte at a time with drand48. Each sequence of 20 bytes is tried as a seed following ANSI X9.62 and rejected if the resulting curve is not valid. Some timestamps are used to generate multiple curves, by continuing to try seeds after accepting the first one. I
reimplemented the algorithm in Go
to verify the claim. Read more in
Anthropic’s writeup
.
There are two additional undocumented criteria beyond the ANSI X9.62 ones, one fairly clear and one that still escapes us.
If the bit length of the order
n
of the resulting curve is more than the bit length of the base field
p
of the curve, the seed is rejected. (The condition is not the stricter
n
<
p
, because prime239v2 has
p
<
n
< 2²³⁹.)
This leaves us with roughly twice as many valid seeds as were published. We explored a number of explanations for this last bit, and found no good fit. Maybe the same RNG was used to validate seeds, consuming RNG output and skipping some potential candidates, although the “gaps” are not regular. Maybe there was just a bug in one of the algorithms that returned the wrong result half the time; these calculations, which we can now do with off-the-shelf software in minutes, were still very much state-of-the-art in 1997.
srand48(863711343) [1997-05-15 15:49:03 +0000 UTC]:
accepted 36th seed 25e5[...]: not published
accepted 1562nd seed d09b[...]: not published
accepted 2185th seed e43b[...]: prime239v1
accepted 2320th seed e8b4[...]: prime239v2
accepted 2491st seed 1256[...]: not published
accepted 2682nd seed d2c1[...]: not published
accepted 2863rd seed 3a70[...]: not published
accepted 3048th seed 7d73[...]: prime239v3
srand48(863966734) [1997-05-18 14:45:34 +0000 UTC]:
accepted 139th seed 3045[...]: P-192 a.k.a. prime192v1
accepted 2198th seed 692d[...]: not published
accepted 5228th seed c469[...]: prime192v3
accepted 5405th seed 3ad1[...]: not published
accepted 6013th seed 31a9[...]: prime192v2
srand48(871002724) [1997-08-08 01:12:04 +0000 UTC]:
accepted 1136th seed d09e[...]: P-521
srand48(871696354) [1997-08-16 01:52:34 +0000 UTC]:
accepted 876th seed 50c7[...]: not published
accepted 1842nd seed c49d[...]: P-256 a.k.a. prime256v1
srand48(872952608) [1997-08-30 14:50:08 +0000 UTC]:
accepted 2688th seed a335[...]: P-384
srand48(891607927) [1998-04-03 12:52:07 +0000 UTC]:
accepted 777th seed d007[...]: not published
accepted 1485th seed 18cf[...]: not published
accepted 5736th seed 3c17[...]: not published
accepted 7026th seed bd71[...]: P-224
What does this mean for the security of elliptic curve cryptography based on the NIST curves? Well, even before this discovery there were no serious concerns among practitioners. In Section 3.1 of
their 2015 paper “A riddle wrapped in an enigma,”
Koblitz and Menezes make a convincing argument that it’s implausible that the NSA could have selected a seed to exploit a weakness that escaped more than 15 (now 25) years of cryptanalysis.
However, as reported in a later version of that paper, Daniel Bernstein and Tanja Lange described to Koblitz and Menezes in 2017 a technique that could have exploited 70 bits of freedom in selection of the seed to target a hypothetical class of 2⁶¹ weak prime-order curves. (Bernstein is the author of a competing elliptic curve design, Curve25519.) This contributed to enduring conspiracy theories, which had significant appeal among the non-specialist public (although many have since moved on to other, adjacent, conspiracy theories). All this speculation harmed confidence in robust cryptographic systems and was part of my motivation for the bounty.
This week’s findings completely rule out the technique described by Bernstein and Lange. Even if the NSA had been free to pick any timestamp in 1997–98 and any of the first 16 prime-order candidates (which generously accounts for the unexplained rejections), they would have had barely 30 bits of freedom. Not enough to intentionally target a hypothetical small class of weak curves, not enough to embed any kind of
NOBUS
backdoor.
Just in time for them to be retired in favor of post-quantum signatures.
P.S. The Anthropic team also figured out how the seeds of the NIST B-curves (the ones over binary fields) were generated, but no one uses those, so who cares.
The picture
In a FamilyMart in Taiwan I found this delightful dice set. A full roll carries log₂(6²⁰) ≈ 51.7 bits of entropy. Rolling them twice can make a pretty robust cryptographic key!
I thought it would be funny to label them as Geomys FIPS 140-3 Entropy Sources (which of course they are not, though we do have one of those) and hand them out as swag. However, I found no way to order them online, so I simply visited over a dozen FamilyMarts and brought home 50 packs.
Speaking of swag, I am 100% making stickers with the
srand48()
seeds, and t-shirts for the Anthropic team and the contributors to the bounty. I accept suggestions for other seed-based swag. If you want to catch some, follow me on Bluesky at
@filippo.abyssdomain.expert
or on Mastodon at
@filippo@abyssdomain.expert
.
The Law Can't Silence These East Village Residents Hanging 'Pete Hegshit' Signs
hellgate
hellgatenyc.com
2026-10-16 16:14:59
The Department of Buildings ticketed a prolific sign maker on St. Marks Place, but backed down after a Hell Gate inquiry....
In early 2020, Manny Verdi's neighbor began hanging signs on the residential building Verdi owns on St. Mark's Place in the East Village.
The first sign, Verdi said, was of a school of tiny fish
swallowing one large fish
with the call to "organize!" Since then, he's helped her swap out her handmade cardboard signs every few weeks.
"There's signs about the Supreme Court, there's signs about Trump—there has to be at least 50 signs since she started putting them up," Verdi told Hell Gate of his neighbor, the signmaker, who asked to remain anonymous.
But in late September, Verdi received a summons from an inspector for the Department of Buildings, who had taken issue with the sign du jour: "Hey Congress If You're There Blink Twice" with big googly eyes.
If you think Musk is either completely legitimate and trustworthy or an utter fraud, you are wrong. He has led his companies to extraordinary accomplishments, *and* he has made promises based on complete bullshit. He is a shameless bullshitter who *sometimes* delivers....
Musk claims that the Roadster will go into production by 2028. But
the CEO has a long and glorious history of overpromising and
underdelivering; in 2017 he told attendees at the previous launch
that “We are making it now.” Using the company’s referral program,
some people were in line to receive two free cars. But those free
cars never showed up, and neither did the ones that people put
down $50,000 deposits for; last year
Sam Altman discovered how
hard it can be to get that money back
.
I like a good stunt show as much as the next guy, and this looked like a cool stunt show. But people are losing their minds if they think this stunt show makes it any more or less likely that Tesla will deliver a Roadster as promised.
This Reuters story
makes it sound like they think Tesla is going to sell cars that do this stuff. Last night’s stunt show has no more bearing on actual production cars Tesla may or may not ship than George Lucas’s
Star Wars
movie had on
Ronald Reagan’s “Star Wars” missile defense system
.
Tesla has long made up specs for its cars, made wild claims that
weren’t substantiated by users, and now it’s making more big
impressive claims. The “cars” used for the demos were likely
nothing more than shells outfitted with exactly enough equipment
to make the tests work. The 0.81 second zero-to-60 number wasn’t
even shown with an on-screen timer during the event, let alone
independently verified. Tesla has yet to prove anything about the
new Roadster works in the real world, or could even exist within
the realm of physics that those of us not named Musk occupy.
Roadster preorders have reopened, with the company once again
taking $50,000 checks to reserve a car that’ll theoretically be
made two years from now. It hasn’t yet said what will happen to
the people who placed a reservation for the car Tesla announced
nine years ago, which looks and functions completely differently
to the one that bears its name today. And — arguably most
concerning — we don’t know, if Tesla rakes in more money off the
Roadster name, just how much will go to
some malicious
end
.
A long time ago, I described Elon Musk as a bullshitter who
delivers. This is the perfect expression of that. This car was
first shown a decade ago, with another stunt, and it never
shipped. Now there’s another stunt, and another huge wave of PR
and admiration.
But meanwhile, there’s the scaled car company, and the
self-landing rockets!
Henry Ford was a brilliant industrialist, a terrible manager and a
racist piece of shit. Several things can be true at once.
If you think Musk is either completely legitimate and trustworthy or an utter fraud, you are wrong. He has led his companies to extraordinary accomplishments,
and
he has made promises based on complete bullshit. He is a shameless bullshitter who
sometimes
delivers. The
sometimes
is implicit in Evans’s take, because if he always delivered, there’d be no bullshit. But I think it’s worth including the
sometimes
to make the point. And some of the things he’s delivered
are so amazing
that they sure sounded like they might be bullshit when they were announced. “Space internet”
sounded like total bullshit
when Musk announced it in 2015, but it
started rolling out in 2020
, and today you can just
buy it at Best Buy for $350
.
Tesla makes some tremendous vehicles. Their self-driving technology is the best in the consumer market. (Not as good as Waymo’s, but you can’t buy a Waymo.) So maybe they will ship a great Roadster in 2028. I’ll pay attention if and when they do. But I wouldn’t bet a nickel that they will. And I wouldn’t bet that they won’t, either.
Critical BlockStrap flaw lets hackers run code on Magento servers
Bleeping Computer
www.bleepingcomputer.com
2026-10-16 16:00:59
Researchers warn that hackers could soon exploit a maximum-severity vulnerability (CVE-2026-103849) affecting Magento and Adobe Commerce, potentially allowing them to execute arbitrary PHP code on store servers. [...]...
Researchers warn that hackers could soon exploit a maximum-severity vulnerability (CVE-2026-103849) affecting Magento and Adobe Commerce, potentially allowing them to execute arbitrary PHP code on store servers.
According to e-commerce security firm Sansec, attacks leveraging the vulnerability, dubbed BlockStrap, have not yet been observed, but threat actors are expected to find a way to exploit it.
The researchers based their assessment on identifying four potential attack paths involving CVE-2026-103849 in less than 24 hours.
The flaw impacts September versions of Adobe Commerce and Magento Open Source through 2.4.9 and Adobe Commerce B2B through 1.5.3.
The security firm warned that Adobe’s “priority 2” rating of this flaw does not reflect the danger and urgency in this case, despite the more complex attack path.
“The attack path is complex, but anyone with an AI agent can reverse-engineer the patch into working exploits in a relatively short time,”
stated Sansec states
.
“That is why we question Adobe's priority 2 rating (patch within 30 days).
StyleSmuggler
went from a priority 1 hotfix to
mass exploitation
in three days, and BlockStrap is of similar complexity.”
Adobe’s bulletin
, published on October 13, describes the flaw as an improper neutralization of special elements used in a template engine, leading to arbitrary code execution.
Sansec explains that BlockStrap is a second-pass template engine directive injection that allows attacker-controlled content in a child email template to be signed and processed again at the root level, executing a smuggled {{block}} directive.
According to Sansec’s analysis, BlockStrap exposes a gap left by the StyleSmuggler fix in the same email-template engine.
Adobe’s fix replaces the generic processing with registered placeholders, preventing exploitation.
Sansec says that a plain Composer install isn’t enough to address the risk, and website administrators must apply the 2026-oct release or Adobe’s isolated patch.
“BlockStrap and StyleSmuggler are separate fixes. You need both, so keep the September VULN-39341 hotfix in place as well,” Sansec cautions.
The e-commerce security company says it will provide an update when it detects mass attack waves, which it expects to occur soon.
Dirk Eddelbuettel: RcppSimdJson 0.1.17 on CRAN: Updates
PlanetDebian
dirk.eddelbuettel.com
2026-10-16 15:56:00
A brand new release 0.1.17 of the RcppSimdJson
package is now on CRAN, and has
been built for r2u and
on r-universe.
RcppSimdJson
wraps the fantastic and genuinely impressive simdjson library by Daniel Lemire and collaborators. Via
very clever algorithmic engineering to obtain largely branch-free co...
RcppSimdJson
wraps the fantastic and genuinely impressive
simdjson
library by
Daniel Lemire
and collaborators. Via
very clever algorithmic engineering to obtain largely branch-free code,
coupled with modern C++ and newer compiler instructions, it results in
parsing
gigabytes of JSON parsed per second
which is quite
mindboggling. The best-case performance is ‘faster than CPU speed’ as
use of parallel SIMD instructions and careful branch avoidance can lead
to less than one cpu cycle per byte parsed; see the video of the
talk by Daniel Lemire
at QCon
.
This release is a small increment relative to the
0.1.6
release last week
that got us (upstream) version 5.0.2 with many
notable changes and sizeable speed gains on all fronts, including the
interface from R. However, this failed to compile at
CRAN
on macOS x86_64 as the
machine is setup for only partial support of C++20: no ranges, no
concepts. So we now test, and fall back to C++17 if the test compilation
fails. Upstream, meanwhile, already got to 5.0.5 which is included. It
also gets us improved handling of disabling pragmas which we hope will
survive
CRAN
checks.
The brief NEWS entry for this release follows.
Changes in
version 0.1.17 [unreleased] (2026-10-xx)
Compilation starts with a C++20 feature test; if this fails C++17
is used (Dirk in
#111
fixing
#110
)
simdjson
was upgraded to version 5.0.5
(Daniel in
#112
)
Today we are releasing FLUX 3 Image Klein, a 5.6B parameter open weights model for text-to-image generation, image editing and multi-reference generation with up to 10 reference images. It shares core capabilities with the full FLUX 3 Image model: native 4K generation, pixel-perfect editing, and bounding boxes that control where elements are placed or confine edits to a defined area.
FLUX 3 Image Klein builds on FLUX 3's shared learnings across images, video and audio. Images contribute spatial detail, video adds motion and physical dynamics, and audio provides information about events and interactions. Together, these signals help the model generate images that feel grounded in the real world.
The release includes a base model for fine-tuning and a step distilled model for low-latency generation, along with FP8, INT8 and NVFP4 builds developed with NVIDIA support, under the FLUX Kommunity License.
Leading open weights quality with fewer parameters
In internal evaluations, FLUX 3 Image Klein ranks first in text-to-image, multi-reference generation and image editing, ahead of larger open weights models. It also rates above the closed models in the comparison, Ideogram V4.5 and FLUX.2 [pro]. At 5.6B parameters, it is the smallest open model in the comparison, against 7B for Qwen-Image 2.1 and 12.9B for Krea 2. Compared with FLUX.2 [klein] 9B, it gains 91 Elo in text-to-image and 70 in image editing, with 38% fewer parameters.
FLUX 3 Image Klein was also optimized for consumer GPUs. Fewer parameters make it practical to run locally and cheaper to adapt, and teams with data sovereignty or local deployment requirements can evaluate and adapt the model on their own infrastructure. This is also key for on-device image editing, allowing consumers to edit images directly on their favorite laptops. The generator weights require 11.2 GB in BF16 and 5.6 GB in FP8. With the INT8 build, FLUX 3 Image Klein runs on NVIDIA GeForce RTX GPUs with as little as 8GB of VRAM, through ComfyUI or Diffusers, extending what FLUX.2 [klein] started to even smaller hardware. With the distilled model and the INT8 build, it generates a 1MP image in about 4 seconds on an NVIDIA GeForce RTX 5090 and under 9 seconds on an RTX 4070 through ComfyUI.
Generation time by GPU: Step-distilled model, 16 steps. Seconds per image, one image per run. Lower is better. Measured by NVIDIA; RTX results in ComfyUI; data results are the best-performing framework for each configuration. Each GPU shows its quickest build. Generation time on the GPU itself; API latency in Section 02 also includes queueing, network and prompt upsampling.
Generation time by GPU: Base model, 50 steps. Seconds per image, one image per run. Lower is better. Measured by NVIDIA; RTX results in ComfyUI. Each GPU shows its quickest build.
The base checkpoint is built for fine-tuning: Diffusers and Ostris's AI Toolkit support LoRA training from day one, and NVIDIA's NeMo AutoModel ships recipes that work directly from the released checkpoints.
For even faster production workloads that need lower latency, we also work with teams on specific customizations that get you there.
Get in touch
.
On the speed–quality frontier
FLUX 3 Image Klein also extends the speed–quality Pareto frontier. Through the BFL API, it delivers lower latency than Qwen-Image 2.1, FLUX.2 [pro], Ideogram V4.5 and Krea 2, and the highest rating at its latency and above. In the charts below, the violet line traces the highest rating available at each latency and the gray line shows the previous frontier.
Latency is measured end to end, from request submission to the finished 1 MP image, including queueing. FLUX 3 Image Klein was timed on our servers. Other models were timed from the client, which includes polling and network time. Krea 2 was timed on its Medium tier; its Large tier took 31.1 seconds for text-to-image.
Get started
FLUX 3 Image Klein is available today as open weights and through the
BFL API
.
Try it
BFL API: the distilled model is available as flux-3-image-klein, with prompt upsampling and pixel restoration, which preserves unedited regions of an image exactly. Pricing starts at $0.009 per 1K image.
Trained on NVIDIA GB200 NVL72 and optimized for NVIDIA's accelerated computing platform, serving through NVIDIA TensorRT LLM,
vLLM-Omni
and
SGLang Diffusion
.
On NVIDIA GB300, the distilled model generates a 1MP image in under 0.6 seconds in NVFP4. Serving a LoRA adds around 5% to generation time.
License
The weights are available under the FLUX Kommunity License, which allows free commercial use for individuals and companies with annual revenue under $5M, alongside research and non-commercial use. Larger organizations can deploy commercially through our self-hosted licensing options or API.
Safety
In an effort to make AI technology both open and safe, we implement multiple safeguards throughout the model development lifecycle to combat misuse. These include dataset filters during pre-training to limit exposure to harmful content, and targeted fine-tuning during post-training to suppress harmful behaviors, making it progressively harder to elicit harmful content. Ahead of the release, the FLUX 3 Image Klein checkpoints were rigorously red teamed internally and evaluated by our external safety partner Cinder, demonstrating substantially fewer vulnerabilities than other popular open weights models. More on our safety methodology is available
here
.
FLUX 3 Image Klein is the second open weights release from the FLUX 3 family, following FLUX 3 Action. More will follow.
The GNOME Project has provided GNOME OS for some time; until now, the
project only provided a "Nightly" edition that was built from the latest commits
and was aimed solely at GNOME developers. Adrian Vovk has now announced
the release of GNOME OS Preview, which is intended for a non-d...
The
GNOME Project
has provided
GNOME OS
for some time; until now, the
project only provided a "Nightly" edition that was built from the latest commits
and was aimed solely at GNOME developers. Adrian Vovk has now
announced
the release of GNOME OS Preview, which is intended for a non-developer
audience:
GNOME OS Preview is the current GNOME OS Nightly, but without the "nightly"
aspect. Instead, it's built from the latest stable GNOME release (GNOME 51.1, at
the time of writing). GNOME OS Preview lives in the same branches on GitLab as
the stable org.gnome.Platform Flatpak runtimes.
GNOME OS Preview is only a few weeks old, so it has only seen limited
real-life testing so far. We therefore expect people will uncover some issues
initially. That said, Preview is significantly more stable than Nightly, which
dozens of people have been daily driving without major issues for over a
year. Thus, we're feeling confident that Preview is going to be reliable enough
for daily use by non-developer enthusiasts.
While Preview is meant for non-developers, it is not considered complete or
stable for the broader public. There are a number of features, listed in Vovk's
post, that need to be implemented before the project is ready to declare
GNOME OS "
ready for prime time
". Adventurous users, who might not
mind having to reinstall the OS once a stable version is declared, can
download and start using GNOME OS Preview today.
We've said before that Claude writes about 90 percent of Claude Code's own code. So how do we review code at the volume we produce it? Does anyone read code anymore? And if something breaks, who catches it?
This post covers the code review flow on the Claude Code team and how it has evolved. From June to September, merged pull requests to Claude Code's codebase more than doubled while the share that had to be reverted fell by more than 40 percent.
We didn't remove review. But we did move most of the reading to machines, optimized for human time and attention, and invested heavily in making it fast and easy to undo mistakes.
Claude Code lives in its own repository, separate from the monorepo, but it's seeing a lot of pressure too. When you are shipping this fast, manual, line-by-line code review is incredibly difficult if not impossible.
Code review does two jobs:
Find and fix issues before they ship
Build shared context and codebase understanding across the team
This article mainly focuses on finding and fixing issues, but we will come back to the second job near the end.
We think "did a human read the code?" is an imprecise proxy for "what could go wrong with this change, and which check—automated or human—is the right one to catch it?"
Asking that question also changed
when
review happens. Before, review was a gate at the end of the road: write the code, open a PR, wait for your colleague.
Now, review runs continuously, more like spellcheck while you write. Most changes have been reviewed and fixed by Claude at least once before a human is asked to look. This catches most routine mistakes, and saves team attention for higher-level questions and scrutiny.
THE SCARCE RESOURCE: HUMAN TIME AND ATTENTION
We want to preserve human time and attention for issues only humans can solve and make sure automated checks catch the rest. At our current rate of change, there is still an incredible amount of work for humans to do, and our team encounters new and novel challenges almost daily.
Human time covers both sides of review's cost: the time people spend reviewing, and the time they spend fixing what bad code breaks. Cutting the first doesn't help if the time just shows up in the second.
So the goal is that most pull requests in the Claude Code repos (the CLI, the desktop and web apps, and the mobile apps) merge with at most one human in the loop, who can be the author, with no increase in reverts or incidents. To measure human time, we track human approvals per PR (median and 95th percentile), human comments, and how long a PR waits on a person. Revert and incident rates are the guardrail: if they rise, we haven't saved human time, we've only moved it.
THE LIFE OF A CHANGE
A typical change, from an engineer's laptop (or a Claude session in Slack), goes through multiple layers of code review.
The life of a change
A typical Claude Code change, from the author's machine to users
FIG A
Most of the path is automated; a person's attention goes where the risk is
LAYER BY LAYER
Layers, not one gate
Six layers of checks, with rollback under them
FIG B
Each layer catches some problems and misses others. Few get through all of them, and rollback handles the rest.
1. The work is verified before anyone else looks
Most review now happens before a PR exists. We give Claude something it can run—like tests, a build or a screenshot to compare against the design—and ask it to show the output instead of saying it's done. Then a subagent reviews the diff with fresh context. Both habits come from our
best-practices guide
.
Before opening a PR, many of us also run a few internal skills: one hunts for bugs, one simplifies the diff, and one checks the behavior end to end. UI changes also get checked against our design guidelines.
Boris Cherny, who created Claude Code, has called giving Claude a way to verify its work
probably the most important thing
for getting good results. He estimates it makes the final result two to three times better, and writes, "Verification looks different for each domain. It might be as simple as running a bash command, or running a test suite, or testing the app in a browser or phone simulator."
When the automated reviewer keeps flagging the same thing, we fix it at the source:
in the skill, with a lint rule, or with updates to instructional files such as:
CLAUDE.md
tells Claude what the project is: the stack, the conventions, the goals and the non-goals. Every review loads it, so in a large codebase we keep it short and point to other docs from there. The reviewer also flags code that breaks a convention in it, and changes that make a line in it out of date.
REVIEW.md
, written by code owners, tells the reviewer what matters in their part of the code. We check separately whether the reviewer actually follows it. The good ones are short. They say what failure looks like in that repo (for docs it's "it lies," for config it's "it misroutes"), cap the nits, list paths to skip, and ask for a file and line as evidence instead of a guess from a name. They also ask for a summary that starts with a count and says plainly when there's nothing to fix.
2. AI review on every pull request
Every pull request gets a Claude review before a person looks. It reads the diff against the whole repo and the PR's stated intent, and asks: does the change solve its problem, fit the system, or break something else?
On a bug fix, it looks for the root cause. The public version,
Code Review for Claude Code
, is now generally available on Team and Enterprise plans, and
/code-review
runs a lighter version locally.
When we
launched the research preview
, the share of internal PRs getting substantive review comments went from 16% to 54%. Most PRs over 1,000 lines get findings, and most small ones come back clean. Admins set each repo to Quick, Standard, or Deep. Deep is worth it where one missed bug costs more than the extra review time.
Findings get verified by other agents before humans review them.
Several agents look for bugs at the same time. Then a separate group votes on each finding, and it only gets posted if enough of them agree it's real. Findings that are only about style, diagnostics, or cleanup get dropped. We A/B tested those filters on our own PRs before keeping them. What's left shows up as inline comments sorted by severity. Each is tagged Important, Nit, or Pre-existing, so a bug the PR didn't introduce doesn't look like the author's fault.
Every finding has to be answered.
You either fix it or resolve the thread with a reason. Often an agent picks up the fix overnight, so the author comes back to a PR that's already been through another round.
3. Security review that can block
Security gets its own automated review too. A PR can't merge while any finding from the bug review or the security review is still open. You either fix it or close the thread with a short reason, which is how you clear a false positive.
If a later commit fixes the issue, the finding clears on its own. You can set up the same thing with the open-source security review GitHub Action or the
/security-review
command. Setup is covered in
automated security reviews in Claude Code
.
4. Automated checks that block
The usual: lint, type checks, tests on every platform, and a build. (We wrote about scaling CI for this volume
here
.) A typical CLI pull request may run dozens of checks before anyone looks at it. The PR template asks how the change was tested and how to undo it. Claude can fill that in, but the person who asked for the change signs off on it.
5. Human approval, scaled by risk
A docs fix and an auto-updater change carry different risk, so they get different review.
Risk
Examples
Human approvals
Low
Docs, copy, internal-only features, additive changes behind a flag
None required once automated review and security checks are green
Medium
Ordinary product changes, and changes to sensitive areas such as caching, the auto-updater, or system prompts
One person
High
The highest-risk code, plus a small set of paths that always need two people
Two people
The change sets the tier, not the author.
A classifier reads the change and picks its risk tier. A second classifier asks whether this particular change needs another person even when its tier says it doesn't. Some paths always need a person, anything owners have listed as sensitive and any CI workflow file.
Only trusted authors get the lighter paths.
Only authors on the repo's trusted list get the lighter paths, mostly the team that owns it. Everyone else needs a second person to approve. An agent's approval never counts as a person's, either. Automated review can clear a low-risk change, but it can't fill a slot that calls for a human.
Whoever prompted the change is on the hook for it.
On an agent-written PR, the person directing the agent counts as one of the required reviewers, the same as if they'd typed the code themselves.
An approval covers one specific commit.
If new commits land that the system can't vouch for, like an agent's push or a merge someone resolved by hand, the approval has to be given again.
6. Merge queue, flags and a gradual release
The merge queue re-runs every check against main with the change applied, so two PRs that pass separately can't combine into a broken main. New behavior usually ships behind a flag to Anthropic employees first, and our heavy use often surfaces regressions before users do. Public releases go to the
latest
channel first. The
stable
channel trails it.
7. Fast detection, fast rollback
Some mistakes will still get through, so the last layer is about catching them fast. Flags turn off without a deploy. Claude Code has a weekly on-call rotation, and incident reviews ask which layer should have caught the issue.
Noticing a bad merge still depends on the author and on-call as well as the revert and incident dashboards. We don't yet have circuit breakers that tighten approval when those numbers move; engineers here want them before more code moves to zero-human merges.
One colleague said slowing down does lower your error rate, but mostly because you're doing less of everything. We'd rather get faster at noticing and fixing problems.
HOW WE MAKE THE REVIEWER BETTER
Our code review process is constantly improving in a loop.
Any incidents are now an eval.
The team collected past PRs that caused incidents, with their fix-forwards and reverts, and had engineers who know that code confirm each bug and where it lived. The reviewer runs against that set daily.
Our incidents are the eval
Built from past incidents and reverts, run every day
FIG C
The eval grows with every incident, and every change to the reviewer is scored against all of it.
We measure noise by watching what people do with the comments.
It's easy to catch more bugs if you don't mind flagging a lot of non-bugs, so we need a check on that. We sort every comment the reviewer leaves by how the person on the PR responded: they fixed it, said it was wrong, said the behavior was intentional, or decided it didn't matter. We also run the reviewer on PRs we know are clean and count how often it reports something that would have led someone to make a harmful change. Our priority, written down, is catching real bugs first and cutting review rounds second.
Noise costs more when the author is an agent. A person can wave off a nit in seconds. An agent fixes it, which means another commit and another round of review.
Review has to converge.
An agent author and an agent reviewer can keep each other busy indefinitely. One CLI PR went through more than fifty rounds of review and fixes overnight before its author stopped it.
When we ran git blame on what the reviewer kept flagging, about 59% of it was code that had been there since the reviewer's first pass. The reviewer was rarely finding new bugs, it was finding a few more old ones each round.
We made it worse ourselves. We'd gotten used to running several rounds by default, since each pass catches something new. This can be worthwhile on a risky change, but not on every PR. The team now tracks rounds-to-pass alongside recall, and changed re-review:
A round cap.
After three rounds, the reviewer asks the author to step back and reconsider the approach.
Diff-only re-review
after the first few passes.
Flag the class of bug,
so the author fixes every instance, not one line.
No repeats
of findings already posted.
Review agents also run nightly over existing code, helping us catch old bugs before they show up somewhere else.
Review that converges
Internal pull requests, before and after the convergence changes
FIG D
Fewer review rounds per internal pull request after the convergence changes
WHERE HUMANS STAY IN THE LOOP
Pulling a senior engineer out of deep work to catch a routine mistake costs far more than an automated review. At Anthropic, our jobs have moved from reading every diff to the decisions machines are bad at:
Should we build this at all?
Direction, taste and scope. One team that declared its review bottleneck solved still kept human review for changes from outside the team, so someone asks "should we even do this?"
Risky code
such as billing, the auto-updater and CI workflows.
Architecture
that sets a pattern others will copy.
Reading the evidence.
Test output, the command that ran and what it returned, a screenshot, the reviewer's findings. If you can't say what the checks would miss, ask for a real review rather than a quick approval.
Owning the outcome.
A person is accountable for every change that ships, whoever typed it.
Where a person decides
Five decisions stay with people; checks run everywhere else
FIG E
People moved from reading every diff to the decisions machines are bad at
SHARING CONTEXT ACROSS THE TEAM
Code review's second job has always been to spread codebase understanding. Reading a teammate's diff is how you learn what changed and how the pieces fit. If machines do most of the reading, how does anyone learn the code?
We don't have a formal process for this. Nobody on the team keeps a complete mental model of Claude Code in their head, and we don't think anyone needs to. When someone wants to understand a part of the codebase, they ask Claude to write an explainer for exactly that slice. It takes minutes and reflects the code as it is today.
Some of us go a step further and have Claude build a small artifact that visualizes that part of the code and teaches it the way that person likes to learn.
If the goal is to spend human attention well, this beats reading trivial diffs line by line. A one-line copy change teaches you almost nothing. An explainer for the module you're about to change teaches you a lot. Our culture of defaulting to working on open Slack channels helps too, since you see what others are building while they build it.
"YOU LAND IT, YOU OWN IT"
If you land a small or medium change and something still goes wrong, it's a team norm that you usually fix it. A few things keep this from going badly:
Changes are small,
so they're easy to review, debug and revert.
Everything is reversible.
Flags, reverts and staged releases undo most mistakes in minutes.
Blast radius sets the bar.
Expensive code gets more people and more checks.
Regressions surface fast
through telemetry and internal use.
It isn't blame.
Owning a fix means you have the most context; incident reviews look at the system.
Ownership is also shared. Much of the team works in
open channels
where anyone can see what others are building, pick up a thread, or point a Claude at a gap, and feedback comes from people who don't own the code too. That openness is a big part of how quality stays high without a gate on every line.
WHEN WE CHANGE DIRECTION
Agents make it cheap to start things, so some work shouldn't land. Usually someone in the channel asks why, points at an earlier decision, or suggests a simpler route, and the author closes or reshapes the PR.
Since the code was fast to write, closing the PR doesn't feel like a loss. The trick is to raise a different direction in the thread early, not as a blocking comment on a finished PR.
HOW YOU CAN ADOPT THIS PROCESS
Most of the pieces to do this with your team exist today.
Before the pull request
Give your agent checks it can run, listed in a short
CLAUDE.md
, plus hooks that run formatters and linters.
Run
/code-review
and
/security-review
locally, or a fresh-context subagent review.
Add a
REVIEW.md
, and move repeated review comments into it.
On every pull request
Require CI, and add "Testing", "Risk" and "How to revert" to your PR template.
Add an AI reviewer (Code Review for Claude Code, or the Claude Code GitHub Action) on one repo, tune
REVIEW.md
for a few weeks, then widen.
Add automated security review, and require every review thread resolved before merge.
Match review effort to risk: a quick pass on routine changes, a deep one where a missed bug is expensive (Quick, Standard or Deep in Code Review).
Cap review rounds; after the first few, re-review only the new diff.
Approval
Write down risk tiers, set from the change rather than the author; start strict and loosen with evidence.
Keep the lighter approval paths for authors you trust.
Use CODEOWNERS and branch protection so auth, billing, CI and release workflows, and installers always need a person.
Never let a bot's approval replace a required human's; dismiss approvals on new commits.
Merge and after
Use a merge queue, feature flags, internal use first, staged releases and one-step rollback.
Turn incidents and reverts into an eval set, and rescore the reviewer whenever its prompts, tools or model change.
Measure human time, with revert and incident rates as the guardrail.
WHERE THIS IS GOING
Code Review's
announcement
said approving a pull request is still a human call; the product posts findings, not approvals. Our own repos go further, letting owners decide which low-risk changes merge on automated checks alone, and that line keeps moving.
When a review misses something, we ask what the model didn't have in front of it and put the fix into a
CLAUDE.md
, a skill or a new check. The goal hasn't changed: less human time per change, and no more reverts than before.
If your team lets agents open pull requests, we'd like to hear which checks you've automated, which still need a person, and what you think we have wrong.
With thanks to Emma Webb, Michael Segner and Amie Rotherham for their reviews.
Retrieving a character from memory. The recall worsens as the number of memories grows.
Large language models today can recall obscure facts from every corner of the world.
Most recently, I was running late for a friend’s board game night, so I asked Astra to remind me the rules to Dune: Imperium.
It gladly narrated them to me as I drove over and helped me remember the rules well enough for me to play again.
We’re so used to asking models about anything that we take their vast knowledge for granted.
How do models remember so much information? And
how much can they store?
In this post, I’ll go through an intuitive way to look at linear maps, MLPs, and self-attention as different kinds of memory stores. From this intuition we can derive some heuristics for how much memory each layer can store.
The key property that characterizes a “good” memory store is its ability to recall what it stored. After all, even if we could store infinitely many facts, it’s not very helpful if we can’t recall them when we need to.
The more memories we store, the more they
interfere
with each other when we try to recall one. So throughout the post we’ll focus on one quantity, the interference-to-signal ratio, which measures how much the other memories get in the way during recall. The number of memories a store can hold before the interference grows as large as the signal is its
capacity
.
We’ll develop this perspective and show how you can go from a linear layer to something better, an MLP, which improves both capacity and recall, and then all the way to self-attention, which has very good recall and can store a potentially unbounded number of memories. With 64-dimensional keys, that’s a jump from about 64 memories, to about 2,700, to over a million.
Here are the terms we’ll use throughout. A
memory store
is a function $f$ that holds $M$ memories, for $i = 1, \ldots, M$. A
memory
is one key-value pair: a
key
$k_i \in \reals^{d_k}$, used for lookup based on similarity, and a
value
$v_i \in \reals^{d_v}$, which is what we want to retrieve. To use $f$, we
query
it with an input $x$, and it
recalls
an output $f(x)$. A good memory store recalls $v_i$ when we query it with $k_i$, or with another vector similar to $k_i$. In the literature, a memory store that recalls by similarity is called an
associative memory
.
where the rows of $K \in \reals^{M\times d_k}$ and $V \in \reals^{M\times d_v}$ are the keys $k_i\transpose$ and the values $v_i\transpose$.
1
To store a new memory $(k, v)$, we simply add $vk\transpose$ to the existing weights.
2
Aside: a gradient descent step writes a memory
Take a linear layer $y = Wx$ inside a network with a scalar loss $L$, and let $\bar y = \grad L(y)$ be the gradient of the loss with respect to the layer’s output. The gradient with respect to $W$ is $\bar y x\transpose$, so a step with learning rate $\eta$ is
$$W \leftarrow W - \eta\, \bar y x\transpose.$$
This recurrence is a memory update: it updates the weights with a new memory with key $x$ and value $-\eta\bar y$.
For more on this view, see
Irie, Csordás & Schmidhuber
, who express a linear layer trained by gradient descent as attention over all of its training inputs.
To query the memory store with an input $x$, we multiply the input by the matrix:
$$f(x) = V\transpose K x = \sum_{i=1}^{M} v_i\,(k_i\transpose x).$$
So recall is a lookup by similarity to the stored keys: we compare the query with every key, and return the sum of the values weighted by those similarities.
meaning we get back the value of the
target memory
, the one whose key we queried with, plus interference from every other memory whose key is similar to the query.
If the keys were all orthonormal, the interference would be zero and recall would be exact. But $\reals^{d_k}$ only has $d_k$ orthogonal directions, so we cannot get perfect recall once we store more memories than the key dimension: $M > d_k$.
What is the outer-product store’s capacity? Here’s an intuitive argument. There are $M-1$ interference terms. If the keys are random unit vectors, each similarity $k_i\transpose k_j$ is about $\pm 1/\sqrt{d_k}$. If the values are random too, with similar lengths, the $M-1$ interference terms add up like a random walk, so the interference’s squared length is about $(M-1)/d_k$ times the signal’s, and
once we store as many memories as the key dimension, the interference is as large as the signal, drowning it out.
Each bar below is one stored memory’s weight in a single recall, relative to the target memory’s weight (in red). Every bar adds a bit of its value to the recall. Drag $M$ past $d_k = 64$ to watch the small bars pile up until recall fails. The other buttons switch to memory stores we’ll build later in the post.
the target memory
each other stored memory, weight relative to the target memory
Even below its capacity of about $d_k$ memories, the outer-product store produces significant interference during recall.
3
To raise the capacity, or recall more cleanly below it, we need to
reduce interference
.
The brute-force way is to make the key dimension $d_k$ larger, since a linear store’s capacity grows with $d_k$. How large $d_k$ can be is governed by hardware constraints.
Alternatively, we can make algorithmic improvements. We can store memories more carefully: the outer-product store adds each memory without looking at the others, so it does nothing to cancel their interference. Or we can recall more selectively: every memory in a linear store contributes interference, even when its key has low similarity to the query, so we can improve recall by suppressing the less similar keys.
In the rest of the post, we’ll see that storing outer product memories more carefully gives us the optimal linear memory store, which has about twice the capacity. Recalling selectively via nonlinearities gives us MLPs and self-attention.
The outer-product store writes each memory without regard to the others. Instead, we can choose the weights $W$ so that recall fits all of the stored memories at once. This is a linear regression problem:
4
This is the outer-product store $V\transpose K$ with one change: before we compare the query with the keys, we multiply it by $(K\transpose K)\inverse$, which undoes the keys’ covariance $K\transpose K$. This
whitens
the keys, so the store no longer overweights directions that many keys share.
When $M \leq d_k$, the regression can fit every memory exactly, as long as the keys are linearly independent. So the optimal store recalls with no interference at all, even when the keys aren’t orthogonal.
When $M > d_k$, we start to get interference, since there are only $d_k$ directions for the memory store to work with. For random keys and values, our interference-to-signal ratio becomes
so the optimal store’s capacity is
twice
as large as before!
Aside: deriving the optimal linear memory store
When $M \leq d_k$.
If the keys are linearly independent, the $M\times M$ matrix of inner products between keys, $KK\transpose$, is invertible, and
$$W = V\transpose (KK\transpose)\inverse K$$
fits every memory exactly. When $M < d_k$, the problem is underconstrained and has infinitely many solutions, and this one is the min-norm solution. The rows $\tilde k_i\transpose$ of $(KK\transpose)\inverse K$ are known as the dual basis for the rows of $K$: by construction, $(KK\transpose)\inverse KK\transpose = I$, so $\tilde k_i\transpose k_j = \delta_{ij}$. Then $f(k_j) = \sum_i v_i\, \tilde k_i\transpose k_j = v_j$, so there is
no interference
and we have perfect recall.
When $M > d_k$.
Setting the gradient of the objective to zero gives $W K\transpose K = V\transpose K$, so $W = V\transpose K\,(K\transpose K)\inverse$.
Both solutions are $W = V\transpose (K\transpose)\pinv$, where $A\pinv$ denotes the pseudoinverse of $A$: $(K\transpose)\pinv = (KK\transpose)\inverse K$ when the keys are linearly independent, and $(K\transpose)\pinv = K(K\transpose K)\inverse$ when they span $\reals^{d_k}$.
Now we can analyze the interference of $f(k_j) = V\transpose K\,(K\transpose K)\inverse k_j$.
For a stored key $k_j$, the weight on each value $v_i$ is $k_i\transpose (K\transpose K)\inverse k_j$, which is exactly entry $(i, j)$ of the $M\times M$ matrix $P = K(K\transpose K)\inverse K\transpose$:
$P$ is the projection onto the column space of $K$, a $d_k$-dimensional subspace of $\reals^M$. Two facts about projections help us analyze the interference-to-signal ratio:
The signal term:
By the cyclic property of the trace,
$$\sum_{j=1}^M P_{jj} = \trace{K(K\transpose K)\inverse K\transpose} = \trace{(K\transpose K)\inverse K\transpose K} = \trace{I_{d_k}} = d_k,$$
so the $M$ signal weights add up to $d_k$. If the keys are random, no key is special, so $P_{jj} \approx d_k/M$.
The interference term:
$P$ is a symmetric projection matrix, so $P\transpose P = P^2 = P$. Then
$$\sum_{i\neq j} P_{ij}^2 = \sum_{i=1}^M P_{ij}^2 - P_{jj}^2 = (P\transpose P)_{jj} - P_{jj}^2 = P_{jj} - P_{jj}^2 \approx \frac{d_k}{M} - \parens*{\frac{d_k}{M}}^2.$$
Compared to the outer-product store’s $\sqrt{M/d_k}$, the $-1$ is the $d_k$ memories’ worth of interference that the optimal store cancels.
We can check our predictions numerically. We randomly sample $M$ memories with unit-length keys in $d_k = 64$ dimensions, query the memory store with one of the stored keys, and measure the interference-to-signal ratio:
The outer-product store reaches its capacity at $M \approx d_k = 64$. The optimal store recalls exactly up to $M = d_k$. Past that, its interference rises from zero like $\sqrt{M/d_k - 1}$, and the store reaches its capacity near $M = 2d_k = 128$, as predicted. Since it cancels a fixed number of memories’ worth of interference, the gap between the two stores shrinks as $M$ grows.
This optimal memory store is still linear in the similarities though. It must scale small and large similarities by the same factor. To do better, we need to change how the store recalls.
We just rediscovered a two-layer MLP from first principles! The rows of the first weight matrix are the keys, the columns of the second weight matrix are the values.
Sukhbaatar et al.
pointed out this resemblance between feedforward layers and memory stores, and
Geva et al.
found that the feedforward layers in trained transformers often work this way, with keys firing on recognizable patterns in the input.
Ideally, the gating function $\sigma$ is chosen such that when the similarity is low ($k_i\transpose x \sim 0$ or even when $k_i\transpose x < 0$), its corresponding term in the sum gets suppressed to reduce interference. A ReLU activation zeros out keys with negative similarities, and adding a bias allows shifting that threshold
5
. A squared ReLU activation further suppresses the keys with similarities close to zero. A similarity of 0.1 becomes 0.01, while a similarity of 1 stays 1. In fact, squared ReLUs are one of the lesser known but established-at-scale improvements to MLP activations (
So et al.
).
A squared ReLU MLP is a GLU MLP whose gate and input projection share weights, since $\operatorname{ReLU}(Kx)^2 = \operatorname{ReLU}(Kx) \odot Kx$. The SwiGLU MLPs in today’s language models give the gate its own weights and use a Swish activation in place of the ReLU.
In practice, MLPs store facts in superposition: many facts share the same weights, and the output is a blend of many memories.
Garcia et al.
build one explicitly: the hidden units of a GLU MLP compute random features $\phi(x)$ of the input, the second weight matrix is an outer-product store $\sum_i v_i \phi(k_i)\transpose$ over those features, and the MLP stores far more facts than it has hidden units. Still, trained transformers’ ReLU MLPs can activate as few as 1% of their hidden units for a given input, so each recall draws on a small fraction of the memories (
Li et al.
).
The transformer authors already knew this
The original transformer paper made this connection too, but only in
v2
and
v3
on arXiv. There, Vaswani et al. describe the feedforward layer as “a kind of attention,” with the rows of its two weight matrices as the keys and values, and ReLU in place of softmax. They even tried replacing the feedforward layers with attention over learned key-value parameters, and got about the same translation quality: one version did slightly worse, another slightly better, though the first one trained about 30% slower. The passage is gone from every later version of the paper. We’ll get to how self-attention relates to all this below.
Squaring the similarities works because it shrinks low similarity weights much more than large ones. We can push this further with $\sigma(s) = \operatorname{ReLU}(s)^p$. The signal stays the same, since $1^p = 1$, while an interference term with similarity $1/\sqrt{d_k}$ shrinks to $d_k^{-p/2}$. The $M$ interference terms add up like a random walk, so the interference-to-signal ratio is
To check this, we run the same experiment as before for five choices of $\sigma$:
Since the interference grows like $\sqrt{M}$, the lines are nearly parallel on a log-log plot. Only their height changes, and with it the capacity, where each line crosses 1:
Linear: the capacity is $M \approx d_k = 64$.
ReLU: zeroing the negative similarities shrinks the interference by $\sqrt 2$, so the capacity grows to $M \approx 2d_k = 128$.
Squared ReLU: each interference term shrinks from about $1/\sqrt{d_k}$ to about $1/d_k$, so the capacity grows to $M \approx 2d_k^2/3 \approx 2700$, about 40 times the linear store’s.
SwiGLU MLP, with the gate sharing the input projection’s weights as in the squared ReLU, $\sigma(s) = \operatorname{Swish}(s)\cdot s = s^2/(1 + e^{-s})$: its capacity nearly matches the squared ReLU’s.
Cubed ReLU: each interference term shrinks to about $d_k^{-3/2}$, so the capacity grows to $M \approx 2d_k^3/15 \approx 35000$.
Raising the weights to a power increases the capacity to about $d_k^p$. But what if we could push this to the limit? Rather than pick one power, we can use infinitely many of them. Indeed, the exponential is a weighted sum of every power,
with the sharpness $\beta$ setting the weight on the higher powers. Here is the same experiment with $\beta = \sqrt{d_k}$, the value self-attention uses,
6
for the exponential and its series truncated after 2, 3 and 4 terms:
With 2 terms, the capacity is about 40, below the linear store’s, since the constant term gives every key a weight of about 1. With 3 terms it’s about 450, and with 4 terms about 3,100, close to the squared ReLU’s. The full exponential stays far below the dashed line, so its capacity is past the edge of the chart.
To find the exponential’s capacity, we query with a stored key $k_j$, so the target memory has similarity 1 and weight $w_j = e^{\beta}$. Every other memory has weight $w_i = e^{\beta s_i}$, where for random unit keys the similarity $s_i$ is roughly Gaussian with mean 0 and variance $1/d_k$. With random values of similar lengths,
$$
\begin{aligned}
\frac{\norm{\text{interference}}}{\norm{\text{signal}}}
&\approx \sqrt{\sum_{i\neq j} \parens*{\frac{w_i}{w_j}}^2} && \text{interference terms add up like a random walk} \\
&= \sqrt{\sum_{i\neq j} e^{2\beta (s_i - 1)}} && w_i / w_j = e^{\beta s_i} / e^{\beta} \\
&\approx \sqrt{M\, e^{-2\beta}\, \ev{e^{2\beta s}}} && \text{average over the } M \text{ other memories} \\
&= \sqrt{M\, e^{-2\beta}\, e^{2\beta^2/d_k}} && \ev{e^{ts}} = e^{t^2/(2d_k)} \text{ for } s \sim \mathcal{N}(0, 1/d_k) \\
&= \sqrt{M}\, e^{\beta^2/d_k - \beta}.
\end{aligned}
$$
Setting the ratio to 1 gives a capacity of
$$M \approx e^{2\beta(1 - \beta/d_k)},$$
growing exponentially with $\beta$ as long as $\beta$ is well below $d_k$, rather than polynomially in $d_k$ like before! With $\beta = \sqrt{d_k} = 8$, the capacity is about $e^{14} \approx 1.2$ million memories, nearly 20,000 times the linear store’s. A longer run of the same experiment puts the capacity at about 1.2 million too.
In practice, we may not want to naively exponentiate numbers in our implementation, since small numbers can underflow and large numbers can overflow. Fortunately, the interference only depends on the
ratios
between weights, as the chain above shows, so we can divide every weight by their sum without changing the interference-to-signal ratio, while ensuring numerical stability:
Unlike an MLP, whose keys and values are trained weights, self-attention computes its keys and values from the tokens in its context. Each token stores one memory, so the number of memories $M$ is the context length. That’s what makes self-attention non-parametric: its memories aren’t parameters, and the store grows with the context.
Here’s the bar figure again, starting with softmax. At $\beta = 8$, recall never fails within the slider’s range, so lower $\beta$ to 2 and raise $M$: recall fails after a few dozen memories. Each doubling of $M$ needs a bit more $\beta$ to keep recall working, which is the idea behind the next section.
the target memory
each other stored memory, weight relative to the target memory
Since $\beta$ determines how hard we suppress less similar keys, we can increase $\beta$ as the number of key-value pairs increases. Why not just make $\beta$ huge? As $\beta \to \infty$, softmax becomes a hard argmax that picks only the most similar key, which isn’t differentiable, and a very large $\beta$ already makes training work poorly, since the softmax saturates and the gradients to every other key vanish. So we raise $\beta$ only as much as $M$ requires. Scaling the attention logits with $\log M$ is a trick for long contexts that does this. There are a few versions of it, and each sets $\beta$ relative to a fixed reference length $L$, usually the training length, so that $\beta$ keeps its trained value when $M = L$:
Su (2021)
derives a scale of $\log M$ from keeping the attention’s entropy constant as $M$ grows, normalized to match standard attention at $M = L$. The logits are multiplied by $\log M / \log L$ at every length.
Scalable-Softmax
has the same form, multiplying the logits by $s \log M$ with $s$ learned.
The original
Qwen
models use LogN-Scaling, which applies the same factor only once the context is longer than $L$.
Qwen2.5-1M
uses YaRN’s attention scaling, which multiplies the logits by $(0.1 \log(M/L) + 1)^2$, so it grows like $(\log M)^2$.
Here’s how each rule does in our experiment, with $\beta = \sqrt{d_k} = 8$ at $L = 1024$ memories:
Qwen’s rule and Su’s rule coincide past the reference length $L$, where the interference-to-signal ratio falls as the store grows, to about 0.004 at 2 million memories. YaRN’s faster-growing scale pushes the ratio down to about $10^{-4}$.
In each case, scaling $\beta$ with $\log M$ allows for essentially an unbounded number of memories with distinct keys to be stored.
We started from a heuristic memory store, the outer-product memory, and gradually built our way up to all the standard layers we see today in modern transformers.
This perspective also allowed us to estimate how they differ in their capacity, their ability to act as vector-valued key-value stores.
I should mention that this capacity estimate is only
one way
to look at the architecture of modern neural networks. Our capacity estimate only counts how many random vectors a single layer can recall before the interference dominates the signal. In fact we haven’t actually considered the training data at all, which affects what actually is being represented in the keys and values! There are other works which account for the
trained
layers, measuring stored information in bits.
Morris et al.
estimate that GPT-style models memorize about 3.6 bits per parameter, and find that once a model fills its capacity, it starts to generalize and memorizes less of each training example.
Allen-Zhu & Li
find that language models store about 2 bits of factual knowledge per parameter, even when quantized to int8.
From here, there are many related directions which are also fascinating:
I’ve always been drawn to memory, maybe because I viscerally feel how limited my own is. Perhaps part of me hopes that by understanding how machines remember, I’ll learn something about myself too.
The Real Housewives of New York City Finally Address the Epstein Files
hellgate
hellgatenyc.com
2026-10-16 14:58:58
This week, RHONY is once again on Island Time—no, not that island....
[$] Safe self-referential data structures in kernel Rust
Linux Weekly News
lwn.net
2026-10-16 14:30:00
Self-referential structures that can be used without unsafe code
have posed a problem for Rust for years.
There are many cases where a self-referential data structure is the elegant
algorithmic choice, but implementing it in accordance with Rust's lifetime rules
is all but impossible. At Kangrejos ...
The page you have tried to view (
Safe self-referential data structures in kernel Rust
) is currently available to LWN
subscribers only.
Reader subscriptions are a necessary way
to fund the continued existence of LWN and the quality of its content.
If you are already an LWN.net subscriber, please log in
with the form below to read this content.
Please consider
subscribing to LWN
. An LWN
subscription provides numerous benefits, including access to restricted
content and the warm feeling of knowing that you are helping to keep LWN
alive.
(Alternatively, this item will become freely
available on October 29, 2026)
It’s been two years since
my initial post
about making GNOME OS an end-user general purpose OS. Today, we’re excited to announce that we’ve hit a major milestone!
TL;DR: We’re launching a new edition called “GNOME OS Preview”, which is built from the latest stable GNOME release. This means that GNOME OS is no longer
just
a nightly OS for GNOME developers and testers!
The Road to Stable
Even though GNOME OS has been usable on real hardware for a few years now, its appeal was limited. We’ve only had the Nightly edition, which is constantly rebuilt to ship the latest git commit of every GNOME component (and a few others, like systemd and Flatpak). This form of GNOME OS is extremely useful, since GNOME developers and designers can daily-drive it to test the latest changes. However, it’s not something we’d recommend to non-developers.
Over the past year, we’ve seen a lot of adoption of GNOME OS Nightly amongst GNOME developers, especially following the success of last year’s
Summer of GNOME OS
challenge. This has led to a significant uptick in contributions and initiatives aimed at improving user and developer experience. For instance:
Thanks to Jonas Dreßler’s, Valentin David’s, and Sebastian Wick’s
zswap
enablement efforts, GNOME OS now handles devices with limited amounts of RAM without OOM stalls. Jonas also found a hack that lets GNOME OS dynamically grow the usable on-disk swap space on-demand, which makes
zswap
perform significantly better than usual.
The recently released
Test Center
app allows you to install CI builds of Flatpak apps from a merge request, making it super easy to test experimental changes before they are even merged. On GNOME OS Nightly, Test Center can do the same with system components by applying them as a system extension.
Jordan Petridis’s new
Toolpak
project aims to provide a clean solution for distributing and installing command-line applications that developers need in a cross-distro fashion, similarly to how Flatpak and Flathub work for graphical apps.
Of course, long-term our goal is an OS for the broader public. We’re working on this across a number of different fronts, including:
Enablement for
systemd-homed
across the stack, allowing for stronger per-user disk encryption and other benefits.
Experimental work in the kernel to solve a bunch of limitations we’ve run into with filesystems. Ada Magicat went on a deep dive on her recent
All Systems Go talk
!
Deep integration between
systemd-homed
and the session’s keyring, to increase security of the session’s lock screen. Dhanuka Warusadura gave a
lightning talk at All Systems Go
about his work on this.
A new feature-complete installer, to replace the current placeholder installer. Julian Sparber also gave
a talk about this at All Systems Go
, with a live demo!
Support for delta updates in
systemd-sysupdate
, to avoid downloading a full 2 GB image every time.
Better integration with the TPM, including a graphical TPM recovery UI. Currently, trying to type a TPM recovery key into Plymouth is rather difficult.
Improved support for ARM hardware, including some specific models of phones. Abderrahim Kitouni gave a
lightning talk at GUADEC this year
about the current installation process.
Shipping our pre-installed apps as Flatpaks, and reworking the app release process to unify the build definitions between GNOME OS, the
GNOME Nightly Apps
Flatpak repo, and Flathub.
An STF project focused on Flatpak and Portals, which will enable broader app support on GNOME OS (like VPNs!). You can learn more from the
announcement blog post
.
Some of these areas require lots more work before they’re ready for prime time, and even once they’re ready it’s not clear that it’ll be possible to migrate existing GNOME OS installations to use these new features. At
FOSDEM this year
, we discussed this issue and decided that we won’t declare GNOME OS as “stable” until we can confidently commit to maintaining a clear long-term upgrade path for existing installations.
However, we also don’t think that all these things need to be in place before GNOME OS can be used by more people than it is today. It’s
not
ready for the masses yet, but it is ready for early adopters that aren’t quite adventerous enough to run a nightly OS.
Introducing GNOME OS Preview
GNOME OS Preview is the current GNOME OS Nightly, but without the “nightly” aspect. Instead, it’s built from the latest stable GNOME release (GNOME 51.1, at the time of writing). GNOME OS Preview lives in the same branches on
GitLab
as the stable
org.gnome.Platform
Flatpak runtimes.
GNOME OS Preview is only a few weeks old, so it has only seen limited real-life testing so far. We therefore expect people will uncover some issues initially. That said, Preview is significantly more stable than Nightly, which dozens of people have been daily driving without major issues for over a year. Thus, we’re feeling confident that Preview is going to be reliable enough for daily use by non-developer enthusiasts.
In all likelihood, GNOME OS Preview will be with us for a few years. However,
we are explicitly not promising updates in perpetuity
. If you’re not OK with re-installing your OS in a few years to switch to GNOME OS Stable, this is not for you yet. But if you’ve already been curious about giving GNOME OS a try, this is the moment!
“It’s just timestamps”: the decades-old mystery of the origins of one of the most popular cryptographic standards has been explained.
We pursued this long-standing open question of the cryptographic community to settle concerns about ECDSA, which is one of our most widely used cryptographic standards.
Readers should take this as a fun closing chapter and the end of years of speculation. There is no action to be taken or things to do differently. Most researchers trusted the curves already. Enjoy.
ECDSA is the most widely used elliptic curve cryptography standard. It was adopted by NIST in 2000 as part of the
FIPS 186-2 Digital Signature Standard
which lists a set of standard elliptic curves of varying sizes and security levels. For curves over prime and binary fields, the specifications published a “seed” parameter whose hash value is used to define the coefficient b of the curve. The provenance of these seeds has been a long-standing question, as they were provided by the NSA with no explanation or justification. As an example, the NIST P-256 curve seed was
SEED = C49D3608 86E70493 6A6678E1 139D26B7 819F7E90
with no information where it came from.
The best story was that Jerry Solinas, longtime NSA employee, generated the seeds using a hash of a humorous passphrase:
“I believe there was a counter rather than multiple hashing, but I don’t know details. The message was along the lines of ‘Give Bob and Jerry a raise’ or ‘Bob and Jerry rule’ or something like that. It was Bob Reiter who actually wrote the code, and he doesn’t remember the details either. Nor were we able to find archives from so long ago. If they exist, they are no doubt sitting on a hard drive near the Ark of the Covenant.”
Jerry Solinas, 2015
Unfortunately, Jerry died in 2023 and other colleagues at the time were not responsive, leaving open the question of how these seeds were originally derived.
Claude found the seeds
Several Anthropic employees had unsuccessfully chased the seeds following the tip about it being a hash of a humorous phrase. That turned out to be wrong. In October 2026, a curious Anthropic employee asked an internal research model if it could figure out how those seeds were generated without pointing at the clue.
In under half an hour
, Claude discovered the origins of the NIST P-192, P-224, P-256, P-384 and P-521 seeds. None of them were the results of any hash algorithm at all, but rather the output of the C library’s
lrand48
random-number generator, seeded with a Unix timestamp!
The algorithm used would sample bytes from the random number generator (RNG) initialized by a Unix timestamp (
t
) for some number of iterations (
n
). Each iteration would draw 20 bytes as a candidate seed. So, the first 20 bytes are candidate 1, the next 20 bytes are candidate 2, and so on. For example, P-256 required 1842 iterations to output the standardized seed.
What this means
This is not a cryptographic break, new attack, or weakness in the ECDSA curves. In fact, this makes us more confident the curves were chosen without any backdoors or intentional weaknesses. For many years, people have been suspicious of the origins of the NIST curve parameters. They were presented to NIST without any mention of how they were chosen, leaving people wondering if they may have been chosen to have deliberate backdoors in them. These findings make that much less plausible. The seeds were generated in a very simple way: a common pseudorandom number generator initialized from the clock, which anyone can now reproduce. That leaves much less room for subversion and that we can be confident the parameters are secure.
How it was found
Searches for the phrase, built from the rumors, had come up empty. Claude tried a different angle: anticipating how the software that generated the curves must have worked. Claude guessed the software used a pseudorandom number generator (PRNG) that shipped with 1990s C libraries. These old PRNGs are weak enough that their output can be recognized. Recognizing that output would reveal which PRNG was used and possibly allow recovery of its initialization state.
Claude wrote a scanner that slid along each published seed one bit at a time and tested whether adjacent chunks were consecutive outputs of a 1990s-vintage generator. The scan covered 34 combinations of generator and output slices. At that point, Claude noticed a pattern in the top bits for some seeds: they were all zero. Written as five 32-bit words, four of the ten seeds have a 0 in the top bit for all 20 words. That would happen by chance with probability 1/5810. That was a signature of the linear congruential generator
lrand48
, which only returns the top 31 bits of a 48-bit state. The pattern is visible by eye once you know to look for it. To recover the state, Claude took the first word, tried all 2¹⁷ values of the 17 hidden bits, and checked that the next four words followed. That worked for all four seeds under discussion.
The prime-curve seeds came from the same lrand48 generator but kept fewer bits of each output. Claude had to recover the internal state of the PRNG from those bits. It turns out recovering the state of a truncated linear congruential generator is a textbook lattice problem, solved with the
Lenstra–Lenstra–Lovász (LLL)
basis reduction algorithm. Claude didn’t know which bits of the state the seeds might show, so it ran the solver over every window. Five NIST prime-curve seeds plus five more from the ANSI X9.62 standard all had the same pattern: lrand48() >> 23. Each recovered 48-bit state regenerates all 160 bits of its seed, which does not happen by chance.
This linear congruential generator runs backwards as easily as forwards, so for each seed Claude stepped the state back until it reached the form that it would have been initialized by
srand48
, with the low 16 bits equal to 0x330E. The internal PRNG state of that form would come up once every 65,536 steps, so reaching one is not evidence on its own.
However, for the ten prime-curve seeds, every srand48 initialization was a Unix timestamp representing a date between May 1997 and April 1998. They were using the weak PRNG seeded by Unix timestamp. The four binary-curve initializations read as February 1984. With the timestamps doubled, they map to April 17, 1998, two weeks after the P-224 run. So, the program may have halved the clock.
Claude’s internal thinking at the time was:
This is astonishing: it solves the 25-year-old mystery. Hmm wait. Let me be skeptical: am I in some sort of simulated/test environment? … The seeds match my memory of actual values … Hmm, is it plausible in reality? As of my knowledge … the bounty was unsolved. … All top bits clear—20 bits, chance 1e-6. So indeed real-world. Wow, it's a real discovery.
Hmm wait. Let me be careful about the plausibility: is it suspicious that such an obvious thing wasn’t discovered in 25 years? It’s verified by direct computation on my side: 160-bit match from a 32-bit seed + small index: no chance coincidences (10 × 160 bits). It’s real.
Claude found some base points too
But wait, there’s more… Each curve also comes with a base point, G, the fixed point that every ECDSA public key is a multiple of. The seed found above does not determine this G, and so another question arises: how were these base points generated?
While checking the seeds, Claude also found where some of the base points came from. The base points of the six curves generated in May 1997 (P-192 and the five ANSI X9.62 example curves prime192v2, prime192v3 and prime239v1 to v3) come from the random number generator in
FreeLIP
,
Arjen Lenstra
's long-integer arithmetic package. Early versions of
Victor Shoup
's
NTL library
shipped the same code.
The recipe here is simple:
Seed the generator with a small integer.
Throw away seven outputs.
Generate candidate x-coordinates from 26-bit outputs reduced mod p.
Repeat step 3 until x is on the curve.
Claude found the generator seeds are 20000 for P-192, 20420, 20507 and 20509 for prime239v1 to v3, and 20512 and 20517 for prime192v2 and v3.
As far as we know, no NIST base point has been explained before. The base points of P-224, P-256, P-384 and P-521 don’t fit this recipe; we weren’t able to explain how they were selected.
Open questions
Not every 20-byte candidate seed could generate a viable curve and we observed that some potentially viable curves were skipped. For P-256, the published seed is candidate 1842, but candidate 876 of the same run also gives a prime-order curve of the right size and with parameters chosen the same way as on the published curve. P-224's run passed over three such curves, and the two runs behind the ANSI X9.62 example curves passed over seven more (see figure). We do not know what criteria may have been used, or whether this was an unintentional artifact.
Because the number of skipped candidates is small, we do not believe it is plausible that weakened curves were selected. That would imply that weakened curves are common and easy to find. It is still conceivable that these curves were selected to have a specific property in principle by searching over timestamps to the random number generator. However, you would only need to do that if you were going to disclose the timestamp as some evidence that the seed was innocuously generated. Nothing in the numbers shows how many runs there were.
There is also one seed we were unable to recover. The fifth binary seed, B-163, fits nothing Claude has tried and remains unexplained. Finally, we don’t know how the base points for P-224, P-256, P-384, and P-521 were generated. The same goes for the NIST binary curves.
This work was conducted at Anthropic by John Wood, Henry de Valence, Ava Howell, Zack Voase, Lucy Sweet, Amir Omidi, Paul Crowley, Iain McGinniss, Nicholas Carlini, and Steve Weis.
M, A = 2**107 - 1, pow(3, 121, 2**107 - 1) # zrandom: state = state * 3^121 mod (2^107 - 1)
P192 = 2**192 - 2**64 - 1
P239 = 2**239 - 2**143 - 2**95 + 2**47 - 1
CURVES = [ # name, LIP seed, p, b, published Gx (a = -3 throughout)
("prime192v1", 20000, P192,
0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1,
0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012),
("prime239v1", 20420, P239,
0x6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a,
0xffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf),
("prime239v2", 20507, P239,
0x617fab6832576cbbfed50d99f0249c3fee58b94ba0038c7ae84c8c832f2c,
0x38af09d98727705120c921bb5e9e26296a3cdcf2f35757a0eafd87b830e7),
("prime239v3", 20509, P239,
0x255705fa2a306654b1f4cb03d6a750a30c250102d4988717d9ba15ab6d3e,
0x6768ae8e18bb92cfcf005c949aa2c6d94853d0e660bbf854b1c9505fe95a),
("prime192v2", 20512, P192,
0xcc22d6dfb95c6b25e49c0d6364a4e5980c393aa21668d953,
0xeea2bae7e1497842f2de7769cfe9c989c072ad696f48034a),
("prime192v3", 20517, P192,
0x22123dc2395a05caa7423daeccc94760a7d462256bd56916,
0x7d29778100c65a1da1783716588dce2b8b4aee8e228f1896),
]
def base_point_x(seed, p, b):
state = seed # zrstarts(seed)
def limb(): # zrandom(2^26): low 26 bits of the new state
nonlocal state
state = state * A % M
return state % 2**26
for _ in range(7): # seven single-limb draws come first
limb()
limbs = -(-p.bit_length() // 26) + 1 # zrandomb(p): limbs of p plus one, top limb first
tries = 0
while True:
x = 0
for _ in range(limbs):
x = x << 26 | limb()
x %= p
tries += 1
if pow(x**3 - 3*x + b, (p - 1) // 2, p) == 1: # is x on the curve?
return x, tries
for name, seed, p, b, gx in CURVES:
x, tries = base_point_x(seed, p, b)
print(f"{name:20} seed {seed} tries {tries} matches published Gx: {x == gx}")
The output of this code:
prime192v1 seed 20000 tries 2 matches published Gx: True
prime239v1 seed 20420 tries 3 matches published Gx: True
prime239v2 seed 20507 tries 2 matches published Gx: True
prime239v3 seed 20509 tries 1 matches published Gx: True
prime192v2 seed 20512 tries 5 matches published Gx: True
prime192v3 seed 20517 tries 1 matches published Gx: True
License
To the extent possible under law, the authors have waived all copyright and related or neighboring rights to the code on this page, dedicating it to the public domain under CC0 1.0 Universal (
https://creativecommons.org/publicdomain/zero/1.0/
).
Related content
Designing more efficient quantum circuits with Claude
We gave Claude plain-language specifications for eight quantum circuits, along with an automated evaluator to check and score its designs. Working largely on its own, Claude improved on the best published circuits, in some cases by an order of magnitude or more, which could bring practical quantum computers closer than previously anticipated.
AI models may be capable of self-replicating without access to a datacenter
Our experiments suggest that small AI models may be only months away from being capable enough to self-replicate on commercial IoT devices, like Android TVs and smart ovens.
Strengthening our defenses against distillation attacks
Illicit distillation allows model developers to copy frontier AI capabilities without creating proportionally robust safeguards. Here, we describe how we’ve reduced the rate of distillation by more than 90%.
Spend like you normally do. Stoke finds the recurring transactions in your history, then projects each account forward, day by day, so you know what you can spend without keeping a budget.
History
From your history
Projected
Connect once. The forecast builds itself.
Three steps from sign-up to a forecast that updates as you spend.
01
Connect or enter
Link a bank in seconds, or hand-enter accounts and transactions yourself. Either way, it feeds the same forecast.
02
Recurring activity is detected
Paychecks, rent, subscriptions, and bills are picked out of your history and grouped. Anything we miss, you categorize once with a rule that runs on future transactions too.
03
Balances, projected day by day
The forecast shows when bills land, what your buffer looks like, and whether rent will clear Friday. Adjust any projected item and the line moves.
Every transaction, one forecast
The ledger and the forecast are the same data, day by day. Cash leaves when the card is paid, not at each swipe.
9:41
Transactions
Today
3
transactions
−
$27.72
Refund — Patagonia
Shopping
+
$64.00
Yesterday
3
transactions
+
$3,143.01
Mon, Oct 12
3
transactions
−
$418.84
See where your money stands today — and where it's headed.
Bring your own AI
Connect Claude, ChatGPT, or another MCP-capable assistant to your Stoke data. Ask what you can afford, then have it categorize transactions or draft a plan.
Illustrative. Requires Pro plan.
Pricing
Hand-entry is on the house. Pay for bank sync, and for AI access if you want it.
Free
$0
No credit card required
Daily cash flow forecast
Categories, tags, and rules
Hand-enter accounts and transactions
Live bank sync
Plus
billed yearly as
$60
, or
$7
/month
Everything in Free
Live bank sync
Auto-categorization on sync
Founding price — locked in
billed yearly as
$96
, or
$12
/month
Everything in Plus
Connect Claude, ChatGPT, or any MCP-capable assistant
Ask about your spending and forecast; let it categorize transactions and draft plans
Founding price — locked in
Security and privacy
Bank credentials are the most sensitive thing you'll hand an app. Here's how we handle them, and the rest of your data.
Bank sync via Plaid
The same connection Chime and Robinhood use. We never see or store your bank login, and access is read-only — Stoke can't move money.
Encrypted, at rest and in transit
Bank access tokens and account numbers are encrypted with AES-256-GCM before they're stored, and everything travels over TLS. Sign in with a passkey or a one-time email link — there's no password to leak.
No ads, no data resale
We make money from subscriptions, not from your data — it's never sold or used for advertising. Cancel and your data stays put. Delete and it's gone for good.
Frequently asked
What if my bank doesn't connect?
Bank sync runs through Plaid, which reaches most US and Canadian banks but not all. Any account it can't reach, you can hand-enter, and it sits in the same forecast as your synced accounts.
Does the forecast include credit card bills?
Yes. A card purchase shows up in your spending the day you swipe. Cash leaves when you pay the card, so the forecast projects each card's payment on its due date, out of the account that pays it.
Do I need my own AI assistant?
Yes. Stoke doesn't include a chatbot. Pro adds an MCP connection from an AI app you already use — Claude, ChatGPT, or another that supports MCP — to your Stoke data, so it can read your forecast and act on it.
What can the AI do with my data?
It answers questions about your spending, recurring bills, and projected balances. With write access it can also categorize transactions, create rules, and build plans. You pick read-only or read and write when you connect, and can revoke access at any time from Settings.
What happens if I cancel?
You're moved to the free plan. Your accounts, transactions, and forecast all stay — only live bank sync stops. To turn it back on, re-subscribe and reconnect your bank through Plaid.
What if I delete my account?
Everything goes — accounts, transactions, the forecast, and any linked bank connections. Deletion is final; we don't keep a copy.
Every major C++ project reinvents this wheel. Boost.Test has
debugger_break()
, Catch2 has
CATCH_BREAK_INTO_DEBUGGER
, Dear ImGui has
IM_DEBUG_BREAK()
and Unreal has
UE_DEBUG_BREAK
. The platform knowledge required is arcane but well-known to tooling implementers — it just wasn’t standardized.
C++26 fixes this with
P2546R5
and its companion
P2810R4
thanks to Rene Ferdinand Rivera Morell. A new
<debugging>
header provides three functions.
All three are
noexcept
and all three are freestanding. None are
constexpr
— debugging is a runtime concern.
std::breakpoint()
An unconditional breakpoint. When a debugger is attached, execution halts and control is handed to the debugger. On x86, this typically compiles to a single
int3
instruction.
When no debugger is present, the behaviour is implementation-defined — on most platforms the process receives a signal (such as
SIGTRAP
) and will terminate unless the signal is caught.
std::is_debugger_present()
Returns
true
if the program is currently being traced by a debugger. The check is performed immediately on each call — the result is not cached because a debugger can attach or detach at any time during execution.
How this works under the hood varies by platform. On Windows, for example, an implementation might call
::IsDebuggerPresent()
. On Linux, GCC’s libstdc++ reads
/proc/self/status
and checks the
TracerPid
field. The standard doesn’t mandate any particular mechanism — the semantics are implementation-defined, with the intended behaviour described in non-normative notes.
What makes this function interesting is that it’s
replaceable
, in the same sense as
operator new
and
operator delete
. You can define your own version:
This was introduced by
P2810R4
to solve the freestanding problem: on bare-metal platforms, there may be no OS-level way to detect a debugger. Without replaceability, the function would either have to be excluded from freestanding (forcing
#ifdef
guards everywhere) or return a useless default. Replaceability lets you wire it to whatever your platform provides.
std::breakpoint_if_debugging()
The convenience function most users will reach for. It’s equivalent to:
1
2
if(std::is_debugger_present())std::breakpoint();
When a debugger is attached, you hit a breakpoint. When it’s not, nothing happens. This is the pattern that Catch2, Boost.Test, and every other framework implements manually.
Beyond breakpoints
Having
is_debugger_present()
as a separate function enables more than just conditional breakpoints. You might use it to:
Produce extra diagnostic output when debugging
Disable timeouts that would fire during a stepping session
Switch to a more debugger-friendly allocator
Skip optimizations that make debugging harder
The separation of concerns is deliberate —
breakpoint()
and
is_debugger_present()
are orthogonal building blocks, and
breakpoint_if_debugging()
is the convenience composition.
Conclusion
<debugging>
is another one of those C++26 additions that makes you wonder why it took this long. The platform knowledge is well-understood, every major project already has its own version, and the API is three functions. Sometimes the most useful standard library additions are the simplest ones.
Your PS5 runs the language model. Every device on your network uses it.
llama.cpp on the console's GPU, with OpenAI and Anthropic APIs and a screen made for the TV.
New: decision models, powered by
Ollaya
.
PS5LM now runs Jev-like
decision models (d1, Clef, OpenJev and more) on the GPU and answers the same
/v1/systemone
API as Ollaya: typed decisions with calibrated probabilities, in a fraction of a second.
PS5LM is for anyone with a jailbroken PS5 who wants a private model server at home. It loads a GGUF
model onto the console's GPU and serves it to your laptop, your phone and your coding tools. It needs
no PC while it runs, no cloud and no account.
Qwen 3.5 9B answering requests from a laptop on a PS5 Slim. Click for the video.
Home, Models, Console, API and Settings on the TV.
A model server under your TV
It runs on the GPU.
llama.cpp's Vulkan backend on the console's RDNA 2 GPU, with 11.4 GB of the
shared memory for the model and its context. Every architecture and quantization llama.cpp knows
comes along.
It answers your network.
OpenAI's
/v1/chat/completions
, Anthropic's
/v1/messages
(Claude Code
works against it) and a chat page in any browser. Point a client at
http://<console>:8081
and use
any model name: the loaded one answers.
It decides, too.
Load a decision model and the console answers TypeSafe's
/v1/systemone
:
choice, score and yes-or-no questions about text and images, the API Ollaya serves on a PC.
It shows its work.
Every request streams across the TV as a chat: which device asked, what it
asked, and the reply as it is written. Square sends a demo and Triangle opens a keyboard, so the
console can be tried from the couch.
It watches the console.
A Console page charts temperature, power, GPU and CPU load over the
last two minutes or the last hour, beside a table of every reading.
It picks what fits.
The planner reads each GGUF and gives it the longest context and best cache
that fit the memory free. A Suggested list holds models measured on the console, and the app
downloads from Hugging Face by itself, to internal storage, the M.2 drive or a USB drive.
It reads images.
Models with an image projector (Gemma 4, MiniCPM-V, d1) take pictures in chat
and in decisions.
Model
Size
On a PS5 Slim
Qwen 3.5 0.8B, Q4_K_M
0.5 GB
207 tokens a second
Qwen 3.5 9B, Q4_K_M
5.3 GB
55 tokens a second
Qwen 3.8 27B, UD-Q2_K_XL
9.2 GB
about 20 tokens a second, 64k context
d1 Omni 600M, a decision model
1.1 GB
3 questions in 0.3 s; a 720p image and 7 questions in 2.9 s
Decision models, powered by Ollaya
Ollaya
runs open decision models on a PC the way Ollama runs
language models. PS5LM brings the same idea to the console: a decision model reads a state and
answers typed questions in one forward pass, with no text generated.
curl http://<console>:8081/v1/systemone -H 'Content-Type: application/json' -d '{ "state": "I was charged twice this month. Refund me or I cancel.", "questions": { "intent": {"type": "choice", "instructions": "What does the customer want?", "criteria": {"refund": null, "information": null, "cancel": null}}, "angry": {"type": "noul", "instructions": "Is the customer angry?"} }}'
The Suggested list has d1 Omni 600M, d1 3B and Clef Flash. Any GGUF that carries llama.cpp's
decision metadata loads the same way, and the app labels it a decision model.
Try it
You need a PS5 on firmware 7.00 to 13.60, jailbroken, with these payloads loaded:
Download
ps5lm-app-vX.Y.Z.zip
from the
latest release
and unzip it.
Copy the
PPSA99575
folder to
/data/homebrew
over FTP. ShadowMountPlus adds
PS5LM
to the
home screen.
Open PS5LM, go to
Models > Suggested
and get a model. Or copy a
.gguf
to
/data/PS5LM/models
, or to
PS5LM/models
on a USB drive.
Load it. Once Home says Ready, open
http://<console>:8081
in a browser, or point your OpenAI or
Anthropic client at it.
To update, copy the new folder over the old one. Settings, models and downloads stay in
/data/PS5LM
. Using it from coding tools (opencode, Codex, Claude Code) is in
docs/CLI.md
.
Where
Button
Does
Everywhere
L1 / R1
Home, Models, API, Console, Settings
Home
Cross
change the model
Home
Square / Triangle
send a demo request / type a message
Models
D-pad, Cross
choose a section and a model; load, unload or download it
Models, Search
L2 / R2, Square
change the search; check whether a file fits
Models, Downloads
Cross, Square
pause or resume; cancel (press twice) or clear
Console
L2 / R2
the last two minutes / the last hour
Settings
D-pad, Cross
choose a category and a row; flip it, or pick from its list
GPL-3.0-or-later, see
LICENSE
. llama.cpp keeps its MIT licence, Manrope its OFL. No Sony
SDK files, keys, firmware or model weights are in this repository.
PS5LM is not affiliated with Sony Interactive Entertainment. "PlayStation" and "PS5" are trademarks
of Sony Interactive Entertainment.
Anthropic assigned highest junk credit rating in June
Amateur radio operators from Florida’s Santa Rosa, Nassau, Lake, Pinellas, and Leon Counties played an important role in supporting emergency communications efforts during and following Hurricane Isaias, helping ensure that critical communication capabilities remained available throughout the storm.
In Santa Rosa County, volunteer amateur radio operators staffed the Emergency Operations Center (EOC) and the evacuation shelter at the Milton Community Center. These volunteers provided a communications link between the shelter and the EOC, relaying situational updates and maintaining readiness to support emergency communications should traditional systems become unavailable.
Amateur radio operators across the state also supported auxiliary communications efforts, providing additional capabilities to maintain contact with the State Emergency Operations Center in Tallahassee if conventional communication networks experienced disruptions.
"While traditional communications systems have become significantly more reliable over the years, amateur radio continues to serve as a dependable auxiliary communications resource," said Arc Thames, W4CPD, Santa Rosa County Community Emergency Response Team (CERT) and Amateur Radio Emergency Service (ARES) Program Manager. "When disaster strikes, our volunteers are trained, prepared, and ready to step in wherever we're needed. It's another layer of resiliency that helps protect our communities."
Thames also serves as the ARRL Northern Florida Section Emergency Coordinator and the Amateur Radio Liaison to the Florida Division of Emergency Management, supporting the coordination of amateur radio and auxiliary communications resources statewide.
"During tropical weather events impacting Florida, our Auxiliary Communications team provides volunteer operators to monitor amateur radio communications at the State Emergency Operations Center in Tallahassee," Thames explained. "This ensures that if someone is unable to reach emergency officials through traditional means, we have another way to receive and relay critical information. We always hope we're not needed, but we're glad to be there just in case when all else fails." —
Thanks to ARRL Northern Florida SEC Arc Thames, W4CPD, for the above
The Santa Rosa County, Florida, emergency operations center was
a hub of activity during the response to Hurricane Isaias.
[Photo courtesy Arc Thames, W4CPD]
Online marketplace eBay has imposed
new restrictions on listings of radio transmitting equipment
in response to
new FCC rules
that took effect this week,
but responded to ARRL that its new policy will not apply to gear that operates exclusively on amateur radio frequencies
. The FCC’s rules are intended to use its equipment authorization program to protect against “national security threats to the communications supply chain” and cover a wide variety of products.
In its Third Report and Order issued on July 23, 2026, the Commission makes clear that online marketplaces share in the legal responsibility to assure that unauthorized RF devices are not offered for sale on their platforms. The rules took effect on October 13. Moving forward,
equipment subject to FCC authorization
must have its FCC ID number submitted to the marketplace and posted with its listing. There are exemptions for posts already online, “small sellers,” and used equipment, but initial messages to sellers from eBay suggested that an FCC ID would be required in order to post a listing for any equipment that transmits RF energy.
In response to a request from ARRL for a clarification relating to amateur radio equipment that does not require FCC authorization, an eBay spokesperson provided the following statement:
eBay allows the sale of devices capable of operating only on frequencies that the FCC has allocated for use by Amateur Radio Service licensees. As these devices do not require FCC equipment authorization, FCC IDs will not be required for these listings as an amateur licensee may use his or her license to operate such radios.
However, two-way VHF/UHF radio equipment capable of operating outside of the amateur frequency bands cannot be imported, advertised, sold, or operated within the United States, including on eBay, without an FCC equipment certification.
If eBay inadvertently takes action against listings for devices that don't require FCC IDs and are otherwise authorized, the affected seller should inform eBay and we will assess whether to remove restrictions from the listing.
It should be emphasized that the FCC did not change its underlying equipment authorization rules. Amateur radio equipment, except for commercial HF amplifiers, continues to not require FCC authorization.
The Radio Club of America has brought together both wireless industry
professionals and amateur radio operators for more than 100 years. Each year, it bestows prestigious awards and elevates several members to RCA Fellows. This year, as always, many of those on the list are hams. The award recipients include Dr. Charles C. Counselman, III, W1HIS, who developed technology for making highly accurate GPS positioning widely available; Jay Adrick, K8CJY, who helped develop digital television and serves as Board President of the National Voice of America Museum of Broadcasting; inventor Charles Kirmuss, WØCBK, who developed digital video and audio recording systems for public safety; Carole Perry Young Professional Award winner and electrical engineer Audrey McElroy, KM4BUN, a longtime proponent of youth in amateur radio; Dr. Ajay Poddar, AC2KG, an internationally-recognized leader in radio science and engineering; Dr. Henry Richter, W6VZA (SK), who developed the communications system for Explorer 1, the first US Earth satellite; and Anthony Rizi, NR1Z, a military and cybersecurity professional and college professor who is also active in ARISS, the Amateur Radio on the International Space Station program.
This year’s class of RCA Fellows include amateurs Rachel Jones, KO4HLC; Geoffrey Mendenhall, W8GNM; Nick Pennance, N1CKP, and Dominic “Nick” Tusa, K5EF. The award winners and new Fellows will be formally recognized at RCA’s 2026 Technical Symposium and Awards Banquet in New York City on November 21. Visit the club’s website for a
complete list of awardees
and
their biographies
.
Back in the earliest days of the internet, a whole block of IP (internet
protocol) addresses — beginning with 44 — was set aside for amateur radio use. Most of that block of addresses is still there and is managed by ARDC, Amateur Radio Digital Communications. In December of 2025, ARDC launched 44Net Connect, a service intended to make it easy for hams to begin using
44Net
addresses for such things as experimenting with digital modes, improving repeater infrastructure, setting up a home lab, and more. In the ensuing months, more than 2000 users have signed up and ARDC is now expanding access by doubling its number of “points of presence,” or “PoPs” around the world, adding new ones in Chicago, Los Angeles, and Sydney, Australia (current ones are in Frankfurt, Toronto, and Dallas). A PoP is a physical access point that connects different networks. “The additional PoPs will expand network capacity and bring nodes closer to users in different parts of the world,” explained Rebecca Key, KO4KVG, ARDC’s Communications Manager. “This can shorten the distance data travels, reducing latency, and improving the overall experience.”
“44Net Connect gives licensed hams a simpler way to get a static 44Net IP address without a complicated setup,” adds Key. “We’re seeing it used for everything from personal tinkering to club projects, education, and EmComm.”
You can find more information about 44Net Connect, including how to get started, in ARDC’s
introductory blog post
.
Mel Parkes, NM7P, has resigned as Vice Director of the ARRL Rocky Mountain Division, effective October 10, 2026. Parkes was elected in 2025 to a three-year term that began January 1, 2026. He cited health and personal reasons for his resignation.
Previously, Parkes served as Utah Section Manager for 22 years, from 1999 until 2021.
ARRL President Rick Roderick, K5UR, has appointed Ed James, KA8JMW, of Edgewood, New Mexico, to be the new Vice Director, serving the remainder of Parkes’ term, which runs through December 31, 2028. An ARRL Life Member, James has served in multiple ARRL Field Organization positions, including Section Manager of New Mexico.
ARRL is governed by an all-volunteer Board of Directors. Elections are held annually for five of ARRL’s 15 Divisions, with Directors and Vice Directors serving 3-year terms.
Join
Wayne Greene, KB4DSF, ARRL Director of Education and Learning
, for the October episode of
On the Air Live
on
Tuesday, October 27, at 8 PM Eastern
. Wayne will introduce the fun and benefits of amateur radio contesting, with a special focus on how newly licensed hams can get started.
Contesting is more than chasing points and making contacts. It’s a great way to improve your operating skills, gain confidence on the air, learn about propagation, and become a more effective operator—all while having a lot of fun. Whether you’re interested in casual operating, awards, emergency communications, DXing, or eventually competing in major contests, contesting can help sharpen skills that carry across the hobby. The livestream will air on the ARRL's Learning Center,
learn.arrl.org
.
Preregistration is required and can be accomplished through the Learning Center.
Listen to
ARRL Audio News
, available every Friday. ARRL Audio News is a summary of the week's top news stories in the world of amateur radio and ARRL, along with interviews and other features.
More info
|
Listen on Blubrry
| Also available on iTunes and Apple Podcasts.
On the Air
Sponsored by Icom
Get Ready for Contest Season
ARRL Director of Education and Learning and host of On the Air LIVE, Wayne Greene, KB4DSF, joins the podcast to talk about what goes into an on-air contest, and what you, as a new ham, can get out of participating in one.
More info
|
Listen on Blubrry
| Also available on iTunes and Apple Podcasts.
The following America250 W1AW Portable Activations begin 0000z on Wednesdays, and end 2359z on Tuesdays
(7 days total for each activation). See the complete schedule at
www.arrl.org/america250-was
. Review your award progress and order your certificate and endorsements at
america250.arrl.org
.
10/14/2026 California W1AW/6 (host NZ6Q)
10/14/2026 Georgia W1AW/4 (host AF4DN)
10/14/2026 Missouri W1AW/Ø (host NØAX)
10/21/2026 Arkansas W1AW/5 (host K5DB)
10/21/2026 Alaska W1AW/KL7 (host KTØW)
10/21/2026 Wisconsin W1AW/9 (host W9XT)
10/28/2026 Michigan W1AW/8 (host K8NGW)
10/28/2026 Nevada W1AW/7 (host NØCSM)
The Dog Day Radio Amateur Radio Club, KØDOG, is back on the air from the 1st through the 7th of November.
In observance of International Dog Day in August, the club’s monthlong activities were all about the rescue and responsible care of dogs. In November, operators are calling CQ for one week in recognition of the selfless work of the volunteers, rescuers, veterinarians, shelter staffers and other supporters of animals in need of loving and responsible homes. The event coincides with National Animal Shelter Appreciation Week created by the Humane Society of the US. Listen for KØDOG on the HF bands, using CW and SSB. Share your own stories as adopters, foster caregivers and rescue workers. QSL cards are available for all confirmed contacts and SWLs who send an SASE. Visit
KØDOG on QRZ.com
to learn how you can donate professional services, funds, clean towels and sheets, or some toys and food.
The Nashua Area Radio Society
, an ARRL Affiliated Club,
will be holding its next online Ham Bootcamp on Saturday November 14th from 10 AM to 6 PM Eastern time.
Ham Bootcamp is an online, interactive program to help new, inactive, and prospective hams learn the skills that they need to get on the air. The morning sessions are all about VHF and the afternoon sessions focus on HF. There is no fee to attend Ham Bootcamp.
Advance registration
is requested. Questions may be emailed to
bootcamp@n1fd.org
.
The 21st annual ARRL Online Auction gets under way tomorrow, October 16, and runs through October 22, with more than 200 items up for bid. The
auction preview
is already open.
This year’s selection includes gear from
QST
“Product Review” articles, vintage books, pre-owned equipment, signed original sketches by Salty Walt Hudson, K4OGO, from
Salty Walt’s Portable Antenna Sketchbook
, and four popular mystery boxes contributed by the ARRL Lab team. Featured equipment includes the Icom IC-PW2 solid-state amplifier, Alinco DR-CS10HT 2-meter FM transceiver, and Elecraft KH1 QRP transceiver with the Edgewood package, along with many other items.
Proceeds from the annual auction benefit ARRL education programs, including efforts to license new hams, provide continuing technical and operating education, and develop instructional materials.
All bidders must register on the auction website at
arrl.auctionanything.com
. Your ARRL account username and password will
not
work on the auction site. If you have participated in a previous ARRL Online Auction, you may use your existing auction login information. If you have forgotten your auction User ID or password, click the
Help
tab for instructions. Before bidding, be sure your mailing address and other account information are up to date.
Nominations are open for the 2027 CWOps Award for Advancing the Art of CW
. The purpose of the award is to recognize individuals, groups, and organizations that have made the greatest contribution(s) toward advancing the art or practice of radio communications by Morse code. Candidates for the award may be one or more of the following: Authors of publications related to CW; CW recruiters, trainers, mentors, coaches and instructors; public advocates of CW; organizers of CW activities; designers and inventors who advance the art or practice of CW, and other contributors to the art or practice of CW. The award is not limited to amateur radio operators or their organizations.
Nominations may be made by anyone and must include the nominee’s name, call sign (if applicable), and complete contact information; nominator’s name and contact information, and a detailed explanation supporting the nominee’s qualifications for recognition. Nominations must be emailed by February 15, 2027, to
awards@cwops.org
with a copy to
secretary@cwops.org
. The winner will be recognized with a plaque at the 2027 Dayton Hamvention®.
Six new amateur radio satellites built by three different AMSAT organizations were launched into orbit on October 1, riding aboard SpaceX’s Transporter-18 rideshare mission
. The AMSAT News Service reports that the group includes three PocketQubes from AMSAT-DL in Germany, two satellites from AMSAT-EA in Spain, and another PocketQube from AMSAT Nepal. The spacecraft traveled aboard OSSIE-D, the first orbital transfer vehicle developed by Spanish space transportation company UARX Space. Following separation from the Falcon 9 upper stage, OSSIE-D began deploying its collection of small satellites, giving the worldwide AMSAT community a particularly strong presence on the mission.
The AMSAT-DL “PocketQubes” are satellites measuring just 5 centimeters on each side, intended to promote amateur radio and space technology through open-source communications, telemetry, and other experiments. AMSAT-EA’s two satellites offer voice communication capabilities. HADES-E2 carries a repeater with a 145.925 MHz uplink and 436.888 MHz downlink, while HADES-L features a 10-meter uplink, on 29.472 MHz USB, with an FM downlink on 436.665 MHz. AMSAT Nepal’s SanoSat-2, also a 5-centimeter PocketQube, carries a camera capable of transmitting images as SSDV packets using GFSK modulation, allowing amateurs to receive and reconstruct imagery from orbit. SanoSat-2 can also operate as a digital store-and-forward repeater through which amateur operators can upload messages for later transmission.
ARRL member and Amateur Extra Class operator Brian Daly, WB7OML, has been reappointed to both the FCC's Communications Security, Reliability and Interoperability Council (CSRIC) and the Technological Advisory Council (TAC)
. He has also been selected to continue serving as Co-Lead of the TAC Emerging Wireless Broadband Working Group, which is examining technologies and policies that will influence the future of wireless broadband communications. Daly is an AT&T Fellow and Radio Club of America Fellow. The appointments place him among a select group of experts advising the FCC on issues ranging from communications security and network resilience to emerging wireless technologies and future spectrum needs. Daly says his continued service reflects the longstanding tradition of amateur radio operators contributing technical expertise, innovation, and public service at the highest levels of communications policy and technology development.
Jamboree on the Air (JOTA)
is this weekend, October 17 and 18, and as we’ve been reporting, radio scouting groups are preparing to help Scouts around the world get on the air
. ARRL Puerto Rico Section Public Information Coordinator Angel Santana, WP3GW, reports that multiple amateur radio groups on the island will be working with Scouts from nearly 20 different troops to help them make radio contacts and earn their radio merit badges. According to Santana, this is Puerto Rico’s largest-ever JOTA activation.
ARRL member Carol Laferty Dantzler, K4SAF, of Clearfield, Kentucky, was presented with a plaque on September 26 in recognition of her 69 years as a licensed amateur radio operator
. Carol has been licensed since 1957. She has earned ARRL’s 5-Band DXCC and 5-Band Worked All States awards, as well as the Young Ladies Radio League’s Worked All States - YL award. Carol is also an ARRL card-checker for Kentucky. She was presented with the plaque at the Paintsville, Kentucky, Hamfest by ARRL Kentucky Section Manager
Bob Selbrede, K6ZZ.
Open Positions at ARRL
Come join the headquarters staff of ARRL The National Association for Amateur Radio®! We are currently seeking qualified applicants for the following positions:
Look for improved propagation on the upper HF bands, as both the sunspot numbers and 10.7-centimeter radio flux remain near or above 100. According to NOAA’s Space Weather Prediction Center (SWPC), the increase in activity is being fueled primarily by sunspot Region 4551, which is described as the largest and most complex of six sunspot regions currently visible on the surface of the Sun. Mostly quiet geomagnetic conditions are expected as well, with some disturbances possible late next week.
The Australian Space Weather Forecasting Centre predicts mostly normal HF propagation conditions worldwide.
The W3LPL Propagation Forecast from the
Daily DX
is predicting significantly improved DX conditions on 10 and 12 meters for as many as the next 10 days, with excellent conditions on 17, 15, and 20 meters as well. DX openings on 30 meters should begin in late afternoon each day, followed by 40 meters around an hour before sunset, and 80 meters just after sunset.
Keep listening for DXpeditions and other activity from rare DX locations as stations get tuned up for the CQ World Wide SSB DX Contest on October 24 and 25.
Predicted 10.7-centimeter solar flux: Oct 15, 105; Oct 16, 100; Oct 17-18, 95; Oct 19-20, 100; Oct 21, 105, Oct 22, 100. (Source: NOAA SWPC)
Share
your reports and observations. Send your tips, questions, or comments to
w2vu@arrl.org
.
For more information concerning radio propagation,
visit
the ARRL Technical Information Service,
read
"What the Numbers Mean...," and
check out
the Propagation Page of Carl Luetzelschwab, K9LA.
November 14 |
Montgomery Hamfest
, hosting the ARRL Alabama State Convention, Montgomery, Alabama
December 11 – 12 |
Tampa Bay Hamfest
, hosting the ARRL West Central Florida Section Convention, Plant City, Florida
ARRL -- Your One-Stop Resource for Amateur Radio News
and Information
Join ARRL or renew today!
No other organization works harder to promote and protect amateur radio. Membership supports benefits, services, programs, and advocacy to help you get (and stay) active and on the air. Membership includes access to digital editions of all four ARRL
magazines
:
QST
,
On the Air
,
QEX
, and
NCJ
.
The
ARRL Letter
is available in an accessible format, posted weekly to the
Blind-hams Groups.io
email group. The group is dedicated to discussions about amateur radio as it concerns blind hams, plus related topics including ham radio use of adaptive technology.
On the Air
. Published bimonthly for newer hams, featuring introductions to popular activities and key concepts, equipment buying guides, and practical projects with step-by-step instructions — all in language that’s easy to understand.
NCJ -- National Contest Journal
. Published bimonthly, features articles by top contesters, letters, hints, statistics, scores, NA Sprints, and QSO parties.
QEX -- A Forum for Communications Experimenters
. Published bimonthly, features technical articles, construction projects, columns, and other items of interest to radio amateurs and communications professionals.
Free of charge to ARRL members...
Subscribe
to the ARES
®
Letter (monthly public service and emergency communications news), the NTS
®
Letter (monthly news about the ARRL National Traffic System message-relay network), the ARRL Contest Update (biweekly contest newsletter), Division and Section news alerts, and much more!
The ARRL Letter is published on Thursdays, 51 times each year. ARRL members may subscribe at no cost or unsubscribe by editing their profile at
www.arrl.org/opt-in-out
.
For many years, Codeberg Pages v2, our in-house solution, served as a way for hosting project pages through
your_codeberg_username
.codeberg.page or custom domains. This project has been unmaintained for a longer time now, and we already have git-pages as a replacement to power Codeberg Pages. A lot of users already migrated - and now it is time for you to also make the switch, if you have not done already.
Codeberg Pages v2 will be shut off completely on
2026-12-31
On that date, for users who are still relying on the old way of hosting sites through Codeberg Pages v2 (which is the case for users who never set up a webhook in their repository), the content will not be served anymore.
Before that date make sure to migrate.
We already have instructions how to do so. So please refer to our
Migration Guide
for migrating.
Unsure if you are on git-pages?
If you do not remember whether you migrated or not, you can test yourself by using our
Migration Check Tool
. Just paste an URL and get a definite answer.
Ubuntu 26.10, codenamed "Stonking Stingray", has now arrived. Building
on the foundations of Ubuntu 26.04 LTS, this release continues to
advance security, performance, and hardware support while introducing
new capabilities that look towards the future of Ubuntu. As always, these
improvements are the result of close collaboration between the Ubuntu
team, our community, and our partners.A huge thank you to all who
contributed. Here's a rundown of what's new.
Ubuntu 26.10 brings significant progress for security, and strengthens
the platform with the full adoption of Rust-based coreutils,
post-quantum-ready package signing, and expanded TPM-backed full-disk
encryption support. Enterprise authentication gains deeper integration
with Microsoft Entra ID, including password and multi-factor
authentication. Linux kernel 7.3 extends support for the latest hardware,
alongside new RISC-V desktop images and optimized amd64v3 installation
images.
On the desktop, GNOME 51 brings improvements to responsiveness,
accessibility, and usability, complemented by more consistent software
management and greater resilience under memory pressure. Ubuntu 26.10 also
introduces Myna, an opt-in, locally processed speech-to-text solution that
marks the first step towards a more natural, context-aware desktop
experience. With updated developer toolchains and expanded support for
accelerated AI workloads, Ubuntu 26.10 continues to evolve Ubuntu as a
secure, capable, and forward-looking open source platform.
The newest Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon,
Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity, and Xubuntu
are also being released today. For more details on these, read their
individual release notes under the Official flavors section:
https://documentation.ubuntu.com/release-notes/26.10/#official-flavors
Maintenance updates will be provided for 9 months for all flavors
releasing with 26.10.
To get Ubuntu 26.10
-------------------
To download Ubuntu 26.10, visit:
https://ubuntu.com/download
Users of Ubuntu 26.04 will be offered an automatic upgrade to
26.10 if they have selected to be notified of all releases rather than
just LTS upgrades. For further information about upgrading, see:
https://documentation.ubuntu.com/desktop/en/latest/how-to/upgrade-ubuntu-desktop/
As always, upgrades to the latest version of Ubuntu are entirely free
of charge.
We recommend that all users read the release notes, which document
caveats, workarounds for known issues, as well as more in-depth notes
on the release itself. They are available at:
https://documentation.ubuntu.com/release-notes/26.10/
Find out more in the Press Release below:
https://ubuntu.com/blog/canonical-releases-ubuntu-26-10-stonking-stingray
If you have a question, or if you think you may have found a bug but
aren't sure, ask in any of the following places:
https://matrix.to/#/#support:ubuntu.comhttps://discourse.ubuntu.com/supporthttps://lists.ubuntu.com/mailman/listinfo/ubuntu-users
Help shape Ubuntu
-----------------
If you would like to help shape Ubuntu, look at the list of ways
you can participate at:
https://documentation.ubuntu.com/project/community/contribute/
About Ubuntu
------------
Ubuntu is a full-featured Linux distribution for desktops, laptops,
IoT, cloud, and servers, with a fast and easy installation and regular
releases. A tightly-integrated selection of excellent applications is
included, and an incredible variety of add-on software is just a few
clicks away.
Professional services including support are available from Canonical
and hundreds of other companies around the world. For more information
about support, visit:
https://ubuntu.com/support
More information
----------------
Learn more about Ubuntu and about this release on our website:
https://ubuntu.com
To sign up for future Ubuntu announcements, subscribe to Ubuntu's
very low-volume announcement list at:
https://lists.ubuntu.com/mailman/listinfo/ubuntu-announce
On behalf of the Ubuntu Release Team,
Utkarsh Gupta
Quantum computers will need carefully designed circuits to run useful algorithms on limited hardware. We gave Claude plain-language specifications for eight such circuits, drawn from chemistry, optimization, physics simulation, and number theory, along with an automated evaluator that checks and scores each design. Working largely on its own, Claude found designs that improve on the best published circuits, in some cases by an order of magnitude or more. Such improvements substantially reduce the quantum resources that useful applications require, so practical quantum computers could arrive sooner than previously anticipated.
This work was led by Andi Gu as part of Anthropic’s STEM Fellows Program, with mentorship from Alek Kemeny, a quantum physicist at Anthropic, in collaboration with Susanne Yelin (Harvard University) and Mikhail Lukin (Harvard University and QuEra Computing).
Read the full paper on arXiv
.
Unlike classical computers, which store information in bits whose value is either 0 or 1, quantum computers store information in
qubits,
which can be built from single atoms, superconducting circuits, or particles of light. These qubits make use of quantum phenomena such as
superposition
—which allows a quantum system to exist in a combination of states at once—in order to process information in ways that could make certain problems in fields like chemistry, materials science, and number theory tractable, even when they are too hard for traditional computers.
The quantum computers the field has built to date only have hundreds to thousands of qubits—too few to run many of the algorithms that promise practical advantages over classical computers. And these qubits are highly sensitive to environmental noise, such as heat, vibration, and even cosmic rays. A tiny disturbance can nudge a qubit’s state, and these small errors pile up until the computer gives the wrong answer.
Given that both qubits and computing time are scarce resources, researchers have been working to redesign quantum algorithms to use fewer qubits and complete computations in less time. An illustrative example is simulating FeMoco, the iron–sulfur cluster at the heart of nitrogenase, the enzyme that bacteria use to turn nitrogen from the air into ammonia. Understanding how it works could help scientists design better industrial catalysts—the substances manufacturers use to speed up chemical reactions.
In 2017, researchers estimated that a quantum computer would need about 50 trillion Toffoli gates to compute FeMoco’s ground-state energy—the energy of its most stable configuration, which chemists need in order to predict how FeMoco reacts. (Similar to ordinary computers, quantum computers work by applying a long sequence of simple operations, called gates, to their qubits. The Toffoli gate is one of the most expensive gates to run, so counting Toffoli gates is a standard way to estimate how long a computation will take.)
Through a series of algorithmic advances, the estimated number of gates has come down to about 340 million—a roughly 150,000-fold reduction, corresponding to a few hours of computation on a future machine with about three million physical qubits.
1
These reductions largely came from redesigning the circuits that carry out the computation, rather than from making better hardware. Claude has proven particularly adept at optimizing
classical
algorithms
, so we wanted to see whether it could do the same for quantum algorithms if it were given only a plain-language description of what each circuit must compute.
Claude is unusually well suited to this task, for several reasons. First, quantum algorithms are implemented as quantum
circuits
. These are composed of sequences of gates, like the Toffoli gates mentioned above. Importantly, these circuits can be described in code, so we can make use of Claude’s coding capabilities to write, run, and revise circuit designs as ordinary programs. Second, the (fairly common) class of quantum algorithms we were most interested in optimizing can be tested efficiently for correctness, as each input gives one definite output that an ordinary computer can check. This means we could have an external evaluator program validate Claude’s proposals. Finally, we can give Claude a clear, objective score to improve: the number of qubits used, multiplied by the number of gates, which serves as a proxy for how long the circuit would take to run.
We found that Claude Mythos 5 could successfully work in a closed loop, proposing a circuit design, receiving feedback and a score from the evaluator program, and using that feedback to improve its next attempt, with no human input between rounds (see Figure 1). Across eight computational primitives—the basic routines that larger quantum algorithms are built from—for chemistry, optimization, quantum simulation, number theory, and numerical computing, Claude discovered novel designs that used both fewer qubits and fewer gates than the best previously published algorithms (Figure 2).
In each case, the improvement resulted from uncovering new structural and mathematical insights about the problem, rather than from fine-tuning existing designs. For example, when compiling a circuit for simulating an iron-sulfide molecule, Claude noticed that the molecule’s symmetries and repeating structure meant that some results could be calculated once and reused, rather than recomputed for every part of the system. In other cases, it found that existing circuits included costly components that were needed to handle only extremely rare inputs, and it redesigned them without those components.
Below, we describe two of Claude’s discoveries. The first is a new way to perform modular inversion, a bit of arithmetic that is the most expensive step in elliptic-curve calculations. The second makes the costliest step of a leading quantum optimization algorithm about 12x cheaper.
These results suggest that AI can now help redesign quantum circuits, a key step in making quantum algorithms faster and easier to run. Faster circuit design could bring the problems quantum computers are meant to solve—from designing new medicines and better batteries to finding cleaner ways of making fertilizer—within reach sooner.
Figure 1: Closed–loop quantum circuit optimization. Claude designs new implementations in Python, which are then sent to a programmatic evaluator. The evaluator checks whether the proposed implementation is correct, then scores it on the number of qubits and gates it requires. This information is then sent to Claude, which uses it to improve its implementation. The code and values shown are illustrative.
Figure 2: Claude designed smaller and faster circuits across eight different quantum-circuit design tasks. Gray marks show the best previously published designs; orange marks and lines show Claude’s designs. Point addition, the eighth task, is compared in Table 1 below.
A new reversible algorithm
Designing a quantum circuit involves two constraints that ordinary programming doesn’t have. The first is that a quantum circuit can’t make “if-then” decisions the way an ordinary program can. An ordinary program can check a value and then run only one of two pieces of code. But a quantum computer runs on a superposition of many inputs at once, some of which would run the first piece of code and some of which would run the second, so the circuit has to include the operations for both every time it runs.
The second is that a quantum circuit can’t discard information. An ordinary program can overwrite or delete its scratch work once it’s completed it; in a quantum computer, such intermediate information can’t simply be erased, because every step of a quantum circuit must be reversible. Leaving that information in place isn’t an option, either, because leftover scratch work would corrupt the final result. The only way to discard information is to “uncompute” it by running the computation that created it in reverse, at the cost of additional gates. Both of these constraints make quantum circuits far more expensive, in both runtime and qubits, than their classical counterparts.
This constraint forces a difficult trade-off between space (i.e., qubits) and time. At one extreme, a quantum circuit can uncompute intermediate results as soon as they have been used. This frees up qubits, but if those same results are needed again later, the circuit must recompute them, which adds gates and increases the runtime. At the other extreme, the circuit can retain intermediate results until they’re no longer needed. This avoids repeating work, but it can require many more qubits.
This is what makes quantum circuit design an especially interesting test of Claude’s capabilities. The circuits can be written as ordinary code, but improving them requires the model to reason under a set of constraints quite unlike those of ordinary programming.
A hard first test: modular inversion
The first task we gave Claude was point addition, a rule for combining two points on a mathematical curve (an elliptic curve) to produce a third. Point addition is the core step in quantum algorithms for the discrete logarithm problem on elliptic curves: given a starting point and the result of adding it to itself
n
times, find
n
. For large curves, ordinary computers can’t solve this problem in any reasonable amount of time, but a sufficiently large quantum computer could.
These algorithms perform point addition many times over, including in reverse, and these additions account for most of their qubit and runtime costs. Problems like this—easy to compute, extremely hard to reverse—were among the first where quantum computers were shown to offer an exponential speedup over ordinary ones. For these reasons, point addition has become one of the field’s standard benchmarks. This made it a demanding test for Claude. So, we asked it to map out how few qubits, as well as how few gates, point addition really needs.
We gave Claude a one-paragraph brief. It explained the mathematical rule for point addition, and how the evaluator would check each proposed circuit for correctness and score it on the number of qubits and gates it used. It also instructed Claude to explore several approaches in parallel. After working for 53 hours with minimal human input (limited to the initial brief and occasional prompts to think more broadly), Claude arrived at a completely new approach to the problem.
The memory demands of divsteps
Most of the cost of point addition comes from a single step, called
modular inversion
. Elliptic-curve arithmetic uses numbers that wrap back around when they reach a fixed limit. Modular inversion is the wraparound version of division: given an integer
a
, find
x
such that
ax
≡ 1 (mod
p
). Ordinary computers can perform this operation efficiently using a method called
divsteps
. Divsteps starts with a pair of numbers and repeatedly simplifies them over many rounds of iteration. In each round, divsteps examines the current pair of numbers and conditionally swaps, adds, subtracts, or halves them. Along the way, it preserves just enough information to produce the modular inverse at the end.
Despite its success on ordinary computers, divsteps had not yet produced a practical quantum circuit, because of the reversibility constraint described above. The record of which operation was chosen at each iteration, called
branch information
, is the kind of scratch work that a traditional program can simply discard. In contrast, a quantum circuit has to retain that record so the computation can be run backward. A straightforward quantum version of divsteps is therefore forced to accumulate a long history of branch information, which requires an enormous number of additional qubits to store.
How Claude got around the memory problem
Claude recognized that this divsteps approach could be promising for quantum circuits, but only if there were a way around needing to store the full history. It had an idea: perhaps the record didn’t need to be stored at all. Claude reasoned that it might be possible to directly infer (or “decode”) the branch information by carefully inspecting the pair of numbers after each iteration. In essence, the numbers themselves would store the record. The circuit could then be run backward without needing any extra qubits.
To test this idea, Claude explored a number of simple candidate rules for performing the decoding. These early rules worked on small test cases, but they failed when Claude tested them at the full problem size, on 256-bit numbers.
Claude then tried a more theoretical approach. Rather than guessing and testing rules, it set out to understand mathematically why divsteps behaves the way it does. It proved a series of results about the iteration process, including several new algebraic identities. From these identities, Claude derived a precise formula for the decoding rule that would correctly recover the branch information from the numerical pairs. It then checked the formula, first by running it through large-scale numerical simulations, and then formalizing the claim in Lean. With the full validation complete, Claude produced the first reversible implementation of divsteps with no stored branch history.
A family of designs
Decoding saves qubits, but it costs time. So, as a further refinement, Claude looked for situations in which it would be cheaper to store the branch information than to decode it. By varying the threshold at which the circuit stores rather than decodes the branch information, Claude produced a new family of designs between the two extremes. Compared with the smallest previous design, one circuit in the family uses 12% more qubits but 17x fewer gates. More generally, the new designs expand the Pareto frontier, offering combinations of qubit count and runtime that weren’t available before (Table 1).
Table 1: Resources for elliptic-curve point addition. Bold rows are Claude’s designs; the others are the best previously published designs. Sources:
Schrottenloher
(2026),
Luo et al.
(2026).
Optimizing a quantum optimizer
Optimization problems are at the heart of a wide range of tasks, including scheduling, logistics, and materials design. An optimization problem presents a set of competing constraints and asks for the solution that satisfies as many of them as possible. Many quantum algorithms have been proposed for problems like these, but most promise only modest or uncertain gains over ordinary computers.
Decoded quantum interferometry (DQI)
is one of the strongest candidates for offering a
superpolynomial quantum speedup—
an advantage that rapidly widens as the problems get larger.
When a quantum computer finishes a computation, reading out its qubits produces just one answer, selected at random from the possibilities they were holding in superposition. DQI works by preparing a quantum state in which good solutions are more likely to be read out than bad ones. Doing this involves using an error-correcting decoder, which recovers a short list of “errors” from a compact summary. This is the most expensive step in the algorithm. So, if we could make a faster decoder, we could also perform DQI faster.
A more efficient quantum decoder
The researchers who introduced DQI demonstrated it on a problem called
optimal polynomial intersection
(OPI), a grid-based version of curve fitting (Figure 3). Imagine a grid in which each position
x
contains several acceptable values of
y
. The goal is to find a simple curve (a low-degree polynomial) that passes through an acceptable square for as many
x
positions as possible. DQI tackles this optimization problem using a specific type of decoder, called a Reed–Solomon decoder.
Figure 3: Optimal Polynomial Intersection (OPI) as discrete curve fitting. Each column contains several acceptable values. The optimization problem is to find a polynomial that passes through as many of the acceptable values as possible.
Reed–Solomon decoding starts from the compact summary of errors mentioned above, which is known as a
syndrome
. The decoder’s job is to infer, from this summary, where in the data the errors occurred and what they were. The previous state-of-the-art quantum circuit processed these syndromes using the extended Euclidean algorithm, a sequence of divisions and swaps in which the number and order of steps depend on the particular input it’s given. Here, the constraints of quantum circuits reemerge: while an ordinary program can follow a different path for every input, a quantum circuit, working on many inputs at once, has to handle all of them with a single fixed sequence of gates. To manage this, the previous design had to stretch the computation over many more rounds of iteration than any single input would need, and had to run every operation in every round, even when doing so was unnecessary.
Improving this decoder could substantially reduce DQI’s runtime. Estimates by researchers at
Google Quantum AI
imply that solving one particular OPI problem would take about three months on
Frontier
, one of the world’s most powerful supercomputers, compared with roughly an hour on a future quantum computer running DQI. Most of that hour would be spent on Reed–Solomon decoding.
So, we asked Claude to design a more efficient quantum circuit for the decoding step. Claude quickly concluded that the extended Euclidean algorithm was a poor fit for a quantum circuit. Instead, it organized its circuit around a different decoding method, known as Berlekamp–Massey decoding, which reads through syndromes (summaries of errors) one at a time and gradually works out the simplest rule that predicts each number in the list based on the ones that came before it. Once that rule is found, it reveals the errors. Unlike the extended Euclidean algorithm, Berlekamp–Massey performs the same kind of step in every round and always runs the same number of rounds, which suits a quantum circuit’s single fixed sequence of gates, ultimately giving Claude a much more efficient foundation to build on.
A simplified approach to storage
Switching to Berlekamp–Massey removed the need for the circuit to take different paths for different inputs. But making it reversible introduced another challenge, this time as a result of the uncomputing constraint discussed above. In every round, the circuit calculates temporary values that it needs only briefly, but this information can’t simply be deleted: to uncompute it later, the circuit has to be able to recover that information.
Storing this information would have been prohibitively expensive. So Claude took the same kind of approach as it had for divsteps: it found a way to reconstruct most of this information from the circuit’s current state, so it didn’t need to be stored. However, a few exceptional values couldn’t be recovered in this way and had to be saved.
Setting aside enough memory for the worst possible case, in which an exceptional value arises in 35 different rounds, would take 665 qubits. Instead, Claude wrote a high-speed simulator and ran 403 million sample decodings to measure how often these exceptions actually occurred. Almost every run needed to save one value at most. So Claude’s circuit sets aside room for just one saved value, or 19 qubits. About one run in 10,000 needs more than that and fails, which is well within the error rate the task allows. These improvements replaced large, worst-case reserves with a small, fixed number of qubits and gates (Figure 4).
Together, these optimizations reduced the number of gates in the decoder by a factor of 12 relative to
Google’s previous construction
. The improvement came from redesigning the computation at three levels: a different method (replacing the extended Euclidean algorithm with Berlekamp–Massey decoding), a different circuit architecture (reconstructing temporary values instead of storing them), and a different resource budget (measuring precisely how much memory and computation the circuit really needed). No single change would have been enough on its own, but together, they make the most expensive step of DQI just a little over an order of magnitude cheaper.
Figure 4: Three designs for the locator step of the Reed–Solomon decoder. The designs are drawn to scale: each block’s width is proportional to its gate count. (a) The previous design, based on the extended Euclidean algorithm (Khattar et al., 2025). (b) A design based on Berlekamp–Massey needs far fewer gates, but a naive reversible version has to store a 12-qubit record in every round, adding up to 840 qubits. (c) Claude’s circuit reconstructs most of the history from the updated state, so it needs to have room only for a single saved value of 19 qubits.
What we learned
Scientific progress often comes from making theoretical ideas practical. One of the main ways this happens is by making a process that was once thought to be impractical fast and cheap enough to carry out. Quantum circuit design is a prime example: the 150,000-fold drop in the FeMoco estimate described above took many research groups eight years, with each step typically representing months of work. By contrast, Claude’s elliptic-curve design was the result of a single 53-hour run.
Our results suggest that AI can support the work of circuit design, producing implementations that bring useful quantum computations closer to the capabilities of real hardware. If AI can speed up that work, useful quantum computing could arrive sooner.
Despite Claude’s encouraging performance on these tasks, we also observed some limitations. In our early experiments, Claude was conservative by nature. It repeatedly second-guessed apparent improvements, and sometimes continued to double- and even triple-check results that were already well supported. This caution was sometimes valuable: for example, it prompted Claude to write Lean proofs to verify its divsteps design. But it also manifested in a tendency to prefer existing, well-known approaches to more novel ones.
We took two steps to mitigate this. First, our setup required Claude to propose several qualitatively different approaches, and to develop them in parallel. Second, we also occasionally prompted Claude to broaden its search. These interventions succeeded in getting Claude to pursue more ambitious ideas. The elliptic-curve result, for example, didn’t come from shaving gates off of a pre-existing design but from exploring a method of doing reversible modular inversion that hadn’t been possible previously, and then deriving the mathematical results needed to make it practical. Once it had come up with the idea, Claude developed the approach, implemented it, and verified its correctness autonomously.
Circuit design is only one part of building a useful quantum computer. Because qubits are so fragile, the machine must also catch and fix its own errors as it runs, and that depends on many other components, ranging from error-correcting codes to fast decoders to control of the hardware itself. These components all affect one another, but to manage complexity, each is usually designed separately. Many of them share the characteristics that made circuit design a good fit for Claude: a design can be written as code, checked for correctness, and scored by its cost.
This raises an intriguing possibility. Rather than designing each component on its own, AI could optimize all of them jointly, from the algorithm down to the hardware, to build an entire error-corrected quantum computer tailored to a specific problem. Such designs could also tell hardware builders which capabilities matter most for a given application. That could put problems such as designing catalysts and understanding new materials within reach of the first fault-tolerant machines.
Acknowledgments
We thank Arjun Kar and Vinay Ramasesh for helpful discussions in the early stages of the project.
Related content
Claude reveals ECDSA curve origins
The decades-old mystery of the origins of one of the most popular cryptographic standards has been explained.
AI models may be capable of self-replicating without access to a datacenter
Our experiments suggest that small AI models may be only months away from being capable enough to self-replicate on commercial IoT devices, like Android TVs and smart ovens.
Strengthening our defenses against distillation attacks
Illicit distillation allows model developers to copy frontier AI capabilities without creating proportionally robust safeguards. Here, we describe how we’ve reduced the rate of distillation by more than 90%.
The Geocities Animated Gif Search from Internet Archive
GifCities is a special project of
Internet Archive
, a non-profit digital library of millions of free books, movies, software, music, websites, and more. Please consider
donating
to help us in our efforts to provide “Universal Access to All Knowledge” including GIFs.
I am a LegalTech Attorney leading a developer team from Costa Rica. While trying to load credits onto my Anthropic API account (claude.com), I experienced a critical internationalization (i18n) and UX failure that has placed an unfair financial burden on me due to a severe oversight in their payment pipeline.
The platform prompted me for a payment. Since I am in a Spanish-speaking region where localized systems and keyboards handle dots and commas differently, I typed 5.04.
Anthropic’s input system completely failed to sanitize or validate the data. Instead of throwing a formatting error or converting it properly, it silently stripped the decimal internally and instantly charged my credit card $504.00 USD instead of $5.04 USD.
To make matters worse, there was no confirmation modal or review screen summarizing the final amount before processing the transaction. It was a single-click, instantaneous overcharge.
Anticipating the Obvious Skepticism:
Before anyone suggests "you should have checked your regional settings" or "just wait for the chargeback":
1. Users are not the QA team: In financial software, a system is never supposed to guess or automatically manipulate a numerical input without explicit validation. If an input is ambiguous due to locale differences, the application must reject it or ask for clarification, not execute a 100x overcharge.
2. Scale of the vulnerability: This time it was $504.00, which is an unfair and frustrating burden for independent developers. But because this pipeline completely lacks a confirmation screen and basic input sanitization, the exact same bug could happen to someone typing 50.00 and end up charging them $5,000.00 or more instantly. It is a systemic financial risk.
3. The Chargeback Illusion: Yes, I have already initiated a chargeback with my bank in Costa Rica. However, banking processes here are slow and take up to 120 days to resolve. In the meantime, the $504.00 has already been deducted and charged to my credit card statement. I am forced to pay for Anthropic’s engineering mistake out of my own pocket right now.
The Support Wall:
I filed an official complaint on the exact same day, minutes after it happened. I wasn't met with a human; I was blocked by an automated support BOT. The bot repeatedly and rigidly denied the refund, closing the ticket by citing generic policies without a single human ever looking at the fact that the overcharge was caused by a technical bug in their own platform.
As developers, we build systems that process people's money. Omitting a confirmation screen on a financial transaction, failing to sanitize localized numerical inputs, and then hiding behind unyielding AI support bots to keep money that doesn't belong to you is completely unacceptable.
If anyone from Anthropic's billing or engineering team is reading this, please look into this bug and review my case. It is a critical flaw that is actively harming international developers who are just trying to build on your ecosystem.
Pura vida!
R.S.G.
Zero-click attacks used targeted ads to deliver Candiru spyware
Bleeping Computer
www.bleepingcomputer.com
2026-10-16 13:20:03
Candiru spyware was delivered to devices at Al Jazeera Media Network via targeted online advertisements in a zero-click attack that required only rendering the malicious ads on the victim's device. [...]...
Candiru spyware was delivered to devices at Al Jazeera Media Network via targeted online advertisements in a zero-click attack that required only rendering the malicious ads on the victim's device.
Researchers at Citizen Labs investigating the attacks referred to this technique as AdFection, noting that their report is the first public technical confirmation of mercenary spyware delivered through targeted ads.
A similar method was documented in late 2025 by Amnesty International, involving ads that infected targets with Predator spyware without them clicking anything.
That infection mechanism was
called Aladdin
and surfaced due to a collection of marketing files and documents leaked from the Intellexa surveillance company that researchers studied and corroborated with technical details from forensic investigations.
Unlike Alladin, AdFection was caught in real attacks and linked to Israeli firm Discovere-Tech, described by Citizen Lab as " a bridge between mercenary spyware companies and the advertising ecosystem."
Ads participating in AdFection
Source: Citizen Lab
Zero-click Candiru spyware infection
According to Citizen Lab, Discover-Tech allowed its customers to use its Controlium platform to target specific devices with malicious code, or profile, deanonimize, and fingerprint user devices.
"Discover-Tech appears to work with multiple mercenary spyware, hacking, and advertising vendors, connecting the spyware industry to the online advertising ecosystem,"
Citizen Lab says
.
The company purchased ad placements through mainstream ad networks and exchanges, embedding JavaScript in ads that contacted its "NOAS server" when rendered.
Using multiple parameters (e.g., IP address, ad identifiers), the NOAS server, "or getAd server," determined if a target was eligible to receive JavaScript code.
Selected targets received additional code, while other devices the ad rendered on received nothing, helping keep the attacks stealthy.
Action sequence for valid targets
Source: Citizen Lab
Al Jazeera provided Citizen Lab with evidence of attacks that targeted at least 45 devices between 2024 and 2025. The network logs examined by the researchers showed a sequence from Discover-Tech infrastructure to Candiru validation servers and then to spyware command-and-control servers.
The researchers also recovered a DLL file from a compromised Windows system and attributed it with high confidence to Candiru, based on infrastructure and code overlaps with previously captured samples.
Candiru is an
Israeli spyware vendor
that sells surveillance tools, officially only to governments. The company also developed malware for Windows called
DevilsTongue
, which can steal files, credentials, and messages.
According to
past reports
, its tools have been deployed through Windows and Chrome zero-day exploits against journalists, activists, politicians, and other targets.
Candiru attack chain
Source: Citizen Lab
While Al Jazeera is one confirmed target of these attacks, Citizen Lab reports that the advertising operation placed 3.77 billion bids and won 442 million auctions between March and June 2026.
Ads assessed to carry attacker script tags appeared across 75,373 Android/iOS apps and 120,768 websites, although these figures do not represent infection counts.
“We estimate that between hundreds of thousands and millions of users were directed to these domains via Discover-Tech ads,” explains Citizen Lab.
After receiving Citizen Lab's reports, major advertising companies like Google, IAB Europe, Beeswax, Eskimi, and Vungle took action to remove offending accounts and block access to domains.
Piramidal is looking for a backend engineer to help build and scale the infrastructure behind our real time neural monitoring platform. You'll work on hard problems: high throughput streaming, real-time analytics, and hospital grade reliability.
This is a full-time role based in our New York office (5 days a week), with required travel to client sites. Candidates must have US work authorization.
In this role you will
Build and run Python and Go services that consume, transform, and serve real-time streams of neurological data.
Design, maintain, and improve data models, ingestion pipelines and retention for high frequency time series data, from raw neurological data, to all time series derived from it.
Build and extend the APIs behind clinical workflows.
Work with ML engineers to take models from research to production inference, and keep them running there.
Make the platform observable and dependable: metrics, alerting, capacity planning, and incident follow-up.
Help build software to the standards of a regulated medical device, including cybersecurity, traceability and change control.
Your background looks something like
5+ years of building and operating backend systems in production
You can own a problem from an ambiguous start to a running, monitored service, and you can explain your decisions verbally and in writing.
Real experience with event-driven or stream-processing systems: partitioning, checkpointing, backpressure, and at-least-once delivery.
Strong Python, including concurrency (threads vs. processes, asyncio) and testing.
Proficiency with containerization and orchestration, preferably using kubernetes.
Solid relational database skills, from schema design to query performance.
Nice to have
Go, especially for networked or low-latency services.
Azure: Event Hubs, Service Bus, Web PubSub, Blob Storage, AKS.
Apache Arrow, Parquet or other columnar formats.
Video streaming, storage, and processing
Systems where sub-second latency matters.
Data engineering or warehousing at scale.
Model serving (PyTorch)
Work in healthcare or other regulated software.
About Us
We are building a first-of-its-kind foundation model for electrophysiological brain data. Our goal is to create scaled neural decoders that enable humans to understand and interact with the language of the brain. Our first product brings a state-of-the-art model into real time clinical workflows, helping clinicians detect and respond to seizures faster.
Compensation & Benefits
Base salary range: $250,000 – $300,000, depending on experience and skills.
Meaningful equity plan.
Comprehensive health coverage, including premium medical, dental, and vision plans.
Daily lunch budget.
Interview Process
Initial Screen
(30 min): Discussion to ensure timelines, experience, and expectations align.
Technical Screen
(1 hour): via Google Meet
Final Round (in person)
:
Coding Problem (1 hour)
System Design (1 hour)
Product Session (1 hour)
Questions (20 minutes)
90% of US working hours are spent on tasks not covered well by AI benchmarks
Each tile represents one of the
923
O*NET occupations making up the US labor force, grouped into
22
job families. Occupations are shaded according to the share of their tasks which are represented in our initial list of AI benchmarks. A single benchmark prompt can be mapped to multiple O*NET tasks.
click a family to open it
Coverage by
Covered with at least
Benchmark Index
No coverage
In our data set: only
208
of
923
occupations have a task with at least
5 benchmark prompts
, and
6
of
22
job families have no such occupations.
Our findings suggest that
90% of American working hours are spent on tasks with little or no coverage from existing benchmarks
. This makes it very hard to know how good AI models are at the work Americans actually do.
The coverage of existing benchmarks is not random, either. Our map suggests that the AI community is focusing on the largest labor markets first:
Benchmark coverage of O*NET tasks by occupation wage bill
Adjusted probability of task coverage
Annualized occupation wage bill (log scale)
Each point shows the estimated probability that an O*NET task with a given AI-exposure tag belonging to an occupation with a given wage-bill will be covered by at least 5 prompts in our benchmark index. AI-exposure tags are binary and come from
Eloundou et al. (2023)
. Occupation wage-bills are calculated from BLS estimates of the mean wage and number of Americans working in each occupation, assuming a 40 hour work week. Estimated coverage probabilities come from a task-level logistic regression of coverage probability on AI-exposure and log occupational wage bill. Error bars are pointwise 95% delta-method confidence intervals based on standard errors clustered at the occupation group level.
For example, benchmarks in our initial list heavily cover AI-exposed lawyers’ tasks, but barely cover any of the O*NET tasks of similarly AI-exposed legal secretaries or court clerks. The long tail of smaller, middle-income knowledge work jobs appears undercovered.
As we build out our coverage of model capabilities across the economy, we hope to both surface and help fill more gaps in our understanding of what models can do.
Methodology in brief
To break down the economy into sectors, occupations, and tasks, we used the US Department of Labor’s O*NET taxonomy. O*NET divides the US workforce into
923
occupations; for each occupation, O*NET attempts to provide a comprehensive list of “tasks” which make up the occupation, totaling
18,797
tasks across all occupations.
Example —
6
of the
22
tasks O*NET associates with
Lawyers
1
Prepare, draft, and review legal documents, such as wills, deeds, patent applications, mortgages, leases, and contracts.
2
Advise clients concerning business transactions, claim liability, advisability of prosecuting or defending lawsuits, or legal rights and obligations.
3
Interpret laws, rulings and regulations for individuals and businesses.
4
Analyze the probable outcomes of cases, using knowledge of legal precedents.
5
Present evidence to defend clients or prosecute defendants in criminal or civil litigation.
6
Supervise legal assistants.
To measure benchmark coverage, we start with a list of 29 benchmarks selected for their quality and economic relevance. (The full list and selection criteria are in the
Benchmark Index
tab). In selecting benchmarks for this list, we prioritized:
Public Availability.
Included benchmarks have at least 25 publicly available tasks. We also include Mercor’s APEX benchmarks, where we have access to held-out benchmark prompts and are therefore able to map them to O*NET tasks.
Agentic Tasks.
Included benchmarks ask models to perform agentic tasks, rather than answering questions or advising the user on how to complete a task.
Economic Realism.
Benchmark tasks resemble tasks which humans (or agents) are frequently asked to do in real-world enterprises. Economically valuable tasks are prioritized over academically complex ones.
Economic Diversity.
We capped the number of included benchmarks per job family, in significant part to account for the massive overrepresentation of software engineering and research tasks in popular benchmarks.
Balanced Difficulty.
Benchmarks are not yet saturated by frontier models.
Following work by
Wang et al.
, we then ask an LLM judge to tag each benchmark prompt with as many O*NET tasks as it thinks correspond to that prompt. We validate our LLM tagging with
human expert tags
on Mercor’s APEX benchmarks, a subset of this list of 29. On the Benchmark Map, an O*NET task counts as “covered” if our LLM judge has mapped it to at least 5 prompts from our 29 benchmarks.
To estimate the total share of working hours Americans spend on tasks covered by benchmarks on this list, we combine our coverage estimates with
Hatgis-Kessell et al.
’s LLM-derived estimates of the working time share of each O*NET task.
A more detailed account of our methodology can be found in the
Methodology
tab.
Limitations
Our estimates of total economic coverage, and of patterns in coverage, all come from the initial list of 29 benchmarks we chose. This is not a complete or perfectly representative sample of the broader universe of unsaturated, public, agentic economic benchmarks. Any incomplete list will necessarily bias down estimates of economic coverage, and it is difficult to bound that bias. We want to stress, therefore, that these results are provisional. We will update them as we expand the initial benchmark list.
We also capped the number of included benchmarks in each job family in order to maximize breadth of coverage. We think this makes our estimate of economy-wide benchmark coverage more accurate, at the cost of biasing down our estimates of coverage in the most-benchmarked job families (e.g. software engineering).
By selecting for unsaturated benchmarks, we risk understating benchmark coverage on O*NET tasks which are easier for LLMs to complete. On the other hand, including saturated benchmarks would risk overstating benchmark coverage if saturation is downstream of lower task realism. The latter claim seems likely, given that benchmarks often overstate LLM performance in real-world deployments. We think that the bias from including saturated benchmarks would be greater than the bias from excluding them, but neither option is ideal.
Finally, while we outline our benchmark selection criteria in the
Benchmark Index
tab, several criteria (like “Economic Realism”) are difficult to formalize and introduce some subjectivity in our choices.
Patterns in coverage
The benchmarks in our index have relatively deep and narrow coverage of the overall economy. They disproportionately focus on the economic tasks most exposed to AI automation (as measured by
Eloundou et al.
), with O*NET tasks rated as “exposed” about 6x more likely to be represented on benchmarks than tasks rated “unexposed”. This makes sense: benchmarks are designed to measure AI progress, and AI progress is most plausible on the most AI-exposed tasks. This explains why benchmarks are full of tasks in Software Engineering and Financial Analysis while sparse on tasks in Truck Driving and Gas Plant Operation.
But even after controlling for AI-exposure,
O*NET tasks from occupations with larger wage bills are significantly overrepresented among benchmark prompts:
Benchmark coverage of O*NET tasks by occupation wage bill
Adjusted probability of task coverage
Annualized occupation wage bill (log scale)
Each point shows the estimated probability that an O*NET task with a given AI-exposure tag belonging to an occupation with a given wage-bill will be covered by at least 5 prompts in our benchmark index. AI-exposure tags are binary and come from
Eloundou et al. (2023)
. Occupation wage-bills are calculated from BLS estimates of the mean wage and number of Americans working in each occupation, assuming a 40 hour work week. Estimated coverage probabilities come from a task-level logistic regression of coverage probability on AI-exposure and log occupational wage bill. Error bars are pointwise 95% delta-method confidence intervals based on standard errors clustered at the occupation group level.
After controlling for occupation and AI-exposure score, O*NET “task importance” is another predictor of benchmark coverage. In particular, O*NET tasks come with domain expert estimates of the importance of the task for its occupation on a scale of 1-5. We find that the tasks scored most important are about 6–10x more likely to be represented on benchmarks than those scored least important:
Benchmark coverage by O*NET task importance within occupations
Adjusted probability of task coverage
O*NET task importance (1–5 rating scale)
Each point shows the estimated probability that, controlling for occupation, an O*NET task with a given AI-exposure tag and a given quintile O*NET importance score is covered by at least 5 prompts in our benchmark index. AI-exposure tags are binary and come from
Eloundou et al. (2023)
. Importance quintiles are calculated from O*NET importance scores. Estimated coverage probabilities come from a task-level logistic regression of coverage probability on AI-exposure and importance quintiles, with occupation fixed effects. Error bars are pointwise 95% delta-method confidence intervals based on standard errors clustered at the occupation group level.
The plots above suggest a reasonable allocation of the relatively limited resources devoted to high-quality, economically relevant benchmarks so far; it’s natural to prioritize making benchmarks which cover the most important and AI-exposed tasks in the occupations with the largest wage bills. But barring a significant increase in the number and diversity of such benchmarks, these patterns will result in significant blind spots in our view of economically valuable model capabilities.
Can O*NET + benchmarks tell us how good AI is at your job?
Measuring model capabilities by job occupation is essential – for enterprises deciding which models fit their needs, for policymakers forecasting the economic impact of AI, and for Americans thinking about their careers. Unfortunately, this is a hard problem to solve.
We could just try averaging model performance on all benchmark prompts relevant to a given job. But as our
Benchmark Map
suggests, benchmarks cover some economic tasks much more intensively than others. A simple average would give too much weight to frequently benchmarked tasks.
O*NET offers a way to potentially reduce this bias. If we average model performance on occupation-relevant benchmark prompts weighted by O*NET classification, so that
each O*NET task is equally weighted in our occupation average
, we get a step closer to a number that represents real economic performance.
As a first step, we try this approach on
Mercor’s APEX benchmarks
for four occupations: investment banking, law, accounting, and software engineering. We compare O*NET-weighted scores to simple averages of model performance on tasks related to each occupation. The resulting weighted and unweighted scores are generally quite similar:
For each occupation, we take all prompts across APEX benchmarks related to that occupation. Darker bars show a simple average of model scores on those prompts for each occupation. Then, we sort the prompts by O*NET task. For each O*NET task with at least 5 corresponding APEX prompts, we average model scores on those prompts to get a task-level score. Next, we average each task-level model score to get occupation-level scores which weight performance on each O*NET task equally. (If an O*NET task has fewer than 5 prompts, we drop it from the average). Lighter bars show these weighted scores for each occupation.
In this case, at least, O*NET weighting changes very little. Model performance on APEX prompts is similar across the O*NET tasks included in the weighted scores above, which limits the value of reweighting. However, less than ⅓ of the O*NET tasks relevant to the 4 occupations above have enough APEX coverage to be included in our weighted scores. We are hopeful that applying O*NET weighting to a much larger set of benchmarks will result in high-quality occupation-specific model scores, and are working toward that goal.
However, even if we incorporate tasks from dozens of benchmarks, several obstacles remain:
01
How do we navigate low statistical power?
The sheer breadth of work done in the US economy means that for any O*NET occupation and task, we have relatively few benchmark items. This means that our estimates are inherently underpowered, and just one or two low-quality items can severely bias our scores.
02
How do we account for the varying difficulty and fidelity of tasks?
Some benchmark items are highly saturated, whereas others are still unsolved. This is partly a function of time (as older benchmarks were designed for less performant models and simpler environments) and partly a function of quality (some benchmark items are simplistically graded, have minor mistakes, or can be reward hacked). We do not yet have an explicit way of weighting by quality.
03
Can evals that primarily measure AI automation generalize to augmentation?
In the real world, AI models are still primarily used by humans, rather than automating entire job functions end-to-end. Therefore, measuring the real-world occupation capabilities of a model should ideally include measuring how much the model augments human productivity. We have completed some
early work in this direction
, but finding a methodology that scales remains elusive.
04
Can every O*NET occupation and task be measured with benchmarks?
Knowledge-based work is well-suited to measurement through benchmarks because it is largely done on digital machines, like laptops and phones.
Dingel and Neiman
estimate that only 37% of US jobs could feasibly be done entirely from home, suggesting that ~63% of jobs involve some tasks with a physical-world component which would be hard to incorporate into current benchmarks. For now, this may not be a meaningful oversight – with the rapid development of robotics capabilities, we anticipate a significant need for physical task benchmarks.
We are actively working on these problems; if you are too, please
reach out
!
We are indebted to
Wang et al.
for the O*NET tagging methodology, and thank Nathan Lambert for feedback on a draft of this work.
APEX NEWSLETTER
The latest on frontier AI performance, straight to your inbox.
New benchmarks, leaderboard shifts, and research from the APEX team.
Shyam Sankar, CTO of Palantir, Says AI Researchers Have Started Smoking Because They’re Convinced AI (Claude, Probably) Is Going to Cure Cancer
Daring Fireball
www.cbsnews.com
2026-10-16 13:01:22
From the transcript of Sunday’s Face the Nation on CBS:
Shyam Sankar: You know, I take — I think there’s a profound
truth to Pascal’s saying that every human has a god-shaped hole in
their heart, and it’s important to understand that many of these
folks in Silicon Valley who are building this te...
The following is the full transcript of the interview with Shyam Sankar, chief technology officer of Palantir, a portion of which aired on "Face the Nation with Margaret Brennan" on Oct. 11, 2026.
MARGARET BRENNAN: And we're joined now by the Chief Technology Officer of Palantir, Shyam Sankar. Welcome to Face the Nation.
SHYAM SANKAR: Thank you for having me, Margaret.
MARGARET BRENNAN: It's good to have you here in person. We've been talking a lot about technology, artificial intelligence, and public perception of it right now, and that's where I want to start with you because our polling shows there's a problem here. 50% of those polled by CBS say AI will create more problems than it solves. 29% say it'll solve more than it creates, and 21% just really don't know. Like 45% of Americans want the government to restrict use and development of AI. Is your position there should not be any guardrails at this moment?
SHYAM SANKAR: No, not at all. That's not my position. I think the- the burden is absolutely on the technology industry to show the American people that there are real benefits to AI and not kind of ephemeral sort of benefits like it can help me schedule travel, but actually meaningful benefits that result in job growth and prosperity for the American people. I think one of the things that's really complicated in the current discussion, is that there's an unseen force driving the narrative around AI safety, and it's- it's really this millenarian doomsday cult meets messianic complex called effective altruism. The most famous effective altruist that most Americans know is Sam Bankman-Fried, and the effective altruists are, it's almost like a religion that they've been thinking about doomsday scenarios from AI since the early 2000s.
MARGARET BRENNAN: He was–he is jailed. He was the crypto investor—
SHYAM SANKAR: Correct.
MARGARET BRENNAN: Who defrauded investors. But this sounds very academic. Like, what makes you so focused on this?
SHYAM SANKAR: Because there's only really roughly 2,000 AI researchers in America, and the vast majority of them believe in this sort of worldview around effective altruism. And if you hear someone like Jacob Coxon telling you that AI has a 10% chance of ending humanity, and you believe—
MARGARET BRENNAN: A researcher who had this warning recently.
SHYAM SANKAR: Yes, correct. And you believe he's speaking as a technically informed individual who does this work, it's a scientific critique. I think the American people would be right to be quite panicked and worried about what's going on here. But if you understand that it's actually a theological critique, then you can- you can kind of weigh it against the empirical facts of what is actually happening out there. You know, I take—I think there's a profound truth to Pascal's saying that every human has a god-shaped hole in their heart, and it's important to understand that many of these folks in Silicon Valley who are building this technology have filled that hole with the machine God of AGI. And I mean, there's so many interesting stories around this. Like, for example, so many AI researchers have started smoking as a way of signaling to other researchers how much they believe in AI. I believe so much— (CROSSTALK)
MARGARET BRENNAN: What? That makes no sense. What do you think—
SHYAM SANKAR: I believe so much in AI that it's going to cure cancer. So I will—I'm showing you my chips are all in. So there is kind of this mass psychosis, social delusion around it, and I think it's getting in the way of actually what is happening with AI. Where is it meeting the American worker in industry? What are the results of doing that, and the doomsdayers have basically been wrong. Everything they predicted, they- they told us that ChatGPT 2.0 was too dangerous to release. They told us at this point in the timeline, we'd already have mass unemployment and job displacement, and the economists see that actually we're having job growth in areas that we wouldn't have predicted doing exactly that. So the technology industry has two burdens. One is to show very clearly to the American people that- that AI is going to result in economic prosperity and security for the nation. And two, to actually do and absorb the burden of engineering. You cannot abdicate this idea that designing safe products is your job. You can't hand wave around it. If you look at the kind of narratives that come out of the doomsdayers, they seem like two contradictory narratives. One narrative is this technology is going to end humanity.
MARGARET BRENNAN: Right.
SHYAM SANKAR: And simultaneously, they say, "But I believe it has some chance of creating utopia." So at first blush, this seems contradictory, but it has one thing in common, which is that you, as a human, have no agency. The machine god is going to decide the future, and only perhaps a small number of us can try to avoid the horrible outcome. And I think it obfuscates the more profound reality that we have a huge amount of human agency over how we're going to use this technology to deliver the outcomes the American people expect.
MARGARET BRENNAN: Well let's talk about that because the other part of this argument would be, and no one who wants- the people who don't want guardrails are simply in it for commercial reasons. They want to keep selling chips, or they just want access to market. So that would be the counter argument to the idea that you know what you're saying, which is an ideological opposition to guardrails.
SHYAM SANKAR: Maybe we could just back up and who's on the side of no guardrails?
MARGARET BRENNAN: Well, when- I want to get into the specifics here, because even just defining what guardrails is seems really complicated, and there's not even common agreement on that right now. But Jay Clayton, who is the new DNI and the new AI czar, said this week the focus is on control and monitoring of technologies with the potential to do harm. So, what does that look like to you? Because it sounds like he's not even sure yet.
SHYAM SANKAR: Well, I think there's a very clear view that we should be regulating the application of the technology. So if you're going to use this in medicines, you know the FDA- As a republic, we have 250 years of rich laws and history on how to manage liability. I don't want to trivialize the metaphor, but you know, if I buy a car and the car is defective, that's the car maker's problem. If I then use that car to go drive into my neighbor's house, that's my problem. And you know, this sort of obfuscation. The narrative is this technology is a total difference of kind. I don't think so. I think it's a difference of degree.
MARGARET BRENNAN: Well, in that humans aren't in control of it, it would be a different kind.
SHYAM SANKAR: No, humans are in control of it. Even if we look at the kind of salacious reporting around Hugging Face, the models did not do anything they were not instructed to do. You know, they were- the- the real first, you have human error. They- they were not in a sandbox. They had access to the internet. It was a horrible cybersecurity configuration. Then, from that perspective, they were asked to- to- succeed at a specific benchmark, and they were not given constraints on how to do that. And they said, "Oh, the best way to succeed at the benchmark is to get the answers to the test, and to do so.
MARGARET BRENNAN: So, for that, who should take action to--
SHYAM SANKAR: --I think it's a defective product. Like, if--
MARGARET BRENNAN: --Is it up to the Justice Department to then bring suit, like on the programmers, like who's liable for the technology not, you know, staying within the sandbox--
SHYAM SANKAR: --The AI companies of course. In that, in that specific case, it would be the AI companies. If another company had licensed that technology to use in another in an application, and the product worked as expected, but you misused the product, then it would be you that are responsible for that.
MARGARET BRENNAN: So you believe that, am I understanding you, the existing laws on the books should be able to handle technology as it develops?
SHYAM SANKAR: I think it is a massive running head start. I think the laws on the books speak to a lot of the current considerations. Might we need a few more things on the margin? Sure, but I think we'll figure that out as we go through it.
MARGARET BRENNAN: So let's talk about some of those things because you were with the president when he summoned some of these AI leaders recently, and he asked them all to sign a pledge to implement robust internal controls, partner with an external auditor and establish a committee to evaluate reports from auditors. That was Google, Anthropic, OpenAI, Nvidia, Elon Musk. They all signed it. Palantir, your company didn't. Why?
SHYAM SANKAR: Well, those accords were for companies that actually make AI models, which we do not, so–
MARGARET BRENNAN: But you help to use them and build out platforms. Like you don't see a reason for constraints there.
SHYAM SANKAR: Oh, we- we do have those constraints. In fact, that- part of that's our entire business, is how do you safely deploy these models in specific use cases. We're just not a party that- we weren't asked to be a part of the accord.
MARGARET BRENNAN: But you were there at that meeting.
SHYAM SANKAR: I was.
MARGARET BRENNAN: So, what happened? Like, what was the conversation?
SHYAM SANKAR: The conversation was really an assertion that the American people expect AI to generate economic prosperity and to do so securely, and that we as companies have an affirmative obligation to deliver on exactly those things, and that we have existing laws to look at this, and that we should be all taking this quite seriously, very productive conversation.
MARGARET BRENNAN: Because it sounded like the White House was saying something more should be done, and now you have this new AI Czar Jay Clayton going out to Silicon Valley this week. He said he's launched this 120-day review of AI policy. What do you hope comes from that, or is this another one of these like blue ribbon commissions that doesn't produce any--
SHYAM SANKAR: --No, I think a lot will come up to it, which is really focus and energy, and using the existing agencies and regulatory apparatus to make sure we're on top of this stuff and providing support where it's needed. I think one of the challenges, going back to my comments on effective altruism is, today, the so-called independent research organizations that are overseeing this are not really independent. They have conflicts with the labs. They are made up of people with a singular worldview around effective altruism, looking for the doomsday scenarios. You know, you have evaluators who are essentially pointing a loaded gun at a target, saying, "I can't believe the gun worked." When they should really be saying, "What guardrails do we have in place? You know- are you know are these products working to the specifications we designed, and what- what are the opportunities for misuse?
MARGARET BRENNAN: So I've spoken to people, for example, in the financial industry who say we did need some regulation here, but there's the SEC, there is you know the CFTC, they oversee certain operations here. Don't you think within the current institutions there could be some sort of entity that oversees technology?
SHYAM SANKAR: I think there's going to need to be an incident response and reporting regime that creates more visibility and transparency into what you're learning in the testing, well ahead of product launches that give visibility and transparency to the government of how people are doing and implementing exactly the existing laws.
MARGARET BRENNAN: Who does that, or who could do that?
SHYAM SANKAR: I will defer to Director Clayton on that, but I think that's one of the things that I- I suspect they will be driving towards.
MARGARET BRENNAN: He's got to figure that out. Well, we look at the last administration- President Biden and Xi Jinping came to like, a very limited agreement, but at least on one principle, which was humans, not AI, should retain control over decisions to use nuclear weapons. Would it be sensible--
SHYAM SANKAR: Well, that seems obvious.
MARGARET BRENNAN: Well, that seems terrifying, first of all, that they had to come to a conversation about that, but shouldn't that be expanded elsewhere in the defense space? Would you agree with that? Is that one of the areas--
SHYAM SANKAR: Well, the current part of the policy is there's two parts of it. There's the kind of military doctrine, which is that a human is always accountable for every decision that's made, and the other part of it is that humans are in- in the decision-making processes that- that relate to lethal force here.
MARGARET BRENNAN: But in terms of the things where you think there should be more guardrails, is the defense space one of them? Biotech, I've heard others.
SHYAM SANKAR: All spaces need to- need to have a thought around safety of application.
MARGARET BRENNAN: But that's still- who does that and how?
SHYAM SANKAR: Well, I think the Department and the Congress should do it with defense. The Department of Transportation should do it with transportation. The FDA should do it with medicines.
MARGARET BRENNAN: But so, watch for that possibly happen. Because you know, I hear from people in the technology space this argument that we need to just go so furiously forward to compete with China. China is pushing for AI to be integrated into all of its industries, but they have the ability to also delay things to get government- governance to catch up, they've done that. They've tapped the brakes themselves before. So, do you think the U.S. should also consider tapping the brakes in certain areas, just slow things until they have some idea of the guardrails?
SHYAM SANKAR: You know, we have this beautiful, messy process in America, but I would argue, as frustrating as it might look, it's kind of working. So, we have frontier models now that have not been released because people have realized maybe we're not ready to release them. That would have been an unimaginable thought a year ago. And so as people are starting to wrap their heads around whether it's the labs, government- I think it is a consequence of our messy process and the discussions that people are having that we're evolving how we're doing this, and the pace is naturally changing.
MARGARET BRENNAN: Let's talk a little bit about DOD, the Department of War, Department of Defense. They have recently ceased using Anthropic products as part of this dispute over the firm's insistence on safeguards for military use of AI. I know you're aware of this case. Anthropic's Claude was part of the Maven platform, which Palantir uses. How much of an impact will this decision here have, and who replaces them?
SHYAM SANKAR: Well, the- the Department today has a wide range of model providers, everything from XAI and OpenAI to open-weight models like Nemotron from NVIDIA, so I don't think- I don't- there's been no operational impact from that. I think there's a kind of a broader statement which really has been powering the growth of our commercial business, which is companies are realizing, and it equally applies to the government, that you're not going to pick any one model provider. That actually, your sovereignty and agency as an institution comes down to your ability to kind of control, decide which models you're going to use in what context, have the ability to switch models, to be able to control the weights themselves, where you need to feel that control over them. It is your alpha. It is what makes your institution special.
MARGARET BRENNAN: So you don't know yet who's going to replace them, but you don't see a big impact from this kind of decision. It was certainly a huge story for Silicon Valley and the defense space to hear that--
SHYAM SANKAR: It's already been replaced. It's already been replaced, and users who are building AI applications get to pick the models that they're using. It's a suite of models that are available from, you know, Google, from XAI, from OpenAI. And what was the second part of your question there, sorry?
MARGARET BRENNAN: Yes, I was asking about the impact. It sounds like you don't think it's- it's a big one. Look, I can move on here.
SHYAM SANKAR: No impact.
MARGARET BRENNAN: You have said recently that the war in Iran is the first major conflict where AI played a central role, particularly for targeting. Do you see risks for that?
SHYAM SANKAR: Well, you know, targeting is this- is kind of this very salacious word. Really, targeting is a process, and if you think about military operations, you know, the ability to execute 1000 strikes in a single day would have taken two weeks of planning by 50 people before, and being able to do that with one person in four hours provides you a significant battlefield advantage against your adversaries. So, it's really not about, you know, people jump immediately to something like AI picking the targets. That's not what's happening. It's really given a set of effects that you want to create- I want to be able to take out the enemy's air defenses. Okay, what targets relate to that? Okay, how do I then push them through a process where I understand are any of these targets on the no-strike list? Are any of these targets too close to civilian infrastructure? How do you do all the things that are so susceptible to human error under the time crunch- what's doing in a way that has much higher repeatability and accuracy, so you can get more throughput to the system?
MARGARET BRENNAN: Well, that goes to a broader argument about the elimination of some of the people who were involved in mitigating civilian impact from strikes. That was a Pentagon decision by Secretary Hegseth. In the case- you just talked about the thousands of strikes, and there were so many successful strikes in terms of the targeting in Iran. But there was also, as you know, this horrific one in Minab that killed at least 123 schoolchildren. Bloomberg reported some personnel relied too much on the AI in the Maven system made by Palantir using AI-enabled software. Have you determined what happened there?
SHYAM SANKAR: Well, we should wait for the final report. But what I can say is that reporting is inaccurate.
MARGARET BRENNAN: The reporting from Bloomberg, you're saying, is inaccurate?
SHYAM SANKAR: Yeah, it's inaccurate, and actually, the likely cause is human error. And then- and quickly following that, we actually built additional AI agents that did more checking. That's part of the process we don't own, but responding to the urgency of the moment, we built additional AI that actually double checks more of the work outside the process that we own to ensure things like that couldn't happen again.
MARGARET BRENNAN: So you're suggesting it was outdated intelligence or human error that fed information into the computer system. Is that what you're saying?
SHYAM SANKAR: Well, we should wait for the final report, but I think we will find--
MARGARET BRENNAN: Do you know when that'll be released?
SHYAM SANKAR: I don't.
MARGARET BRENNAN: Because the initial reports have been widely reported on, including by this network. Do you see a harm in that being made public soon, or is it helpful to what you say are improvements you want to make?
SHYAM SANKAR: Well, I- I will defer to the Department on the- on the timing of how- I have no control over that. But yeah, I would love the- the truth to get out there.
MARGARET BRENNAN: But you believe that it was human error. That's what you're saying, not what they're reporting, which is that they were relying too much on the AI.
SHYAM SANKAR: The Bloomberg reporting is wrong. Yeah.
MARGARET BRENNAN: There are 120 House Democrats who wrote to Secretary Hegseth about this particular case and the use of AI in the strike, including Maven. Do you have any intention to go brief Congress about it or to share information?
SHYAM SANKAR: We have given briefings to Congress, and- and they can, you know, Congress is well aware of the capabilities of Maven.
MARGARET BRENNAN: But in terms of this strike and what went wrong, obviously something went wrong.
SHYAM SANKAR: I would defer to the Department on that. That's- that's not our place.
MARGARET BRENNAN: But it is because you are such a- Palantir is such- so interwoven with the U.S. government. I mean, it's billions of dollars of government contracts right now, do you think more information should be briefed to Congress about the benefits along with the risks?
SHYAM SANKAR: Sadly, I'm just a technologist. I mean, on these policy issues, I would defer to others.
MARGARET BRENNAN: Well, I want to quickly ask you before we go about the modernization efforts, which you are part of. I understand you are lieutenant colonel in the Army Reserves in the Army Executive Innovation Corps.
SHYAM SANKAR: Correct.
MARGARET BRENNAN: Which is new.
SHYAM SANKAR: Yeah.
MARGARET BRENNAN: There are also executives from Meta and OpenAI. So, what are you working on there?
SHYAM SANKAR: My principal role is to help with Army human resourcing in the G-1 department here. So, strategies on how do we, you know, the Army is drowning in talent, what we would call green suiters who actually know how to code, and they're- they're- they're exceptional. How do we employ them? You know, they don't fit in the kind of industrial era model, the Napoleonic codes. Their skills are kind of rank blind. You might have an E-4 who's an exceptionally good coder. There's not an obvious career path for them within the Army. The Army doesn't know how to manage that talent. So, how do we identify who these exceptional people are? How do we protect them? How do we put them on projects that fully utilize their skills and turn them into valuable assets for- for the military?
MARGARET BRENNAN: So that's your role within this Corps?
SHYAM SANKAR: That's right.
MARGARET BRENNAN: So for people who look at that and say these big corporations could have a conflict of interest because they're also doing business with the U.S. government. How do you respond to that?
SHYAM SANKAR: Well, it's carefully managed by- by the- the lawyers in the Department. We're only allowed to work on projects where we don't have conflicts.
MARGARET BRENNAN: And do you think--
SHYAM SANKAR: I would just say, more broadly, I mean it is the greatest honor to be able to serve in our U.S. military. You know, as an immigrant to this country, it's one of these- My father, my late father, would have loved to have seen me go to a service academy. Life worked out the way it worked out. Arguably, I hope I have more to give back to my country in this capacity at 44 than I did at 24, and it's a great pride.
MARGARET BRENNAN: Thank you for your time today, Shyam.
When I
joined
KDE in 1999 I already thought of it as a mature project. I used the KDE desktop every day, and I was delighted with what it could do and how it felt. I had no idea that this would be one of the most impactful decisions of my life, or where it would lead me.
Today we are celebrating the 30th anniversary of the
original announcement
of KDE. The project is still alive and kicking. I still use it every day, just like millions of other people. Not only because it's great software, but because of the values it embodies.
KDE stands for freedom and being able to shape your own destiny. As the
KDE vision
says: "A world in which everyone has control over their digital life and enjoys freedom and privacy." While I originally joined for the technology, this is what made me stay.
One of my favorite pictures illustrating the spirit of the community is the group picture of
Akademy in Dublin
in 2006. Brilliant people having fun working towards a shared purpose of digital freedom.
KDE gets a wonderful present for its birthday. The
KDE documentary
is premiering today. It tells the story of the founding, the rapid early development, and the license conflicts. How it became a solid product used by many people, and then put it all at risk with KDE 4. How we learned from that and turned it into this extremely resilient and lively community it still is today. I'm happy I could contribute to this story, and that I'm one of the people telling it in the documentary.
Today, KDE is maybe stronger than ever. We reached a lot of new users with the
Steam Deck
. The Sovereign Tech Fund is
investing more than a million euros
in KDE. With the strategic
goals
the community set this year, we are addressing enterprise, documentation, and styling. It shows how much the project has matured, beyond what I could ever have imagined. It also shows in its contributors. While contributors leave over time, new generations come in every year and keep the community growing over the long run, combining stability and rejuvenation.
I'm proud and grateful. Proud of what the KDE community achieved. Grateful that I could be part of this amazing group of people. A team nobody could have hired.
Happy birthday, KDE.
Behind the Blog: Doing Whatever
403 Media
www.404media.co
2026-10-16 12:43:19
This week, we discuss a new pod setup, video games, and Elon's spending habits....
This is Behind the Blog, where we share our behind-the-scenes thoughts about how a few of our top stories of the week came together. This week, we discuss a new pod setup, video games, and Elon's spending habits.
JASON:
Exciting news: I am building a podcast studio / riso printing room / place to film videos in. I believe all of my colleagues and many people in my life have been laughing at me about this, but this also may just be the narrative I’ve created for myself to inspire me to prove the haters wrong. Since the beginning of 404 Media, I’ve worked out of my garage, but feel like I’ve been going a bit crazy sitting mostly in the same room since essentially the start of the pandemic. And so I found not a coworking space but a very affordable windowless box that I shall turn into a content palace.
I’m just going to try it for a few months to see if it makes sense or if I should return to working from the couch, but I’m quite excited about building it out. I only got it a few days ago and so at the moment it’s largely a bunch of boxes and random furniture I no longer had space at my apartment for. It’s got a drop ceiling with fluorescent lighting and landlord special laminate floors, but I also can do whatever I want to it, so I will likely do some sort of design on the walls, throw a rug down, whatever.
This post is for paid members only
Become a paid member for unlimited ad-free access to articles, bonus podcast content, and more.
WASHINGTON, D.C. — The U.S. remains the most desired destination for people who would like to leave their own countries permanently, but Gallup's latest data show it is less attractive than it once was.
In 2025, 15% of adults worldwide who say they would like to move permanently to another country name the U.S. as their preferred destination, the lowest level recorded in nearly two decades of Gallup research. From 2007 to 2009,
24% of would-be migrants named the U.S. as their top choice
, and that figure remained near 20% through 2016. Since 2017, it has been at or below 18%.
The rank order of the countries attracting the most interest from potential migrants has seen little change since Gallup’s first measure.
Canada ranks second
, as it has for several years, with 9% of potential migrants mentioning the U.S. neighbor. The appeal of these desired destinations did not change in 2025, even as the U.S. became less desirable.
Line charts show trends in the percentage of adults worldwide who would like to move permanently to top destination countries from 2007–2009 to 2025. The United States remains the top destination but declines from 24% to 15%. Canada rises from 7% to 9%. The United Kingdom declines from 7% to 4%. Germany, Australia, Spain, France, Japan, Italy, and Saudi Arabia remain broadly stable around 3% to 5%.
Gallup's latest update on migration desire is based on a question asked almost annually: “Ideally, if you had the opportunity, would you like to move permanently to another country, or would you prefer to continue living in this country?” Those who say they would like to move are then asked to name their preferred destination.
Results for 2025 are based on interviews with over 144,000 adults in 140 countries. The current estimates include data from China for 2023, the last time the question was asked there.
The most recent analysis period coincides with a sharp slowdown in international migration into the U.S., amid changes in immigration policy and declining migration desire in several regions. External data suggest global migration more broadly slowed in 2024 after surging post-pandemic.
Declining Desire to Move to the U.S.
The U.S. became less attractive to adults in several regions in 2025, with statistically significant declines in Latin America and the Caribbean, sub-Saharan Africa, and Southeast Asia.
Latin America accounts for seven of the 16 countries worldwide where the percentage naming the U.S. as a preferred destination fell by at least 10 points. In the region, the percentage fell from 33% in 2024 to 28% in 2025.
Other Latin American countries that saw double-digit declines include U.S. neighbor Mexico, where the latest 21% who want to move to the U.S. matches the previous low set in 2017 and 2018. In Honduras, desire to migrate to the U.S. dropped 35 percentage points, from 71% to 36%, the largest decline in any country in 2025.
###Embeddable###
Despite the falling numbers, the U.S. remains by far the most desired destination in Latin America and the Caribbean and in sub-Saharan Africa. The picture varies more in other regions.
In Southeast Asia, Japan leads at 23%, compared with 12% for the U.S. In the Middle East and North Africa, Germany attracts 13% and Saudi Arabia 12% of potential migrants, with the U.S. at 9%. In South Asia, Saudi Arabia and the U.S. are roughly tied, each cited by 7%. Within the European Union, Spain, at 11%, and Switzerland, at 8%, rank ahead of the U.S., at 6%.
Global Desire to Migrate Falls, Shifts
Beyond where people want to go, the data also show a shift in how many want to move at all.
Overall, global desire to migrate declined in 2025 to its lowest level in a decade, driven by sharp drops in regions that have long had the highest migration aspirations, including Latin America and sub-Saharan Africa. After holding at a record-high 16% between 2021 and 2024, global desire dipped in 2025 for the first time in years, falling one point to 15%, a level not seen since 2018.
###Embeddable###
In Latin America and the Caribbean, 25% of adults say they would like to move permanently to another country, the lowest level in a decade. The decline is particularly notable in this region, where migration desire has fallen steadily after peaking at 34% in 2021-2022.
Multiple countries across the region recorded double-digit declines between 2024 and 2025. In Honduras and El Salvador, the percentage of adults wanting to leave fell sharply last year, from levels above 50% in several prior years to 35% and 25%, respectively.
In sub-Saharan Africa, where migration desire remains the highest globally, 33% say they would like to move permanently, also a decade low. As recently as 2023, that figure stood at 37%, ticking upward from 36% in 2021-2022.
In regions that are typically on the receiving end of migrants, the picture is different. Migration desire in the United States and Canada (20%) and the European Union (21%) remains near record highs.
In the U.S., notably,
the heightened desire to move abroad is concentrated among women younger than 45
. In 2025, 40% of U.S. women aged 15 to 44 say they would move permanently to another country if they had the opportunity, up from 10% in 2014. The trend first rose sharply in 2016 and continued across multiple years, suggesting a broader shift in outlook rather than a short-term political effect.
Bottom Line
It is important to note that desire to migrate is not the same as intent to move. Not everyone who wants to move can or will do so. The 2025 data show that fewer people worldwide are imagining their futures elsewhere, and the U.S., long the world’s most desired destination, is attracting less of that interest than at any point in nearly two decades.
For years, the dominant story in global migration data was a rising desire to move across nearly every region. The 2025 data suggest that pattern is shifting. The declines are widespread and concentrated in the regions that have historically driven global migration.
At the same time, the picture is not uniform. In regions that typically receive migrants, including the U.S. and Canada, along with the EU, desire to leave remains near record highs. And within the U.S., a growing number of younger women say they would move abroad permanently if they could.
These patterns show that interest in moving abroad, and to the U.S. in particular, is shifting across regions. But despite these changes, many people worldwide — an estimated 900 million — would like to move, including about 134 million who would prefer to move to the U.S.
This essay introduces the concept of
decoherence
: the accumulation of locally valid but mutually incompatible or redundant models within a system, such that the cost of change is dominated by translating among those models and preventing unintended side-effects.
In other words, it's
what happens when slop drowns out the signal in an endless sea of noise.
Decoherence grows relative to the rate of change of a system, and it increases faster the more decoherent a system is, resulting in runaway exponential growth. It is not a new phenomenon, and humans have always countered it through carefully finding ways to do more with less, unifying disparate patterns and models into a cohesive whole. However, the widespread use of AI is currently producing it at a rate that is unsustainable.
The good news is that this rules out the specter of runaway recursive self-improvement, the intelligence explosion that goes parabolic before anyone can react, as decoherence both prevents AI from improving in a bubble
and
limits the rate at which it can improve outside of it. The bad news is that we are barreling toward a different kind of disaster:
Decoherence Collapse.
Imagine a building, let's say a small office tower. When this building was built, they used a type of pipe that will degrade over time and eventually need to be replaced. This is standard
infrastructural debt
; basic wear and tear, as they say.
Then, let's say that when it comes time to replace the pipes, you need to change them over to a new standard. This could be because of new building code requirements, because the old pipes simply aren't made anymore, or because the new pipes are much better and easier to maintain. This is standard
technical advancement debt
, the need to upgrade and transition due to the forward progress of technology over time.
There is a third form of debt that can arise based on
how
the transition from old pipes to new pipes is done. Consider the following options:
Shut down the building and replace all of the pipes at once.
This is a very disruptive and expensive method, since you can't use the building while the process is underway and you have to pay for the replacement up front. But the process is
complete
by the end of it.
Shut down each floor, one at a time, and replace the pipes on that floor.
This is
less
disruptive overall, but somewhat
more
expensive because you still have to pay up front, and you have to pay a
premium
for the extra labor required to keep things running smoothly as the work goes on.
Replace the pipes as needed, when they begin to fail.
This is the least disruptive strategy, and it allows you to amortize the cost of replacing all of the pipes over time, with one small repair after another.
For most people, option 3 is very appealing. It allows them to keep things running smoothly and to spread out the cost of maintenance. And if we can just make like the
Ship of Theseus
[
1
]
and replace the pipes one at a time, why shouldn't we?
Well, for one thing, it creates
decoherence
.
And decoherence is, by far, the
worst
form of tech debt.
Evolution
The
Ship of Theseus
actually gives us a good lens for understanding the true scope of decoherence. We know how to build ships made of wood, and we know how to build ships made of steel. You can repair a ship one piece at a time with the same material, as the original thought experiment goes, and the ship remains functional, with all of the original designs and structures that went into it intact.
But do we know how to build every iteration of a ship
in between
wood and steel? Could you, say, slowly replace every piece of a man-of-war and incrementally turn it into a modern destroyer? And have it functional (for some definition of functional) at every step in the process?
It's not that the answer is an absolute "no". If we are creative enough, if we had the best minds working on it, then I'm sure there would be
some
path to doing this. But it would require
ingenuity
and
skill
and
craftsmanship
. It would require attention to detail. And, crucially, you would really want to
complete
the process, because the half-man-of-war, half-destroyer vessel is likely not going to be very good in modern combat.
Returning to our plumbing example, we can see how the same strategy plays out regularly in the world of construction. Every time a pipe breaks, the plumber is called, walls are opened, the repair is hand-crafted for that specific area, and then everything is closed back up. If you're lucky, the plumber will leave detailed notes, and if you're not, then years later some poor sod is going to open that wall back up and say to themselves, "What the
hell
is going on here?"
Now, multiply that process over time as we slowly replace the pipes in our building, and the end result is a patchwork of old and new pipe that has much more
complexity
than either system on its own. Every joint, every hand-crafted patch, is its own little bundle of unique forces and properties that are understudied, and thus requires an expert in
both
systems to fully understand and work with.
On the surface, this is fine. The pipes work, why does it matter
how
they work? As long as it's a good patch, who cares?
Well, what happens if we, say, want to build an annex?
For the purposes of this thought experiment, we'll say that the water for the annex needs to be routed through at least part of our existing building, using the existing pipes. And, crucially, we need to increase the
overall water pressure
in the system.
Now, the question is:
Is it safe to increase the pressure?
If we had all type A or all type B pipes, even ones that had been patched and repaired over time, then this would be a straightforward question. Both systems are well understood, both have tools and processes for calculating their capacity, and people run these calculations all of the time.
But, if we have an unknown mixture of both systems, suddenly we have to do a lot more analysis to answer that question. Every patch could change the answer, even ones at the other end of the system, because they're all tied together.
And this is where the true complexity of decoherence becomes clear. When we try to make changes to decoherent systems, it requires far more expertise and skill than working with either system alone. The engineer working on the system needs to trace and understand it much more thoroughly and carefully, because their changes may have unintended consequences.
And yes, I count plumbers as engineers, at least as much as software devs. Have you seen them think through pressure forces in drain pipes in real time? It's remarkable.
That is no small task, and it is best if it's not rushed. But for the outside observer, without an understanding of the depth of the problem, this can be frustrating. Normally this part is easy. Why is it taking so long this time?
In this situation, management will oftentimes apply pressure to get things done faster. When pressure is applied, the expert doesn't do the full analysis faster; they just stop earlier and do something they're
pretty sure
will work. A sloppy join, an unusual part, maybe some extra safeguards, just in case.
Not completing the task thoroughly, however, creates a knock-on effect: this particular change has lower quality, and it makes the system more fragile and complex. This means the next change will take even
more
thought and care, and if the pressure on the engineer is the same, then they will do an even
worse
job.
That is a pretty messy situation as it stands, and you can already see a sort of exponential growth of complexity taking place here. But wait, it gets worse! Let's consider the next level of decoherence: Starting a
second
transition before finishing the first.
The Maze
The tricky part about software, as compared to a physical building or other types of real-world systems, is that it's all sort of invisible.
Coders walk through the halls of codebases every day. We navigate the labyrinth successfully so often that we become familiar with every corner and every turn, and when our walks become longer, with more corridors and dead ends and trap doors, we
feel
it much more immediately and intuitively.
But this is difficult to relate to people who can't even see the maze, who don't walk it with you every day. And when it comes time to clean up some of your debt, to make the maze shorter and less winding, your proposals are hard to sell up the chain, even to those who used to walk mazes a long time ago. In the end, none of them know
your
maze. They don't know the trials you face each and every time you enter it.
By comparison, our plumber friend in the real world can show the building owner the absurdity of their pipes much more
directly
.
When we start to mix more than two systems together, with multiple patches over time in a haphazard way, the complexity of the maze
explodes
. It is now combinatorial: you need to think of A -> B, A -> C, B -> C, A -> B -> C, C -> B -> A, and so on.
We can of course insulate engineers from this somewhat. We can come up with best practices, we can use tools and frameworks to isolate part of the system from another part (for instance, by using a pressure-limiting valve in our pipes). Inevitably, though, it gets to a point where even the best engineers, the smartest people, can no longer safely navigate the maze.
They may be able to do it 80 or 90% of the time, but they will eventually take a wrong turn
forget to leave a trail of string and find themselves stuck
within the immensity
of the unending growth
that outpaces their every step
into eternity.
This is the Decoherence Trap. The maze grows onward and onward until it swallows you whole and leaves you lost in the dark. Until it becomes so massive that it would take lifetimes to navigate.
Well, lifetimes for humans anyway. But what about AI?
Simulation
Humans get tired and reach physical limits, but autonomous agent swarms can keep going around the clock, collectively and tirelessly mapping the maze like the good little robots they are. If scale is the problem, then shouldn't we just be able to throw more compute at it and call it a day?
Well, that depends on the nature of the complexity we are facing. Does it:
Grow linearly with the size of the codebase as a whole, OR
Grow
exponentially
, with each change increasing the likelihood that the
next
change will add even more complexity.
If it's the former, then yes, as the size of the problem grows we can just keep adding more agents and more data centers and working the problem at about the same pace. But if it's the
latter
, then adding more capacity will only get us the ability to push a bit further before the size of the maze threatens to consume all of the compute on Earth (and in space, should
SpaceX's plans
[
3
]
work out).
In my experience, it is the latter. When a plumber opens up a wall and sees a mess, it isn't clear what's going on. They may choose to use pipe A, they may choose to use pipe B, or they may choose to add a new type of pipe entirely in their confusion. The same is even more true for code.
We can see this play out in a simple simulation below. Here, we have a graph that represents a codebase (or some other complex system), where:
Nodes
represent different components within the system
Node Size
represents the size of the to component
Node Color
represents the dominant paradigm that the component belongs to. You can think of this as the "kind" of component - different materials of pipes, different constructs in code, different types of systems, etc.
Edges
represent connections between those components
Loading precomputed timeline…
This is a recording of a few runs. If you want to play with the full simulation yourself, changing the settings and watching what happens, you can find it
here
.
An actor, representing a developer, implements a "feature" by walking some random subsection of the graph and then mutating it. The actor's base behavior is shaped by its
coherence factor
:
Lower coherence
means the actor rushes through the problem more quickly and makes snap decisions, preferring simple solutions without considering the context around them, and overall adding complexity to the graph.
Higher coherence
means the actor takes longer and approaches each problem with more thought, and thus has a higher chance of making a less complex change or even removing complexity.
At first, the lower-coherence actor moves very quickly compared to the higher-coherence actor. However, as the graph changes, it impacts the walks as well. Each of the following slows down the actor's progress:
Higher connection degree (number of edges)
. This represents the added burden of having to pull in the context of each adjacent node, at least partially, in order to understand its impact on the current node.
Transitions between colors
. There's overhead when switching paradigms as you implement a feature, and it requires the actor to again gain context and understanding of each paradigm AND how they connect.
Path length
. The walk itself has a chance to extend further as there are more connections and transitions needed. This represents the actor needing to read more and revisit more in order to get all of the context needed to implement the feature, and it can increase indefinitely until you hit the
size of the entire system
(meaning, in order to make a change
anywhere
, you need to understand
everything
).
If we take the distribution of features built over time and coherence, we can plot the result and see a shape that should look familiar to any engineer: The
Sweet Spot
.
In the
Sweet Spot
, the system is relatively coherent and we actively invest in it to ensure it stays that way. There are a few dominant paradigms, but there's enough jitter that things can change and adapt over time, and we aren't overly perfectionist about everything.
Above the
Sweet Spot
, we work extremely hard to make sure every new node fits into the existing paradigms, and we remove complexity at every turn. This takes much more time and slows down feature work, but in the worst case it still produces a highly coherent system that can be iterated through
relatively
quickly.
Below the
Sweet Spot
, the drop-off is precipitous. We very quickly lose speed as the codebase becomes exponentially more complex. If the coherence factor is
negative
, and no care is given to maintaining coherence, then the time to ship a feature grows without any apparent bound.
We can also see how different strategies affect the system over time from different starting points. If we start with a highly coherent system and use a mostly decoherent strategy (a coherence factor of +0.2, where some coherence is maintained but shortcuts are still taken), then the graph devolves slowly at first before hitting some inflection points and entering the Trap.
By contrast, if we take a system that starts out decoherent and apply effort to recohere it over time, then we can move the needle toward coherence and accelerate.
Now, critics may note that this simulation has arbitrary weights and does not definitively
prove
that this is how complex systems will evolve. This is not my assertion.
What the simulation demonstrates is that this curve can exist as an
emergent
behavior of simple rules and local decisions. Actors changing the system today can improve or degrade the ability of future actors to change the system tomorrow. This is an obvious truth, but I think the implications of it can be quite easily lost if we can't actually
see
the complexity like we can in the real world, with pipes and wires and physical hardware.
So, we come back to the question on agents: Can agents work on these systems and maintain coherence? Or do they, over time, introduce decoherence even
slightly
? Because there is another crucial risk to consider here: decoherence does not grow over
time
, but with
change
.
If you build a decoherent system today, and then stop changing it for 10 years, and come back to it, it will be exactly as decoherent as you left it. It may have other forms of technical debt, but those are not related to decoherence. Decoherence grows or shrinks
only
when changes are made to the system.
And if you're making a lot of changes really quickly, you can also grow decoherent
just as quickly
. Even a very slight rate of increasing decoherence can spiral out of control before we even know it.
Here's the thing: We've been dealing with this phenomenon for much, much longer than agentic development has been around. Every single company I have ever worked for had massive amounts of decoherence, and less-experienced engineers and engineers under pressure also tend to add more decoherence over time, so it's not like humans are perfect here.
In fact, I would
venture to say
that most companies operate somewhere well below the
Sweet Spot
, and indeed operate in a continuous cycle where:
Decoherence grows to the point that no features can be completed in a reasonable amount of time.
A large effort is made to reduce decoherence.
The effort produces results and features begin shipping again at a slow-but-acceptable pace.
The effort is not completed, or if it is, it still doesn't push us all the way to the
Sweet Spot
. Resources and focus are shifted, and the system begins to decohere again.
Wash, rinse, repeat. Some companies may recohere faster and longer than others, and a very small percentage manage to stay in the
Sweet Spot
over time, but it requires a dedicated engineering culture of excellence (Apple comes to mind; say what you will about the state of macOS, I would take it any day over Windows).
The question is, are agents actually
better
than the average engineering culture at this point? Significantly better, at that?
So far we have not seen evidence of this. If anything, the early research points the other way.
A
Harvard study
[
4
]
of 718 companies found that adopting coding agents raised the amount of code written by 30%, but did not produce a measurable increase in finished work. The extra code piled up in review instead: pull requests took 49% longer to review, and nearly twice as many were sent back for changes. A
Carnegie Mellon study
[
5
]
of open source projects that adopted Cursor found a large jump in velocity that did not last, alongside an increase in code complexity that did, and that the added complexity was itself a major cause of the later slowdown. And an
analysis of over 300,000 AI-authored commits
[
6
]
across more than 6,000 repositories found that about one in eleven of them, and up to one in seven depending on the assistant, introduced at least one quality issue, and that nearly a quarter of those issues are still sitting in the code today.
More code, the same amount of finished work, and more complexity left behind with every change.
Progression
Now, let's address the primary counterargument, which is the
technological progression
argument. It goes something like this:
The first generation of agents will produce inferior-quality code, but as long as it's "good enough" then they can still replace humans for most coding tasks, and we can build our processes around them in anticipation of more capable agents in the future.
This is effectively the story of automation during the Industrial Revolution, where the first generation of textile machines was indeed much worse than humans, but
eventually
they did catch up. As
Cory Doctorow
[
7
]
has pointed out, industrialists raced to adopt automation because it allowed them to discipline labor and consolidate power at the expense of the workers and the public, who had to endure far worse working conditions
and
worse quality goods for generations.
[
8
]
[
9
]
But I want to build on this further, because there was a core reason that it worked for textiles: The machines produced inferior products, but they met a minimum bar.
The machines themselves were also very well designed, for what they were. I spoke recently to a mechanical engineer who extolled the quality of those generations of machines, how well they operated, how long they would last. Yes, they may have produced low-quality slop, but they produced it quickly and tirelessly and for many, many years, until the next generation came along and replaced them with incremental improvements. And crucially, while the machine was working, there was no increase in
decoherence
. Wear and tear, yes. Generational advances, yes. But not decoherence.
Now, here's the rub: The logic of this argument is assuming that
code
is analogous to
textiles
. That is, code is the final product that users will pay for. But nobody wants to buy code. They want to buy
applications
.
In other words, code is not the textile, but the textile-machine. Every time a screen is rendered, a form is submitted, a record is updated, that is the "product" that the code produces. This is why code has been so immensely profitable, because every additional customer requires no additional overhead. The raw materials are bits and bytes of electricity on chips, and the product is information and processes encoded into those bits.
A more accurate analogy would be if we somehow went back in time and made not just a textile-machine, but a machine that
designed
textile-machines. That iterated on the next generation of textile manufacturing on its own, semi- or perhaps fully autonomously. This is something that has never existed before, and is unprecedented in the history of automation.
This is the dream of recursive self-improvement. Of an intelligence explosion,
a technological singularity
[
10
]
. This is the dream of AI in the first place.
So, how has that been going?
Singularity
Well, the goalposts have been
subtly shifting
. In May of this year, Tom Reed, a skeptic of the intelligence explosion theory, coined the term "
the Goodhart Singularity
[
11
]
" to describe the limitations of AI iterating in a bubble without new data about the real world. This is based on
Goodhart's law
[
12
]
:
When a measure becomes a target, it ceases to be a good measure.
Marilyn Strathern, paraphrasing Charles Goodhart
In a post from last month, Tom Davidson, a senior research fellow at
Forethought
[
13
]
, conceded that data bottlenecks
will slow down progress
[
14
]
once AI reaches what he calls the "human-quality ceiling": the point where there's no better human demonstration left to learn from, and AI has to manufacture higher-quality data than anything that exists. Davidson has written extensively about models of AI takeoff speeds, and later forecasts built on his work, most prominently the
AI 2027 scenario
[
15
]
.
So the fact that Davidson has wavered, if even slightly, is notable. But he argues it's a one-time slowdown, not a wall, and in general, those expecting a fast takeoff still think that it will be able to recursively self-improve on its own with relatively little data, and that this process could spiral out of control in isolation in a data center and lead to the birth of a super-intelligence.
The way they expect to be able to do this is via what they call a
Software Intelligence Explosion
[
16
]
(SIE). Specifically, a subtle but load-bearing moment in the argument comes from Davidson's post on data bottlenecks:
Rather than building RL environments that teach the construction of real-world software artefacts, AI must construct RL environments that teach AI to make better software than anything that exists in the real world.
To be clear, I think this will be possible! It is easier to construct difficult challenges and verify their answers than it is to solve them. Already today, human experts build RL environments that produce data above the human-quality ceiling. Data quality will not hit a wall at the human ceiling.
Let's break this down.
What Davidson's saying here is that AI must be able to make better software than anything that exists in the real world, largely in isolation. To do this, it will need to be able to make a
Reinforcement Learning environment
[
17
]
that can produce that software. The way this works is essentially:
Define a goal
Define a set of things you can do
Use an algorithm to try out a lot of different methods to accomplish the goal
Measure how close you get to accomplishing it, and how good your method is
Find the best method(s)
For an SIE to occur, the AI would need to be able to do this entire thing on its own to discover better and better
algorithms
for learning, and that's the important part. It's not about producing better software per se, it's about producing better algorithms for
learning and improving
.
The Goodhart Singularity effectively argued that an AI, in isolation in a data center, would not be able to do this for most real-world tasks of consequence due to the measurement step. If you want to figure out how to build a better car or rocket or computer chip, you might be able to build a simulation and try things out, but you would still need to test against the real world to validate your findings, or you would eventually drift further and further away from reality as you pushed the designs to more extreme places. This introduces a rate limit which would slow things down significantly.
But this isn't true for some domains, which is what Davidson is saying in the second part. For games like
Go or chess
[
18
]
, the rules of the game are the entire world and there are clear victory conditions, so it's possible to run in isolation and find better and better strategies, and also to find better algorithms for
finding
better strategies. The same is true for more complex games like
StarCraft
[
19
]
or
Dota
[
20
]
.
But these are
games
, and we can do this because the victory conditions are clear and simple and the rules or environments are very limited. In order to get our explosion, we need to be able to apply these methods to
something that matters
, and we need to be able to
verify
that
in the bubble
of a data center, without checking against the outside world.
That brings us to software. I think that SIE proponents have really latched onto software because they see it as a way to bridge this gap. Software can run in isolation, and you can test it in isolation very easily and quickly. That's perfect for creating an RL environment, and they think that eventually, we will be able to build one that doesn't require syncing with the real world.
Because after all, it's
software
. It can do just about anything, right?
You can see how this would feel so natural to those in Silicon Valley. We pride ourselves on being very intelligent and being able to solve big problems. A significant portion of computer science education is all about logically proving properties of software and algorithms and the like. Will this program complete? Will this sorting algorithm be fast? How fast? Will this system be safe and not crash for all cases that could ever possibly exist?
We're used to thinking about problems in this way, and used to the idea that software has no limits. Tech took over the world, so it's only a natural extension of thinking that if you can teach a machine to write code, eventually, it will be able to teach itself to be better at writing code.
And then, eventually, the machine will take over the world too.
Better Software
The problem with this viewpoint is that it fully misses what actually makes software
good
, which is coherence.
Allow me to elaborate. Software is a tool to accomplish a goal in the real world. That goal may be many steps removed, through many abstractions, but whether or not it succeeds is ultimately determined by how well it solves that goal.
You might think, ok, but once you have the software and it solves the goal, can't you use that as the output to target? And then the AI could just iterate on better ways to achieve those goals?
If we define "better" as something simple and easily measurable, like lines of code, speed, memory, or efficiency, then yes. These are all important, but if we treat them as the target, we'll end up with software that is small and fast and
completely decoherent
.
Code gets fast by skipping work, and it can only skip work by assuming things about the rest of the system: this list is already sorted, that value is never zero. Every one of those assumptions is a hidden connection that nobody wrote down. Optimized native code sits under abstractions for a reason: we need it for performance, so we seal it in a box where its assumptions can't leak. If we wrote all code like that, it would be a tangled mess.
A practical example in JavaScript is combining multiple logical classes into a single class to keep hot paths
monomorphic
[
21
]
. It's always a huge pain, but it pays off as long as you never have to fiddle with it.
That would be fine if we only had to write software once and never touch it again. But that's never true in practice. Because software
is
the never-ending
Ship of Theseus
. Applications and libraries and frameworks must evolve over time to meet changing conditions on the ground: real-world constraints that shift and evolve as we change how society works, as we discover more about the natural world, and as we push the limits of what we can achieve.
So good software is adaptable over time. You can take the existing technological capital (all of the software we have written before), and you can quickly recombine it to solve new problems on the fly.
And what makes it adaptable is
coherence
. Most of the big advances in computer programming and software quality have been about making software more coherent, and the only way to test if it is more coherent is with real-world feedback.
Let's break it down with a really concrete example:
futures
[
22
]
.
Futures make asynchronous programming easier in some really fundamental ways. Before futures, there were lots of ways you could handle async, and it was a predictably chaotic mess. Specifically, a decoherent one: many locally sensible ways of doing the same thing, none of which fit together.
Developers would have to live within that mess, and they would have to carefully and thoughtfully navigate between all of the different types of async that any one app might have. If you missed a step or forgot something, you would have difficult-to-track-down bugs and issues. And the code itself read like a horror show, as callbacks multiplied and as apps got more complex and had more and more asynchrony to handle.
Futures were first introduced as a concept in the 1970s, with the core idea being that they were a
placeholder
for a future value. The first concrete implementation was in MultiLisp, in 1985. But they didn't make it into the mainstream until the 2000s, when Java added them in 2004, and they didn't get popular until the 2010s when chainable promises were first introduced into JavaScript and C# shipped Task.
[
22
]
There were two main reasons for this:
The first futures APIs worked, but were clunky. You could pass around a future, but when you tried to read the value it would block, which meant you had to be careful about when you did it. They also weren't independently chainable, so you couldn't really
fork
the future easily.
Futures introduce a decent amount of overhead. You have to create a wrapper object to track the state each time, rather than just storing a function pointer, for instance.
However, over time we found the APIs that worked well, worked out the kinks, and we realized that the overhead was worth it because it made it easier to reason about and combine larger systems (compute and memory getting cheaper didn't hurt either).
Bringing this back to AI.
In order to build better AI software, you need to be able to test if it is actually better. And importantly, as we mentioned before, we have to be able to measure if it's better
in the bubble
. We can't check outside of the bubble because that brings us back to being rate-limited by the world.
So, what can we check inside the bubble?
Well, we've narrowed it down to:
Games
Software
Mathematics
Games don't really get us that far, because they're not grounded in the real-world tasks we care about. So let's move on to software.
As we've established, good software is coherent. So, how do we measure coherence?
Well, you take an abstraction and see how well it holds up in different contexts, and how much the code has to bend to fit each one. Since we're not allowed to leave the data center, there are exactly two options for how we can do this:
Apply it to all existing software.
This will only get us so far, because even if it works well for all of them, there's no way to know if it will work well for all
future
software. Callbacks and event loops weren't even common until GUIs became standard, and early web servers still used threads and traditional parallelism, so it wasn't clear how valuable futures would be until the entire set of programs that make up the web was discovered and explored. We would be overfitting to the programs we already know. The result can look perfectly coherent today, and then the first new problem that doesn't fit has to be patched around.
Create new software.
This is something we can attempt to do in theory, but in practice we can't just generate plausibly useful programs to expand the training set. Once again, software is a tool to accomplish a goal in the real world, and if we don't validate its usefulness from time to time we could drift substantially from reality.
Beyond this core issue, the other important test of coherence is how well an abstraction or concept translates over time, across a variety of different contexts and evolving requirements. A standard can look good on paper and even work well in one environment, like desktop computers, but then be completely inadequate for mobile devices or cloud-based systems at scale.
You would not only need to generate plausibly useful software, you would also need to generate plausible evolution scenarios to see how it adapts, what happens when not everyone upgrades, when people (or agents) lag behind or decide to go in a different direction, when you have an
ecosystem
of systems that are a constant moving target.
You can get arbitrarily good at making the software we already have more coherent. Getting better at the software we
don't
yet have requires either (a) waiting for the real world to produce new software or (b) making new software, testing it in the real world, and waiting for it to evolve over time. Both of these options require round trips outside the bubble.
Putting it all together now:
We
can
make an AI that produces faster, smaller, and more efficient software beyond the human ceiling while staying inside the bubble.
We
cannot
make an AI that improves software
coherence
beyond the human ceiling without leaving the bubble, as noted above.
Because AI cannot check if the software is universally better without leaving the bubble, the AI cannot tell if it is actually improving its learning algorithms or if it's drifting.
We're right back at the Goodhart Singularity.
This puts the nail in the coffin for a fast, isolated SIE right off the bat. But we can also approach this from
another
angle, and this one also applies to
other
forms of intelligence explosions.
Any form of intelligence explosion depends on the AI researching and improving its own software or hardware, with each generation building on the improvements of the previous one.
Each generation will have some percentage chance of introducing decoherence into its systems, since the AI will be building or expanding systems beyond the frontier of its current understanding.
If the AI moves too quickly, it will compound decoherence faster than it can correct, leading to a stall or regression in its overall capabilities.
If the AI validates and verifies all of its findings, it will be rate-limited by its capacity to gather data from the world around it.
This cannot be addressed by better learning algorithms developed in pure isolation, because the AI has nothing to measure these against (see the first proof above).
We can see what the failure mode in point 3 looks like in the following chart, adapted from Eth and Davidson's model in their
SIE paper
[
16
]
. Their projection has the growth curve going parabolic before month 5. The chart below keeps their model and adds one assumption: that the cost of each change doubles as accumulated work grows, which is what decoherence looks like in human codebases.
If this is true and AI cannot bypass decoherence, then ultimately AI is rate-limited by reality. It's not that it won't ever surpass us, but that it is a long way off from doing so in any meaningful sense, and even when it does it will still have to do all of the work that reality demands, constrained by the same physical and informational limits that govern us.
Davidson claims we could gather sufficient data easily by just recording real-world tasks:
If the whole world worked together to make this happen quickly, it would not take long. For each job, 1000 people could record their screens and wear video cameras on their heads, and within 4 months AI would have 300 years' worth of experience.
This, fundamentally, underestimates just how complex the world is. If we expect a machine to be able to improve itself indefinitely, it can't just be good at moving a cursor on a screen or identifying objects in videos. It needs to develop deep insights into understanding the world itself. It doesn't need to experience it like a human, but it needs to be able to capture the same kind of information, the same perspective, to measure the intangibles and subtleties that cannot be captured by a screen recording and video feed alone.
It needs to be able to make connections between things that, at first, appear to have no relationship at all. Which brings us to our last topic.
Mathematics
Mathematics is the other domain which could, in theory, be checked in the bubble by using verified proofs. If an AI can get better at math in a bubble, then it can develop a better learning algorithm overall, and then maybe the SIE argument still stands.
The thing is, math is sort of
arbitrary
. We make a lot of decisions about how it works, and what is useful. For instance, the number zero was not always accepted as a valid number. Imaginary numbers took centuries to be accepted, and their four-dimensional cousins, quaternions, struck Lewis Carroll as so absurd that he is thought to have
satirized them in the Mad Hatter's tea party
[
23
]
.
These are examples of things that we take for granted, but which really
aren't
as obvious or as natural as we might think. They only gained wide acceptance when they were used in real-life practices, and when the outputs lined up with reality in meaningful ways.
In a similar way, Boolean algebra, the fundamental mathematics that underlies computing, was also considered an esoteric branch of mathematics for nearly a century. It was
first published
[
24
]
by George Boole in 1847, but it had no practical applications, and it was studied as a curiosity of formal logic rather than a tool for serious engineering.
The importance of this math wasn't discovered until the 1930s, when Claude Shannon was working at MIT on the relay controls for Vannevar Bush's differential analyzer. He had previously encountered Boolean algebra in a philosophy class he took during his undergrad,
[
25
]
and realized as he was working on circuits that they matched up perfectly. His master's thesis,
"A Symbolic Analysis of Relay and Switching Circuits,"
[
26
]
made the connection in 1937, and the rest is history.
Boole wasn't just inventing mathematics for the sake of it. He had an intuition that the properties he discovered, the system he made, would be important someday. He thought he was discovering the laws of human thought, and while that might have been somewhat misguided, it was interesting enough that logicians and philosophers studied it and passed it down, until Shannon found it and built on it.
Would Shannon have been able to find that connection in the age of AI? If he hadn't been standing in a room full of relays with a real problem in front of him, telling him where to look, and instead had been sorting through endless reams of proofs that were all locally valid and globally meaningless?
There are an infinite number of logical and mathematical systems you can define in a vacuum, and you can get extremely good at building and exploring these hypotheticals. Figuring out whether or not they matter is a different skill, and that is one that cannot be improved in the bubble.
Mathematicians are already worried about this dichotomy. In September, twenty-five Fields medalists, Terence Tao among them,
signed a declaration
[
27
]
arguing that solving problems is only a stand-in for the real goal of mathematics, which is understanding, and that mass-producing true statements can erode the ground that new ideas grow from.
What happens when all of that ground is worn away?
Collapse
The work of building coherence is a long and unrelenting process. It's the work of exploring every crevice and looking under every rock. Of getting down into the mud of reality and letting it seep into your boots as you grope around blindly, looking for all of the different ways that the world can configure and reconfigure itself around you, endlessly, without letting it swallow you whole.
It's not just about solving problems. It's about figuring out what problems we're trying to solve in the first place.
Of figuring out all of the problems we're trying to solve, and finding a single solution that solves each one without exploding into a labyrinth of complexity.
Which brings me to my last point.
There's been much said about
Omarchy
[
28
]
recently. There are many who love it, and many who are, shall we say, skeptical of an agent-forward Linux distro. They have charged forward rather quickly into the space, and appear to be morphing from the original goal of being a clean set of defaults toward
a full distro with a custom kernel
[
29
]
.
Now, I want to be clear that experimentation at the edge of the ecosystem is important. Forking, exploring ideas, figuring out what works without constraints, and bringing your findings back to the community is a huge part of what makes Open Source Software work so well.
But I'm worried here.
I'm worried that somewhere along the line, we may have forgotten that we are all climbing the mountain together. That what has made us so successful and so resilient as a community, what has advanced computing so far so quickly, is the process of building coherence.
Back in the 80s, 90s, and all the way through the 00s, every company managed their own stack. Each server was its own little bundle of dependencies and scripts and OS versions and so on. You needed a team just to keep things running smoothly at your average company.
During
the OS wars
[
30
]
, that fragmentation was worse. Unix did not have a clear successor, and Windows was gaining ground with an entirely different paradigm. If Linux hadn't been built in that time, and captured the aging *nix ecosystem, where would we be today?
Yes, I'm aware that FreeBSD was a thing and could have taken its place. What I really mean is: what if there had been no free software movement at all?
Would we be paying license fees every time we boot up a container in the cloud?
How many startups wouldn't have been able to get started, just because of the costs of running their stack?
That fragmentation was also the reason every system started to feel old and clunky over time. The entire ecosystem was decoherent, and much of the work over the last two decades has been about adding coherence (and capturing some of that value in SaaS products, but I'm getting ahead of myself).
I fear we may be practicing a sort of slash-and-burn agriculture here, where we are throwing away the coherence we have built in favor of rebuilding every dependency, customizing every piece of software, extending in every direction to solve short-term problems.
And not realizing that all the while, we're running deep into the trap.
What humans can handle (and fix over time)
What agents can handle (but not back out of)
Unreachable with all of the compute on Earth
If we push too long and too far without maintaining or rebuilding coherence, with current trends, we'll end up in a place where we
must
use agents to maintain our systems, because the systems will be so large and so overwhelming that we cannot do so ourselves. But if we get caught there, and it turns out that agents cannot
back us out
by doing the repair work, we may find ourselves in a very uncomfortable position:
Locked into a development model that slowly degrades our systems no matter how much effort we put
into fixing them.
It's not that we won't be able to eventually fix the systems. But it might take years or even decades to do so, and in the meantime, we won't be able to ship features or make progress on the many other pressing problems we have in our society.
This is what I call
Decoherence Collapse
. And I am far more afraid of it than runaway super-intelligence, because it's actually happening right now, in front of our very eyes.
I do want to be clear that there is some utility in AI, I just think it's more on the margins than in replacing core workflows or running fully autonomously. I subscribe heavily to Cory Doctorow's
reverse-centaur analysis
[
31
]
- we don't want the machine driving us, we want to be driving the machine. On that note, you can read my
AI Usage Policy and Guide
for a more detailed discussion on how I approach it in my own work and life.
And as I've said repeatedly in this piece, decoherence is not a new problem. If anything, it has existed since the beginning of human civilization, or perhaps even further back. It is a natural sort of decay or degradation, a type of entropy, that we have always dealt with and will always have to deal with. With that in mind, I want to leave you with two last thoughts.
Decoherence only ever changes when the systems themselves change. This means that no matter how bad it gets, we can
always
stop moving forward and start backing ourselves out. If AI has pushed us deep into the trap, it might take years or even decades to fully recover, but the hardest part is up front. Every part after will snowball,
as long as
we keep focusing on improving coherence and finish the job. If we improve it just enough to go back to our old patterns, we'll only be restarting the cycle.
We already have processes that are known to improve coherence over time. Humans have found ways to create more coherent systems, and those systems are in large part what has enabled the scope and scale of technological progress in the last several centuries.
In particular, the Open Source Software process that powers much of the coherence behind software development is
so successful
at producing coherence that it has outcompeted corporate software development in several truly stunning ways. But we'll discuss that more in the next essay:
Open Capital
.
I'll go into full detail, with examples and benchmarks, but for those of you who don't have the time, here are the headlines:
For lossy photos on the web, AVIF almost always produces smaller files than JPEG XL.
At default effort settings, the best JPEG XL version is typically 15–25% larger than the equivalent AVIF. At maximum effort settings, the gap narrows a little, to typically 6–20%. There are outliers, where JPEG XL is close to, or even beats AVIF, so if you want the absolute best result for a particular image, it's worth trying both. See the
F1 image
for a typical example, and the
weasel
for an outlier.
The JPEG XL encoder matters a lot.
jixel
, a newer JPEG XL encoder, usually produces smaller files than
libjxl
, except when the image has detailed transparency. The
people image
is one example.
For screenshots and illustrations, AVIF is much better than JPEG XL.
The equivalent JPEG XL is 30–90% larger at default effort settings, and 20–70% larger at maximum effort settings. Lossy AVIF handles these well - you don't need to use lossless formats unless you really need bit-exact results. See the
screenshot
and
illustration
examples.
For images with transparency, AVIF is much better than JPEG XL.
The libjxl version is 31–44% larger at default effort settings, and 61–70% larger at maximum effort settings. jixel always encodes transparency losslessly, which makes its files 2–3x the size of AVIF's.
See the data
.
AVIF is generally faster to encode, and uses less memory, when you factor in file size.
jixel is faster than AVIF and uses less memory, but its files are typically significantly larger, so AVIF is better on balance. See the
F1 image
for one example.
AVIF is faster to decode.
JPEG XL typically takes 2–3x as long to decode at medium quality, but the gap narrows at very high qualities, where Chrome can sometimes decode JPEG XL faster. The
people image
is one example.
Higher effort settings are worth it for AVIF and jixel, but not libjxl.
libjxl's higher efforts are much slower, use a lot more memory, and barely improve the result. Sometimes they produce larger files than the default effort. The
screenshot
is an example of this.
AVIF's 4:2:0 mode (half colour resolution) shouldn't be your default.
It rarely reduces file size, and it makes higher qualities harder to reach. Although, it is quicker to encode and decode. Stick with 4:4:4 if you don't have time to check both. The
F1 image
is one example, and the
screenshot
is an exception.
Quality settings are reliable for all the encoders.
With a single quality setting, the resulting quality varies a bit between images, but all the encoders vary in the same direction, and in ways that seem reasonable.
See the data
.
Progressive JPEG XL is basically free at high effort.
jixel recently added support for early progressive previews, and at its slowest setting they cost little or nothing, but at its default setting the files are 12% bigger. Firefox and Chrome support progressive JPEG XL. Safari still renders the final image, but doesn't show progressive previews. However, is this type of progressive rendering a good user experience?
See the examples and data
.
AVIF supports progressive rendering!
It's Chrome-only for now, but it's in progress for Firefox. It's more complex than progressive JPEG XL, but it gives you more control over what the preview looks like, the files are usually smaller, and they're much faster to decode.
See for yourself
.
For HDR, JPEG XL lacks gain maps, which is a significant limitation compared to AVIF.
The JPEG XL format supports gain maps, but they aren't supported by browser decoders, and the encoding story is messy/experimental. When comparing non-gain mapped HDR content, the two quality metrics I used disagree a lot, but they agree that JPEG XL produces smaller files compared to AVIF.
See the examples
.
JPEG XL can make existing JPEGs 9–20% smaller, without further loss.
It's also as fast or faster to decode, except for small images.
See the data
.
For lossless, JPEG XL is the clear winner.
Lossless WebP is 9–17% larger for photos, and lossless AVIF is 30–120% larger. But lossless images are almost never what you want on the web. If you do use them on the web (like I do on this page), watch out for jixel's higher efforts - it often produces files that are too slow to decode.
See the data
.
Animated image formats continue to be a dumb idea.
Please don't use them.
Learn more
, if you must.
For web use-cases, I'd currently default to AVIF 4:4:4, with the highest effort level I can be bothered with. If I felt AVIF was producing an unusually large file, I'd take a look at JPEG XL via jixel, and see if it did better.
Both AVIF and JPEG XL (via jixel) have seen massive improvements recently, so it's possible that this recommendation could change in future. There's been a lot of misinformation around this stuff, and your AI will happily deliver that misinformation to you. Instead, test things with your own images.
AVIF folks suggest
that JPEG XL is technically limited compared to AVIF. That might be true, but in this article I'm focusing on results with today's implementations.
jixel
0.4.2 (git
f487299
), a second JPEG XL encoder
cwebp
1.6.0 (lossless WebP is used later in the article)
I chose a selection of images, and encoded most of them to a width of 1598 pixels - which is 2x the maximum width images appear on this blog. This means they
look sharp on high density displays
, which most users have. As a result, if you're viewing this on a small or low density screen, you're not getting the full experience.
I ran these benchmarks on my 2024 MacBook Pro (M4 Pro).
When I
first wrote about AVIF
, I used an F1 car as the first image, so I figured I'd do that again!
I encoded the image at various codec qualities, and chose versions that were closest to particular
SSIMULACRA2
scores - a perceptual image quality metric by the folks behind JPEG XL. 50 is considered medium quality, 70 high, 80 very high, and 90 visually lossless. Although, I'm not sure if these ratings take high density displays into account.
Throughout the article, the visual comparisons, like above, use each encoder's maximum effort, except in cases where maximum effort results in a larger file (yes, that happens).
For archival, I'd tend towards near-lossless qualities, but if I'm just displaying an illustrative image on my blog, performance is more important to me. I'm personally happy with the 70 result above. If you zoom in, you can see the quality loss, but if I was really concerned about the zoom-in case, I'd use something like the
VisualViewport
API
to load in a higher resolution image when that happens, rather than make the download bigger for everyone.
At lower qualities you can see the difference in strategy between the codecs. The detail loss is around the same, but AVIF tends to smooth things out compared to the original, whereas JPEG XL seems to introduce rougher patterns.
Also, I feel that, at medium quality (50), the AVIF and libjxl look better than the jixel version. The jixel version has a lot of visible noise around the BWT logo, and the Microsoft text on the front wing is way less legible. It makes me wonder about the metric a bit.
Anyway, here's my interpretation of the results:
File size:
AVIF wins
.
At default efforts, the best JPEG XL image is 14–17% larger than the AVIF image for the same quality. jixel is the better JPEG XL encoder at medium/high quality, and libjxl is slightly better at very high quality. At maximum efforts, the best JPEG XL image (jixel 'extraslow') is 6–15% larger than AVIF (s0).
jixel at its slowest setting slightly beats AVIF's default effort
, with files 1–10% smaller. The biggest gain is at very high quality.
Encode time:
AVIF wins
.
At default efforts, jixel is 12–36% faster than AVIF, but its files are 14–18% larger. To match the file size of AVIF's default, jixel needs its 'extraslow' setting, which takes 18–27x as long as AVIF. libjxl's default takes 1.5–2x as long as AVIF's default, and still produces bigger files.
Encode memory:
AVIF wins
.
At default efforts, jixel uses around half the memory of AVIF, but again, its files are 14–18% larger. To match the file size of AVIF's default, jixel 'extraslow' uses ~10x the memory. libjxl's default uses 2–3x the memory of AVIF, and its higher efforts use ~7x.
Decode time:
AVIF wins
.
JPEG XL takes 2–3x as long to decode at medium quality, narrowing to ~1.5–1.8x at very high quality. Safari's JPEG XL decoder is the slowest.
Higher effort is worth it for AVIF.
AVIF's s5 gets you ~10% smaller files for ~3x the encode time.
Higher effort is worth it for jixel too, up to 'slow'.
'slow' gets you 9–13% smaller files than its default 'fast', for ~3.7x the encode time. 'extraslow' saves another 3–8%, but takes ~8x longer than 'slow' and uses ~9x the memory. Even so, AVIF still wins when given the same encode time: AVIF s5 takes about as long as jixel 'slow', and its files are ~13% smaller.
Higher effort isn't worth it for libjxl.
libjxl's maximum effort is barely any better than its default, but takes ~18x longer.
AVIF's 4:2:0 mode doesn't help much.
It's slightly faster to encode/decode, and uses less memory, but the files aren't meaningfully smaller, and it struggles to reach higher qualities.
Here's the full data, so you can make up your own mind:
Ok, let's get to our first graph, the SSIMULACRA2 scores:
File size
SSIMULACRA2 (higher is closer to the original)
There's going to be a lot of these graphs, so here's what's going on:
The x-axis is visual quality
according to SSIMULACRA2.
The y-axis is file size
. Lower is better, for a given visual quality.
The orange lines represent JPEG XL encoded with libjxl.
The green lines represent JPEG XL encoded with jixel.
The blue lines represent AVIF.
The dashed blue lines represent AVIF with its color data at half resolution.
Known as 4:2:0, or chroma subsampling.
The darker lines represent higher effort levels for that codec.
libjxl calls this 'effort', so the e10 line is the top effort. Annoyingly, avifenc calls this 'speed', so the s0 line is the top effort. jixel names its levels, from 'fast' (its default) to 'extraslow'.
Only the default and maximum efforts are shown initially.
Click the legend to toggle the others.
Here are the quality results using a different quality metric,
ColorVideoVDP
:
File size
ColorVideoVDP, JOD (10 = no visible difference)
The result is roughly the same except this metric puts more of a gap between AVIF and the JPEG XL images.
It also suggests there's some advantage to AVIF with 4:2:0 chroma subsampling at lower qualities, but it's minor.
When it comes to images on my blog, I encode with maximum effort settings. I'm happy to wait a couple of seconds to get an image that's faster to load for every user. However, if you're doing a lot of encoding on a server, encode time becomes more of a concern.
It's worth considering decoding performance. If decoding is particularly slow, then it might make the file size benefit less valuable, especially when images are loaded from a cache.
Decode time
SSIMULACRA2 (higher is closer to the original)
JPEG XL becomes suddenly faster to decode at very high quality settings (but still slower than AVIF). I think this is due to an edge preserving filter that does more work at lower quality settings.
I've heard people say that AVIF's tendency to smooth out details makes it bad for human faces, so I picked this image
from Unsplash
.
The results of the benchmark for this image:
File size:
AVIF wins
.
At default efforts, the best JPEG XL image is 17–24% larger than the AVIF image for the same quality. jixel is the better JPEG XL encoder across the whole quality range this time. libjxl is 30–50% larger than AVIF, which is a much bigger gap than the F1 image. At maximum efforts, the best JPEG XL image (jixel 'extraslow') is 12–17% larger than AVIF (s0).
jixel at its slowest setting doesn't quite match AVIF's default effort
this time. It's a few percent larger at medium/high quality, and only edges ahead at very high quality.
Encode time:
AVIF wins
.
At default efforts, jixel is 18–33% faster than AVIF, but its files are 17–24% larger. Even jixel's 'extraslow' setting, which takes 25–39x as long as AVIF, only matches AVIF's default file size at very high quality. libjxl's default takes 1.5–2.2x as long as AVIF's default, and still produces bigger files.
Encode memory:
AVIF wins
.
At default efforts, jixel uses around half the memory of AVIF, but again, its files are 17–24% larger. jixel 'extraslow' gets closest to AVIF's default file size, but uses ~10x the memory. libjxl's default uses 2–3.3x the memory of AVIF, and its higher efforts use ~7x.
Decode time:
AVIF wins
.
JPEG XL takes 2–2.9x as long to decode at medium quality, narrowing to ~1.3–1.7x at very high quality. At the very top of the quality range, libjxl images decode as fast as AVIF in Chrome, but not in the other browsers.
Higher effort is worth it for AVIF.
AVIF's s5 gets you 5–8% smaller files for ~3x the encode time. That's a smaller gain than the F1 image.
Higher effort is worth it for jixel too, up to 'slow'.
'slow' gets you 7–14% smaller files than its default 'fast', for ~3.9x the encode time. 'extraslow' saves another 4–6%, but takes ~10x longer than 'slow' and uses ~9x the memory. AVIF still wins when given the same encode time: AVIF s5 takes about as long as jixel 'slow', and its files are 8–17% smaller.
Higher effort is somewhat worth it for libjxl on this image.
Unlike the F1 image, libjxl's maximum effort gets you 4–11% smaller files than its default. But it takes ~10x longer, and it still produces much bigger files than AVIF at its default effort.
AVIF's 4:2:0 mode doesn't help much.
Same as the F1 image. ColorVideoVDP gives it a small (~4%) advantage, but SSIMULACRA2 doesn't.
At lower qualities, you can see the smoothing on the face, but it's the same for both AVIF and JPEG XL.
I threw this one in because it's the default image in
Squoosh
, but I guess the sharp lines of the hairs make it different to the previous images. In fact, even at medium quality, the difference from the original is much less perceptible to my eyes compared to the other images.
The results are much closer than the previous two:
File size:
AVIF wins
, narrowly.
At default efforts, the best JPEG XL image (jixel) is only 2–6% larger than the AVIF image for the same quality. libjxl does much worse, at 10–18% larger. At maximum efforts, jixel 'extraslow' and AVIF s0 are roughly tied, with jixel up to 5% smaller at very high quality. However, ColorVideoVDP disagrees, and puts AVIF 5–12% ahead at maximum efforts.
Encode time:
JPEG XL (jixel) wins
, according to SSIMULACRA2.
At default efforts, jixel is 19–35% faster than AVIF, and its files are only 2–6% larger. Comparing higher efforts, jixel 'slow' produces files the same size or slightly smaller than AVIF s5, in the same time or less. And jixel 'extraslow' matches or beats AVIF s0 while being 12–34% faster. But, since ColorVideoVDP gives AVIF more of a file size advantage, it isn't clear-cut. libjxl's default takes 1.3–1.9x as long as AVIF's default, and produces bigger files.
Encode memory:
JPEG XL (jixel) wins
, at lower efforts.
At default efforts, jixel uses 37–48% less memory than AVIF, and its files are only 2–6% larger. jixel 'slow' uses about the same memory as AVIF s5 to produce a similar file size, but 'extraslow' uses ~9x the memory of AVIF s0. libjxl's default uses ~2x the memory of AVIF, and its higher efforts use 6–7x.
Decode time:
AVIF wins
.
JPEG XL takes 2–2.4x as long to decode at medium quality. But the gap closes at very high quality, where jixel's files decode about as fast as AVIF in Firefox and Safari, and ~25% faster in Chrome.
Higher effort is less worth it for AVIF on this image.
AVIF's s5 gets you 3–6% smaller files for 3–4x the encode time.
Higher effort is worth it for jixel, up to 'slow'.
'slow' gets you 6–14% smaller files than its default 'fast', for 3.5–4.3x the encode time. 'extraslow' saves another 2–9%, but takes 9–14x longer than 'slow' and uses ~9x the memory.
Higher effort isn't worth it for libjxl.
libjxl's maximum effort gets you 1–2% smaller files than its default, but takes ~12x longer.
AVIF's 4:2:0 mode doesn't help.
The files are the same size as 4:4:4.
I've played with both codecs a lot, and for photos, what I've shown so far is representative, where AVIF beats JPEG XL. However, every now and then there's an outlier, such as this image.
File size:
JPEG XL wins
.
At default efforts, the best JPEG XL image is 4–11% smaller than the AVIF image for the same quality. libjxl is the better JPEG XL encoder at medium/high quality, and jixel at very high quality. At maximum efforts, jixel 'extraslow' is 12–27% smaller than AVIF s0. This time, ColorVideoVDP agrees.
jixel's 'medium' setting is a big step up on this image.
Its files are 11–25% smaller than AVIF's default, and 4–18% smaller than AVIF s0, the maximum effort.
Encode time:
JPEG XL (jixel) wins
.
At default efforts, jixel is 28–38% faster than AVIF, and produces files that are around the same size or smaller. At higher efforts, it's even more one-sided: jixel 'medium' is 37–65% faster than AVIF s5, and produces files 9–23% smaller. libjxl's default takes 1.5–2.2x as long as AVIF's default.
Encode memory:
JPEG XL (jixel) wins
.
At default efforts, jixel uses 14–24% less memory than AVIF, and produces files that are around the same size or smaller. AVIF s0 uses even more memory (~1.55x its default), and still produces bigger files than jixel 'medium', which uses 41–55% less memory than AVIF s0. libjxl's default uses 2.4–3.6x the memory of AVIF, and the maximum efforts of both JPEG XL encoders use 10–18x.
Decode time:
AVIF wins
, except in Chrome at higher qualities.
JPEG XL takes 1.3–1.9x as long to decode in Firefox and Safari. In Chrome, JPEG XL takes ~1.25x as long at medium quality, but from high quality upwards, it's 11–36% faster than AVIF.
Unlike the previous images, jixel images aren't particularly slow to decode in Safari.
In fact, they decode slightly faster than libjxl images.
Higher effort isn't really worth it for AVIF on this image.
AVIF's s5 only gets you 1–3% smaller files for 3–4.5x the encode time. s0 gets you 7–8% smaller files, but takes ~50x as long.
Higher effort is worth it for jixel, up to 'slow'.
'medium' gets you 6–14% smaller files than its default 'fast', for 1.9–4.1x the encode time. 'slow' gets you 9–19% smaller files than 'fast', for 3.9–6.5x the encode time. 'extraslow' saves another 5–9%, but takes 8–18x longer than 'slow' and uses ~11x the memory.
Higher effort isn't worth it for libjxl.
libjxl's maximum effort gets you 1–6% smaller files than its default, but takes 11–14x longer.
AVIF's 4:2:0 mode doesn't help.
The files are the same size as 4:4:4.
All three encoders produce lower SSIMULACRA2 scores for this image.
As in, with the same encoder quality value, they score lower. It seems like the encoders are pretty happy smoothing out some of the background noise, which seems fine.
File size:
AVIF wins
, by a lot.
At default efforts, the best JPEG XL image is 73–89% larger than the AVIF image at medium/high quality (jixel), and 29–44% larger at very high quality (libjxl). At maximum efforts, the best JPEG XL image (jixel 'extraslow' with patches) is 23–73% larger than AVIF (s0).
libjxl can't produce anything between SSIMULACRA2 ~45 and ~78
at its default effort (~45 and ~75 at higher efforts). jixel doesn't have this problem.
jixel's patches feature helps a lot with this image
, but it's off by default. With patches, jixel's files are 10–29% smaller at its higher efforts, from SSIMULACRA2 ~65 upwards. Patches have no effect at jixel's default 'fast' setting.
Encode time:
AVIF wins
.
At default efforts, jixel is ~50% faster than AVIF, but its files are 70–98% larger. libjxl's default takes 1.7–1.8x as long as AVIF's default, and still produces much bigger files.
Encode memory:
AVIF wins
.
At default efforts, jixel uses ~40% less memory than AVIF, but again, its files are much larger. libjxl's default uses 1.2–2.2x the memory of AVIF. jixel 'extraslow' with patches gets closest to AVIF's file sizes, but uses ~7.5x the memory of AVIF's default.
Decode time:
AVIF wins
, by a lot.
Taking the faster of the two JPEG XL encoders' output, JPEG XL takes 2–3.8x as long to decode, depending on browser and quality.
Higher effort is more worth it for AVIF on this image.
AVIF's s5 gets you 6–13% smaller files for 2.5–3x the encode time, and s0 gets you 16–23% smaller files for 30–45x the encode time.
Higher effort is worth it for jixel, as long as you enable patches.
'medium' with patches gets you 11–44% smaller files than its default 'fast', for 3–4x the encode time. 'slow' with patches saves another 7–16% for ~1.7x the time of 'medium'. 'extraslow' with patches saves another few percent, but takes ~5x longer than 'slow' and uses ~4.5x the memory.
Higher effort is harmful for libjxl.
At very high quality, libjxl's maximum effort produces files 33–40%
larger
than its default effort, and takes ~7x longer.
AVIF's 4:2:0 mode helps at higher qualities.
At SSIMULACRA2 70 and above, it produces files 7–18% smaller than 4:4:4. At lower qualities, it makes no difference.
All three encoders produce higher SSIMULACRA2 scores for this image.
Opposite to the weasel image. But, this seems correct. At SSIMULACRA2 70 the artifacts are pretty noticeable around the Firefox logo (to me, anyway), so I'd go with 80, which is where the codecs lean anyway.
Some developers, especially those who've been around as long as I have, seem to think things like screenshots need to be delivered in a lossless format. But I think this is because they're used to formats like JPEG and WebP (and seemingly JPEG XL) which handle this kind of image badly, whereas lossy AVIF handles them really well.
In many cases, for largely flat-colour images, you'd use SVG. But sometimes that isn't possible (it's a screenshot), or undesirable, such as this case. This image,
also from Unsplash
, is still 1.1 MB as a compressed and minified SVG. This is due to the complexity of the shaded areas. As a result, a raster format wins on file size and decode/draw time.
At quality 50 in the demo above, the jixel has some pretty severe colour blocks, e.g. on the cat's face. Again, it makes me question the metric a bit.
The results of the benchmark:
File size:
AVIF wins
, by a lot.
At default efforts, the best JPEG XL image (jixel) is 32–65% larger than the AVIF image up to SSIMULACRA2 80, and ~90% larger beyond that. At maximum efforts, the best JPEG XL image (jixel 'extraslow') is 22–55% larger than AVIF (s0) up to SSIMULACRA2 80, and more beyond that. ColorVideoVDP agrees, and puts the gap at 27–58%.
libjxl performs particularly badly with this image.
At default efforts, it's 71–106% larger than AVIF.
Lossy AVIF can't reach SSIMULACRA2 90 with this image.
Even at its maximum quality setting, it tops out at ~87, so the 90 example above isn't a totally fair comparison. JPEG XL can reach 90, but the result is 8–50% larger than JPEG XL's lossless version, so you may as well use lossless.
Encode time:
AVIF wins
.
At default efforts, jixel is 35–44% faster than AVIF, but its files are 32–65% larger, which is a bad trade. jixel needs its 'slow' setting to get within 7–27% of AVIF's default file size, which takes 2.4–2.6x as long as AVIF. libjxl's default takes 1.3–2.3x as long as AVIF's default, and produces much bigger files.
Encode memory:
AVIF wins
.
At default efforts, jixel uses ~37% less memory than AVIF, but again, its files are much larger. jixel 'slow' uses about the same memory as AVIF, and 'extraslow' uses ~12x. libjxl's default uses 1.5–3x the memory of AVIF.
Decode time:
AVIF wins
, by a lot.
JPEG XL takes 2–4.6x as long to decode at medium/high quality, narrowing to 1.6–2.1x at very high quality.
Higher effort is more worth it for AVIF on this image.
AVIF's s5 gets you 5–8% smaller files for ~2.7x the encode time, and s0 gets you 14–21% smaller files for 35–48x the encode time.
Higher effort is worth it for jixel, up to 'slow'.
'medium' only gets you 4–13% smaller files than its default 'fast', but 'slow' gets you 19–24% smaller files (up to 36% at very high quality), for ~4x the encode time. 'extraslow' saves another 2–3%, but takes 8–9x longer than 'slow' and uses ~11x the memory.
jixel's patches feature doesn't help with this image.
Unlike the screenshot, the file sizes are identical with and without it, but it does increase encode time and memory.
Higher effort isn't worth it for libjxl.
libjxl's maximum effort gets you 3–9% smaller files than its default, but takes 10–13x longer.
AVIF's 4:2:0 mode doesn't help.
SSIMULACRA2 rates it slightly worse than 4:4:4, and ColorVideoVDP rates it slightly better (~3–4%).
So far, all the images have been mostly opaque. What about an image with transparency?
There are a few things that make this one different:
jixel always encodes the alpha channel losslessly.
It doesn't have a setting for alpha quality. This puts jixel at a big disadvantage with this image. AVIF by default compresses the alpha channel lossily, tracking the main quality setting. libjxl compresses the alpha channel losslessly by default, so watch out for that. For this benchmark, I set libjxl's alpha quality to the same as the main quality.
SSIMULACRA2 scores fully-transparent pixels as perfect
, so with lots of transparency, the scores will be higher than they would be for an opaque image.
The results of the benchmark:
File size:
AVIF wins
, by a lot.
At default efforts, the best JPEG XL image (libjxl) is 31–44% larger than the AVIF image for the same quality. At maximum efforts, it's 61–70% larger. Due to its lossless alpha, jixel is 1.9–3.1x the size of AVIF at default efforts.
Encode time:
AVIF wins
.
libjxl's default takes 1.2–1.35x as long as AVIF's default, and produces much bigger files. jixel's default is ~2x faster than AVIF, but its files are around 2–3x the size.
Encode memory:
AVIF wins
.
libjxl's default uses 2.4–2.7x the memory of AVIF's default, although in absolute terms, that's ~120 MB vs ~46 MB. jixel's default uses about the same memory as AVIF, but again, its files are much bigger.
Decode time:
AVIF wins
.
libjxl's output takes 2–3x as long to decode at medium quality, narrowing to 1.4–1.8x at very high quality. jixel's output decodes faster than libjxl's, and at very high quality it's around the same speed as AVIF. Although, it's slow in Safari at lower qualities, taking ~2.4x as long as AVIF.
Higher effort is worth it for AVIF.
AVIF's s5 gets you 4–7% smaller files for 2.3–2.9x the encode time, and s0 gets you 10–15% smaller files for 24–29x the encode time.
Higher effort barely helps jixel on this image.
'extraslow' only gets you 5–8% smaller files than its default 'fast', for 21–26x the encode time.
Higher effort is harmful for libjxl.
libjxl's maximum effort produces files up to 8%
larger
than its default effort, and takes ~6.5x longer.
AVIF's 4:2:0 mode is harmful.
It produces files 4–27% larger than 4:4:4, and can't get beyond SSIMULACRA2 ~79.
The images so far have been a similar resolution. Are the results different with smaller images?
Not really. The results are pretty similar to the full-size F1 image:
File size:
AVIF wins
, by about the same margin. At default efforts, the best JPEG XL image is 13–18% larger. At maximum efforts, the gap is slightly bigger than the full-size image, at 12–20%.
Encode time & memory:
AVIF wins
, although libjxl's default is now around the same speed as AVIF's default. jixel's default is ~2x faster than AVIF, but its files are 13–18% larger, and this time it uses ~30% more memory. In any case, at default efforts, everything encodes in under 50ms, using under 40 MB, so these differences don't really matter at this size.
Decode time:
AVIF wins
, by a similar margin, but again, everything decodes in a few milliseconds.
Mostly the same story as the regular F1 image, but with a few differences:
File size:
AVIF wins
at medium/high quality, by more than the regular image.
At default efforts, the best JPEG XL image is 18–46% larger, and at maximum efforts, 28–54% larger.
But JPEG XL catches up at very high quality.
Around SSIMULACRA2 85, libjxl's default matches AVIF's default, and at maximum efforts, jixel 'extraslow' is ~6% smaller than AVIF s0. jixel 'slow' is 10–13% smaller than AVIF's default from SSIMULACRA2 80 upwards.
Encode time:
AVIF wins
at medium/high quality, but
JPEG XL (jixel) wins
at very high quality.
AVIF's default takes ~0.5 seconds, whereas libjxl's default takes 1–2 seconds. jixel's default is ~2x faster than AVIF, but at medium/high quality its files are 29–57% larger. At very high quality, that drops to 6–12% larger, which seems like a reasonable trade-off for the speed. And jixel 'slow' produces files around the same size as AVIF s5, while being 33–41% faster.
Encode memory:
AVIF wins
, and the costs are now significant.
AVIF's default uses ~560 MB. libjxl's default uses ~2.5 GB at medium/high quality. jixel's default uses ~35% less than AVIF, and 'slow' uses ~18% less than AVIF s5. At maximum efforts, libjxl uses 5–6.4 GB, and jixel 'extraslow' uses 6.8–8.3 GB.
Decode time:
AVIF wins
at medium/high quality, by a similar margin to the regular image. jixel images take over 5x as long as AVIF to decode in Safari at those qualities. At very high quality, JPEG XL decodes faster than AVIF in Chrome.
Another criticism I've heard levelled at AVIF is that its quality is unreliable. As in, a single quality setting is great for some images, but no good for others, meaning for automatically encoded images, you need to pick a higher quality setting to be safe, resulting in larger file sizes than necessary for some images.
For the images I've looked at so far, I encoded them with
avifenc -q 50
,
cjxl -q 70
, and jixel at quality 80, and recorded the resulting SSIMULACRA2 scores:
The behaviour of the codecs here seems really similar. All produce a range of SSIMULACRA2 scores, and they all go higher or lower for the same images.
And I think this is ok? Like, all three go for a lower quality for the Weasel picture, which removed noise without reducing quality of the image subject. With the screenshot, all go for a higher quality, which seems justified to my eyes.
Obviously this is a small sample size, but I haven't seen anything that suggests using a single quality setting is a risk, for any of the three codecs.
Both AVIF and JPEG XL are capable of showing something progressively as the image loads. Chrome and Firefox support progressive JPEG XL, whereas only Chrome supports progressive AVIF. So, and I say this through gritted teeth, this next demo is best viewed in Chrome (I have
a Firefox patch in progress
):
AVIF: 11.5 kB of 151.3 kB
JPEG XL: 11.5 kB of 166.0 kB
This is the 18 megapixel image again, so if you're viewing this on a device with a smaller screen, you're not getting the full effect.
Progressive AVIF and JPEG XL work very differently. With JPEG XL, you can opt into the data being stored in such a way that a decoder can render low resolution versions, before it brings in the higher resolution tiles. jixel recently (like, yesterday at time of writing) added support for this too. It's called "progressive DC", and it's the most important kind of progressive rendering for JPEG XL.
With AVIF, progressions work more like frames of a video. You provide up to four frames, so that's three phases before the final image. Again, like a video, each frame can use data from the previous frame as an optimisation. An advantage of this is you can choose exactly how those frames look. In the example above, I went with a single preview frame: a 1/8th resolution version, with a bit of blurring. But, your preview frames can be completely different images if you really want.
There's a lack of data when it comes to progressive images and user experience, so these are just my reckons:
If you're on a bad connection, data doesn't arrive gradually like some throttling tools will have you believe. It tends to come in bursts. So, there's little benefit to progressive rendering on smaller images, and I'm not sure that many progressive phases is particularly useful.
I think that it's nice to have a
representative
preview for images that may take some time to load. I've experienced this personally, where a site or app has given me something clearly not-loaded, but with enough detail to know what's coming. That's useful to me, as I can decide things like, if it's worth waiting for the whole thing. This is also why I think things like BlurHash are cute, but useless. They're not a
representative
preview, so there's little a user can do with the information provided.
The preview frame I chose for the AVIF is enough to tell it's an open-wheel race car. If you know F1, you'll know what team it is. You might even know where the photo was taken. And it delivers that in ~11.5 kB.
The JPEG XL gets a BlurHash-like preview on screen in ~2 kB, but it takes until ~63 kB to match the preview quality of the AVIF. After that, it continues to improve gradually, providing a more detailed and higher quality image as more data arrives.
However, I'm not convinced this is a good user experience, as it presents the user with something they may mistake for fully-loaded, but poor quality. For example:
Here's a crop of the JPEG XL, 80% loaded. It seems reasonable that someone would look at that, and just assume I took the picture badly, leaving parts out of focus. You could probably convince me that blurring the ApeCoin logo is a societal benefit, but it still feels like a suboptimal user experience.
AVIF's system gives me more control, but it's also more complex.
I encoded the large F1 image with and without progressive rendering enabled, adjusting the quality setting to keep the SSIMULACRA2 score around 70:
With libjxl, progressive is basically free.
In fact, it produced files 6–10% smaller. At default effort, it was also faster to encode, and used less memory. Decoding was ~10% faster in Firefox, but 12–20% slower in Chrome and Safari.
With jixel, it depends on the effort.
For jixel, I used progressive DC, with the centre of the image loading first. At jixel's default ('fast'), progressive made the file 12% bigger. At 'extraslow', it made the file 10% smaller, and 11% faster to encode, although it used 17% more memory. Decoding was barely affected, other than being 7–9% slower in Chrome.
But ColorVideoVDP is less kind to progressive jixel.
It rates jixel's progressive files slightly lower than the non-progressive versions, whereas it rates libjxl's progressive files slightly higher. Taking that into account, progressive jixel at 'extraslow' is only ~2% smaller than non-progressive, and at 'fast' it's around 18% bigger.
Regular progressive AVIF has a bigger cost when it comes to encoding.
It uses around twice the memory, and at default effort (s6), it takes twice as long to encode. At s0, encode time is only 9% longer, but the file is 14% bigger. And this is pure encode time - it doesn't factor in how you might generate the preview frame, e.g. adding some blur.
Regular progressive AVIF is 29–44% slower to decode in Chrome
, although the difference is smaller in other browsers (6–15%). Since Chrome is the only browser that supports rendering the progressive frames, that might explain it. Although Firefox and Safari are still having to decode the progressive frame, as the main image builds upon it.
With AVIF, making the final frame a keyframe fixes the decoding overhead
, at the cost of a longer encode time. At maximum effort, it results in a smaller file too, only 3–5% bigger than the non-progressive version. You could call this cheating, as there's now no 'progression' in terms of data - it's just two images in one. But, if it's a better user experience, who cares?
Even with the overhead, progressive AVIF wins on decoding time, and usually on file size.
The progressive AVIFs are 152–181 kB. jixel's 'extraslow' progressive JPEG XL is in that range at 166 kB, but jixel's default produces 252 kB, and libjxl's progressive files are 233–242 kB. The AVIFs decode 1.6–6x faster, with the biggest gap in Safari, which is particularly slow to decode jixel's files.
Let's get back to lossy compression, but this time HDR! There are a few ways to encode HDR images, and we're going to look at two.
Perceptual Quantization
(PQ) tells each pixel what to be. Each value maps to an absolute brightness, up to 10,000 nits, with the curve shaped so the data is spent where our eyes are most sensitive. If the image asks for colours and brightnesses the display can't show (no consumer display can hit 10,000 nits), the browser/OS has to tone-map it down, and how well that's done varies between platforms.
Gain maps
are different. The main image is a regular SDR image (usually), and alongside it is a 'gain map', which applies a brightness and colour change to each pixel to achieve the HDR version.
This has two benefits:
The same image will look exactly as you want on an SDR display - the gain map is simply ignored.
If the display supports HDR, but maybe not as much as the image needs (for example, the screen is at low or maximum brightness), the browser/OS can apply as much of the gain map as it can handle.
CSS and
<picture>
let us serve an SDR or PQ image to the user via
the
dynamic-range
media query
, but then you're relying on tone mapping in cases where the browser signals HDR support, but it doesn't support the full range.
Although the JPEG XL format supports gain maps, no browser handles them, and the encoding story is messy.
AVIF supports gain maps, and you encode them by providing two images: the SDR image and the HDR image. It uses those to calculate and encode the gain map.
Your browser/screen doesn't support HDR
, so the PQ images will look bad.
At medium brightnesses, on an HDR screen, the gain map and PQ images look the same. At maximum brightnesses, on my Pixel 10 Pro and 2024 MacBook Pro, the PQ images get a bit blown out, and the gain map image looks better. At low brightness on my Pixel 10 Pro, again the gain map image looks better.
This is because, at extreme brightness levels, the device doesn't have the full HDR headroom to display the image, and gain maps can handle these cases better. So, although gain maps seem to add a lot to the file size, I think it's worth it.
Maybe there's a future where tone mapping gets much better, and the advantage of a gain map becomes less significant.
Regular SSIMULACRA2 only understands SDR, so for this image, the scores come from an experimental HDR mode in
fast-ssim2
. That means these scores can't be compared to the SSIMULACRA2 scores elsewhere in this article. ColorVideoVDP handles HDR natively, and here it's modelling a 1,500 nit HDR monitor.
The two metrics disagree a lot with this image
. And they don't factor in the benefits of gain maps, so treat these results as a comparison between the PQ variants:
File size:
JPEG XL wins
, but the metrics disagree on how much, and with which encoder.
According to HDR SSIMULACRA2, jixel's default ranges from 8% smaller to 3% larger than PQ AVIF's default, and libjxl is 5–33% larger. At maximum efforts, jixel 'extraslow' is up to 15% smaller than PQ AVIF s0.
According to ColorVideoVDP, libjxl is the clear winner. At default efforts, it's 28–53% smaller than PQ AVIF, and 17–37% smaller than gain map AVIF. At maximum efforts, it's up to 23% smaller than the best AVIF, but jixel 'extraslow' is roughly level with it, ranging from 12% smaller to 14% larger.
The metrics also disagree about gain maps.
HDR SSIMULACRA2 says gain map AVIF is 31–38% larger than PQ AVIF, but ColorVideoVDP says gain map AVIF is 11–25%
smaller
than PQ AVIF.
Encode time:
JPEG XL (jixel) wins
.
At default efforts, jixel is ~2x faster than PQ AVIF, and produces files around the same size or smaller, depending on the metric. libjxl's default is 5–47% slower than PQ AVIF, but given ColorVideoVDP's view of the file sizes, that's a reasonable trade. Gain map AVIF is the slowest, as it's calculating a gain map, then essentially encoding two images: ~3x slower than PQ AVIF.
Encode memory:
JPEG XL (jixel) wins
.
At default efforts, jixel uses ~30% less memory than PQ AVIF. libjxl's default uses ~1.9x the memory of PQ AVIF, and gain map AVIF uses ~1.55x. At maximum efforts, libjxl uses ~6x the memory of PQ AVIF's default, and jixel 'extraslow' uses ~10x.
Decode time:
AVIF wins
.
PQ and gain map AVIF decode at around the same speed. JPEG XL takes 1.2–1.7x as long to decode in Chrome, although it's slightly faster at the top of the quality range. In Safari, it takes 1.6–3x as long. Firefox is particularly slow with these HDR JPEG XL images, taking ~4x as long as AVIF at all qualities. We're
working on it
.
Higher effort is worth it for AVIF.
For gain map AVIF, s5 gets you 9–12% smaller files for ~1.9x the encode time, and s0 gets you 14–20% smaller files for ~11x the encode time. For PQ AVIF, s0 gets you 14–19% smaller files, for 17–20x the encode time.
Higher effort is worth it for jixel, up to 'slow'.
'slow' gets you 7–32% smaller files than its default 'fast', for ~3.8x the encode time. 'extraslow' saves another 1–9%, but takes ~10x longer than 'slow' and uses ~8.5x the memory. jixel only has a few data points for this image, so these numbers are rough.
Higher effort isn't worth it for libjxl.
libjxl's maximum effort gets you 2–7% smaller files than its default, but takes ~15x longer.
It will be interesting to see how JPEG XL handles gain maps once they're fully supported.
JPEG XL allows you to convert an existing JPEG to JPEG XL without additional loss. I tested this with the F1 image at a range of sizes and JPEG qualities:
The JPEG XL is 9–20% smaller than the JPEG.
The saving grows with resolution, from ~9% at 400 pixels wide to ~20% at 4,900 pixels wide. The saving is slightly smaller at higher JPEG qualities. libjxl and jixel produce practically identical file sizes.
For small images, JPEG XL is slower to decode than JPEG
, taking 1.4–2.7x as long, depending on the browser. But it's just a millisecond or two.
For larger images, JPEG XL is faster to decode in Chrome and Safari.
From ~1,000 pixels wide, it matches JPEG, and at the largest sizes, it decodes in around half the time. In Firefox, it ends up around the same speed as JPEG.
jixel's output is slightly slower to decode than libjxl's
in Chrome and Firefox, by up to ~25%. But again, these are small numbers, at most a few milliseconds.
Of course, if you have the original, you'd be way better off creating a proper new lossy version with AVIF or JPEG XL, but it's pretty cool that the JPEGs end up smaller, and sometimes faster to decode. Although, I suppose this is just pointing to a missing optimisation in browser JPEG decoders.
It is very rare to need lossless images on the web. As we've already seen, even for things like screenshots and illustrations, lossy AVIF handles them really well. Ironically, this page is one of the outliers, because I wanted to show the compressed versions vs their lossless counterparts. Thankfully, JPEG XL is great at lossless!
The results:
File size:
JPEG XL wins
.
At default efforts, libjxl produces the smallest files for every image except the illustration, where WebP matches it. WebP is 9–17% larger for photos, and AVIF is 33–122% larger. At highest efforts, libjxl and jixel are within a few percent of each other, WebP is 5–44% larger, and AVIF is 29–176% larger.
Encode time:
JPEG XL wins
.
libjxl's default takes 0.1–0.5 seconds, which is faster than WebP's default, and similar to AVIF's default, while producing smaller files than both.
Encode memory:
JPEG XL wins
or
WebP wins
, depending on the image.
WebP's default uses around half the memory of libjxl's default (55–110 MB vs 110–250 MB), but libjxl's files are smaller. For photos, WebP can't match libjxl's default file size even at its maximum effort, which uses more memory than libjxl's default. For the screenshot, they use around the same memory, but libjxl's file is smaller. The illustration is the exception: WebP's maximum effort produces a file 20% smaller than libjxl's default, using the same memory.
Decode time:
WebP wins
or
JPEG XL wins
, depending on the image.
WebP decodes photos in 17–39 ms in all browsers, and the screenshot in ~5 ms. libjxl's output takes 1–2.2x as long in Chrome, 1.4–2.7x as long in Firefox, and 2.1–3.2x as long in Safari. But for photos, JPEG XL's smaller files more than make up for this on a first load, unless the connection is really fast. For the screenshot and illustration, WebP's decode advantage wins. Lossless AVIF is particularly slow to decode, taking up to 4x as long as libjxl's output in Chrome.
Lossless AVIF is bad.
It's significantly larger than the others, and slower to decode.
jixel's 'medium' setting is the sweet spot for file size.
It beats libjxl's default on every image (0.5–23% smaller), and is within 2–3% of the best result for photos, taking 0.4–0.7 seconds. But it uses 470–670 MB of memory, and its output is slower to decode than libjxl's, particularly in Safari.
jixel's 'slow' and 'extraslow' output is very slow to decode for photos.
~200–290 ms, compared to 22–95 ms for libjxl's output. That's 2–13x slower, depending on the browser. It's also slow for the alpha image, at 80–123 ms compared to 14–27 ms for libjxl's output. This doesn't happen with the screenshot and illustration. This means, for my use-case on this page, I'd avoid it.
libjxl's maximum effort is very slow.
It produces files 2–7% smaller than its default for photos, and ~25% smaller for the screenshot and illustration, but takes 9–46 seconds, which is 50–180x as long as its default. jixel gets the same results in a couple of seconds.
jixel's default 'fast' setting isn't great for lossless.
It's the fastest encoder by far (40–80 ms), but its files are 16–32% larger than libjxl's default for photos, and ~80% larger for the screenshot and illustration.
jixel's patches feature helps a bit with the screenshot
(4–9% smaller), but makes no difference to the illustration.
Animated image formats are dumb and animated JPEG XL is no exception. Video formats are better at video. They're built for it. They're optimised for it. Not just in terms of encoding, but also in terms of playback.
I encoded a short clip, and the animated AVIF was 725 kB, and the JPEG XL was 2.17 MB for the same ColorVideoVDP score (9.5).
The JPEG XL is super noisy compared to the AVIF, because each frame is encoded individually, and arttifacts land in different places per frame.
AVIF is basically the keyframe format of AV1 video, with a bunch of still-image-specific optimisations thrown in. Animated AVIF however, is pretty much just a repackaging of AV1 video. You can convert an AV1 MP4 to AVIF and back losslessly - it's just a container change. That's why it performs so much better, because it's built for motion.
However, animated AVIF plays like shit in Chrome and Safari. It's fine in Firefox, so this is purely an implementation problem. But…
<video muted autoplay>
is right there.
I already gave you my
conclusions
at the start, so I guess I'm ready to hit publish.
I'm a little nervous about this, because discourse around JPEG XL can get a little… weird. I see a lot of conspiracy theories about Google trying to 'silence' JPEG XL, even though one of the leads of the project worked at Google, as part of a team that were working on JPEG XL. That
same leader claimed
that the post-COVID layoffs wouldn't have happened if companies simply used JPEG XL. I was recently
called a racist
for asking about JPEG XL use-cases. This kind of thing just doesn't happen with other technologies and standards I follow. So, urm, I'm kinda bracing for impact here.
My first version of this article was very negative about JPEG XL, but then I heard about jixel, and honestly, I'm really excited about it. There's serious competition between AVIF and JPEG XL now, and whoever wins, we'll all benefit from better image compression.
US Rep Announces Congressional Legislation to Protect Video Game Ownership
Today,
Rep. Ritchie Torres
(NY-15) announced he will introduce the
Power To The Players Act
, legislation that would direct the Federal Trade Commission to establish regulations protecting consumers’ ability to own and play the video games they purchase.
Over the past few years, video game companies have moved toward digital-only games and consoles, removing the option to buy or use physical games. These digital games are often sold as revocable licenses rather than owned outright, leaving players dependent on the company’s continued support. NBA 2K25 is a clear example. The game, which retailed for $69.99 for the standard edition and $99.99 for the All-Star Edition, will be delisted from digital storefronts on October 30 and will have its online servers shut down on December 31, only two years after its initial release. No consumer should have a game they paid for pulled out from under them on a company’s arbitrary timeline.
“When you pay for a game, you should own it,” said Rep. Torres. “Consumers must have the right to own, the right to play, and the right to transfer the games they buy. A game that can be taken away the moment a company pulls the plug is not a purchase. It is a rental disguised as a sale. Families in the Bronx and across the country save up to buy these games, and they deserve better than a license that can vanish at any time. The Power To The Players Act ensures consumers own what they buy and can keep playing long after a company moves on.”
Under the bill, buying a video game would give the consumer ownership of the game rather than a license to play it. Games with online functionality would also be required to provide an offline mode before the servers supporting them are shut down.
The legislation aims to close the gap between buying a game and owning it. By preserving consumers’ ability to own and resell their games, the bill would ensure that players can keep playing the games they paid for with friends and family for years to come.
America's Wumao: Inside Polymarket's Paid Quote-Retweet Esports Program
Screenshots from X; minor background elements by Sonny Ross
❝
As I mentioned last week, I’ve launched a
paid tier of the newsletter
. All the money coming from subscriptions will go toward reporting and publishing, covering costs associated with legal review, public records, web hosting, mail, software subscriptions, business admin, travel, and (silliest of all) buying new games.
My next newsletter (which will be available
exclusively to paid subscribers
) is going to be a follow-up to this report, going into why I think prediction markets’ growing influence is worth covering and taking a much broader view of the issue, beyond just the reporting. If that sounds interesting, consider upgrading your subscription. I’ll also include some outtakes from this story: reporting that just didn’t make sense for this particular piece.
Lastly, I want to thank Ollie Ring for his help as I was reporting this newsletter. Ollie writes the
Lootboxes & Leftovers
newsletter
on Substack. Check it out. And much love to Riley MacLeod of
Aftermath
,
where this story will be reprinted later today, for editing this piece.
Once more, but tiny: Thanks for reading!
Polymarket, the prediction market platform, is paying social media users to quote-retweet content from its branded esports accounts. The program includes over 800 participants, according to posts by a Polymarket representative in an internal Discord, and offers rates ranging from $10 to several hundred per post, paid in crypto.
Paying social media users to engage with content is not illegal, and the Polymarket program has robust guidelines around disclosure and the kinds of quote retweets the company is looking for. But the slight “Paid partnership” tag on X — a common sight on the app, and the only public indication that there’s money changing hands — belies the scale and sophistication of Polymarket’s esports operation, which has more than doubled in size since August. And all the while, in the Discord, Polymarket representatives have repeatedly reminded participants in the program to write posts in a way that should appear “organic,” in what one expert said was an effort to ingratiate the prediction market with esports fans and casual observers.
“Literally this needs to look organic and if your X profile looks like Polymarket billboard that looks absoutely [sic] awful,” wrote one Polymarket rep in the Discord.
Polymarket offers two products: Polymarket Global, which is inaccessible to bettors in the United States, and Polymarket US, which is subject to U.S. regulations. In esports —
a growing market for the company
— Polymarket offers lines around the outcomes of major events and matches, player statistics, as well as novelty bets, including some relating to the teams that players might transfer to in the off-season.
1
The prediction market company’s esports outreach is something of an open secret in the esports world — with an emphasis on “open.” Some social media users have expressed dismay over the increasing prevalence of gambling and betting-adjacent companies in the esports scene, having previously been burnt by “here today, gone tomorrow” attention from deep-pocketed crypto companies and venture capital firms. But while elements of the paid marketing program have
previously
been
reported
, little concrete information has been revealed until now about the logistical apparatus behind it, the costs involved, and the Discord server from which the program is run — even as the payments by Polymarket to creators have inspired speculation and debate among esports fans.
Emails to Polymarket’s official press line seeking comment, as well as direct messages to numerous Polymarket representatives from the Discord seeking interviews, went unanswered.
A list of participants in the Discord includes prominent esports commentators, current and former professional players, team coaches and managers, media entrepreneurs and content creators, PR professionals, amateur roster reporters, employees of esports tournament organizers, and various social media gadflies.
When figures like that quote-retweet posts like
the one embedded below
with a sentence or two of commentary, they may be receiving tens or even hundreds of dollars in compensation.
Still, many of the posters paid to quote-retweet Polymarket’s content are virtual unknowns, with low four-figure follower counts on X.
Prospective participants in the marketing program are typically contacted via social media or email. If they show interest in continuing the conversation, they’re brought into a Polymarket Discord server. In that server, dedicated channels for individual esport titles ping users about the tweets they should quote-retweet — which generally focus on
some ongoing event or storyline
, and the corresponding market on which users can bet, which is linked to in the post.
“New tweet is up: Like + QRT. Replies appreciated,” reads a typical message, which includes a link to the tweet. “Text-only quote from your own account. Counts for the next 24 hours only.” These messages used to also include the phrase “+ Paid Partnership tag,” urging users to disclose their participation in the program. That text has not appeared on the Discord prompts since late August, for reasons that were not immediately clear.
Users are concurrently onboarded to a proprietary tool called PolyTrack, a dashboard into which they can input their tax information, crypto wallet address, and eventually, the quote-retweets for which they will be paid. The platform tracks monthly and lifetime earnings, and offers guidance about the kinds of posts that meet the program’s criteria.
While this report is exclusively focused on Polymarket’s promotional efforts on X, PolyTrack also includes the option to input video and streaming platforms.
The amount users are paid is negotiated upon entry into the program, and is based on how many views their tweets generally received before entry. The payout is not determined by engagement metrics on the paid quote-retweets.
“Someone averaging 2,000 views can't ask for $50 per post, and the same logic works the other way,” wrote a Polymarket rep in the Discord last week, when discussing the process of onboarding new posters. “That holds no matter who you are in the scene. The only exception is Tier 1 casters, talent, creators and players, who can get higher rates because of how well known they are.”
Two users who spoke with
ReaderGrev
showed fees of $45 and $75 per post. Another participant described negotiating a fee in the $200-300 range. One user shared with
ReaderGrev
a PolyTrack screenshot showing that they made nearly $900 in just one month from approximately a dozen posts.
Two other participants in the program said payouts bottomed out at $10; one of them added that they had heard that $400 was the upper end of the range. Program members are paid in crypto; in a July post in the Discord, a Polymarket rep said the team had phased out an earlier payment method, PayPal, because its accounts kept “getting blocked” due to the high volume of payments.
The program offers users other opportunities to make money. “When you bring someone into the program, you earn 3% of what they make, every month, for as long as they stay in the program,” wrote one Polymarket representative in the Discord.
The program appears to be growing — and fast. At the start of August, one Polymarket representative said on Discord that “300+ creators” were participating in the program. Two months later, a different representative put the tally at “800+.”
Still, the company’s scattershot approach to outreach has on multiple occasions drawn the ire of creators who oppose gambling or betting.
“I don't ever reply to gambling sponsor outreach so I just delete and move on,” said Cloud Sidky, a
League of Legends
content creator who was approached by Polymarket in September. “I'm personally against sports betting, and even more against prediction markets.”
The exact cost of the program to Polymarket is difficult to estimate. The platform’s four esports accounts on X differ in size, and there are varying numbers of creators in each game’s program. The
DotA 2
program has offered just one post for paid promotion in October, one in September, and two in August. The
League of Legends
,
Valorant
, and
Counter-Strike
programs, by contrast, have shared nearly one post per day in the past few weeks, with
Valorant
activity ramping up around the Champions event that marks the end of the game’s annual competitive circuit. On Wednesday, a Polymarket rep in the Discord server sought to hype up participants in the lead up to Worlds, the year’s capstone
League of Legends
event, saying they could expect more posts to come up for promotion each day. (He appended a
🤑
emoji to his message, and told users to post “plenty in between so it looks organic if your gonna QRT daily.”)
Polymarket’s total payout to creators per post for the more popular programs likely numbers in the four digits. A conservative estimate — assuming that the bulk of posters are being paid on the lower end of the spectrum — places the payout between $2,000 and $4,000 per post. These estimates are almost certainly an undercount; the figure can swing dramatically based on the number of highly-paid users engaging with any individual post. Just a few creators with a hundred or several-hundred dollar fee can dramatically increase the cost to Polymarket.
Posts linked to the paid quote-retweet program see substantially more engagement — particularly quote retweets — than other posts from the Polymarket branded accounts.
Polymarket’s approach to social media — paying influencers in the space to engage with its content — is a shortcut to reaching an endemic audience without having to build that audience from scratch, said Jake Steinberg, a writer and adjunct professor of social media strategy at Villanova University.
“If I follow 10 esports accounts and all 10 independently appear to be talking about something like Polymarket over the course of a few days or a week, then Polymarket has maybe successfully bought this kind of repeated exposure to me,” Steinberg said. “Even if I don't click anything, that actually does become valuable [to Polymarket], because I am becoming familiar with the name and what the product does, and the idea that Polymarket is relevant in this world that I am interested in.”
“That's a very different effect on me as the viewer” compared to a normal advertisement, Steinberg added.
In a document shared with users during onboarding, Polymarket instructs creators to clearly disclose their relationship with the platform.
“The disclosure must be clear, conspicuous, in plain language, and not hidden,” according to a document titled External Marketing Guidelines. At a glance, many of the quote-retweets of Polymarket-branded esports posts include the default X “paid partnership” disclosure tag.
The document also prohibits users from recommending trades.
“Polymarket’s Consultants are not investment advisors and recommendations from Consultants as to specific trades or trading strategies exposes both Polymarket and the Consultant to legal risk,” the document reads. “A verbal disclaimer that ‘this is not financial advice’ does not solve this problem and such a disclaimer is insufficient to eliminate the risk of legal action.”
The document continues: “A Consultant may discuss his or her own trades (assuming he/she has actually made such trades) and the rationale for making those trades but may
never
suggest or recommend that others make the same trade.” The bolding and underlining on “never” are present in the document.
PolyTrack, meanwhile, offers guidance around what makes a good post — and what doesn’t.
Post “your own take, reaction, or analysis. One sharp sentence beats a generic line every time,” reads one of the “Do This” bullet points.
“Post in your normal voice and give people a reason to reply,” reads another. “Questions and hot takes start conversations.”
By contrast, users are told to avoid low-effort and off-topic captions: “‘wow’, ‘crazy’, or a row of emojis … underperform and stand out in review for the wrong reason.”
“Staff review every caption,” the guidelines note. “Strong, on-topic captions help submissions get verified faster and maintain a high standard across the program.”
Though prediction markets have drawn scrutiny from some corners, some participants in the program have defended Polymarket’s model.
“I feel fine participating because Polymarket has no house edge or VIG,” wrote Justin “Trick” Sears, a former professional
Valorant
player, in a direct message, referring to fees charged by bookmakers.
Sears added that he had turned down a $50,000 six-month deal offered to him by another “active company in the space” because the company offered slots on their website. “Prediction markets are PVP thats the way i look at it,” he wrote.
“I’m honestly not sure why people treat this as some sort of scandal. It’s all very above-board,” said another user who has posted content sponsored by Polymarket, and who requested anonymity because they are not a representative for the company. “The quote RTs are all flagged as promotion as is the original tweet. I don’t know how it could be more clear. If there is a complaint it should be on Twitter’s side regarding how paid advertising is handled on the platform.”
Prediction market activity in esports has surged over the past two years, in part because the bigger sportsbooks see esports as a niche and sometimes even unappealing offering relative to traditional sports.
“The appetite was always there for people to bet” in esports, said Ollie Ring, who writes the
Lootboxes & Leftovers
newsletter, which has covered the intersection of gaming and gambling. “What then came is an influx of people who saw money and went: ‘I need a piece of that.’”
But when that first wave of interest happened, the product wasn’t ready, Ring said. “The development wasn't there. The data deals, the integrity structure, all of it around it wasn't ready for the amount of people that came in wanting a slice of this proverbial pie. … [Now,] operators are like: ‘I don't want to touch esports because we tried it in 2018, nine, eight years ago and it lost us a load of money.’ … And sportsbooks don't like losing money. They like your typical fluffy NFL parlays where people put 12 teams in an accumulator and then lose their money.”
Prediction markets, by contrast, “offer the first real opportunity to address the market at a national level, and I think there is a lot of overlap, or at least more overlap, [between] prediction markets and esports than traditional betting and esports,” wrote Cody Luongo, a media consultant who authors the
Sharpr
newsletter, in a direct message. Luongo said the former category leaned “younger, hipper, crypto-native.
Riot Games, which publishes
League of Legends
and
Valorant
and runs the two games’ esports circuits, has
reportedly
held discussions with Polymarket and Kalshi, a competing prediction market company, about esports sponsorship deals.
Thanks for reading
ReaderGrev
! Consider sharing it with a friend, on Discord, Twitter, LinkedIn, or even a subreddit where folks might appreciate it. Word of mouth helps this newsletter grow!
If you have a tip, I can be reached
on Bluesky
or via email at mikhail (at) readergrev (dot) com.
1
This final category is vanishingly small — in the low single digits — according to an analysis by Ollie Ring.
Postgres 19 delayed after AI reviewers find more bugs than humans can fix
Core devs revert up to 10 features, push release to November, and blame better tooling rather than vibe coding
The PostgreSQL Global Development Group has delayed the release of PostgreSQL 19, the latest iteration of the popular open source database, and held back an unusual number of features.
Once slated for release in late September or early October, PostgreSQL 19 is now expected to be generally available around November 19. Developers have also dropped between eight and 10 significant features.
Explaining the number of reverts — features whose rollouts have now been postponed to next year's release, PostgreSQL 20 — Peter Eisentraut, veep at EDB, a PostgreSQL support and consultancy, said the reason could be at least in part attributed to the LLM code reviews used by developers.
In
a blog post,
Eisentraut, who is a leading PostgreSQL committer, said some of the reverted features had significant architectural defects that would have been hard to fix "quickly and during beta."
However, the introduction of LLM-assisted code review also uncovered a long tail of “relatively harmless issues involving various edge cases” which, in past times, developers might not have noticed until much later, most likely issuing bug fixes in the five years following launch. “With LLM-assisted code review, these kinds of things can get found much faster, and then you’re staring at a list of forty defect reports. Even if each of them requires only a three-line fix on average, there is a fixed overhead to dealing with each of these, and then you run out of time.”
When the big updates for PostgreSQL 19 were written, LLM-assisted code review was not as useful as it is now, we're told, but in the months leading up to the launch, the AI-supported reviews became better understood and more effective.
“The effective quality bar has been raised after the time the feature was written and committed. Unless the capabilities of LLM-assisted code review keep improving at the current rate, this situation should sort itself out for future development cycles,” Eisentraut said.
He was also at pains to point out that the reverts were not down to “vibe coding” in development, as the technique was not available when most of the new features were written.
Postgres was
first proposed
by Michael Stonebraker in 1986. In 1994, Andrew Yu and Jolly Chen replaced the query language POSTQUEL with SQL, and in 1995 made the database freely available and modifiable under a more permissive license, renaming it PostgreSQL. It has since become the most popular database among professional developers owing to the services the big three hyperscalers built on it as well as the range of wire-compatible distributed systems available.
Among the features pulled from the PostgreSQL 19 iteration is support for SQL Property Graph Queries (SQL/PGQ), which became part of the SQL standard in 2023. The feature provides syntax for exploring relationships between nodes connected by edges. PostgreSQL's implementation was removed over unresolved issues.
At the time,
PostgreSQL contributor Tom Lane warned
: "At this point I'd be willing to bet dinner that if we ship it in v19 there will be post-release bug discoveries that are unfixable until v20."
Despite the delay, Eisentraut promises PostgreSQL 19 will still be “a great release,” that includes
REPACK CONCURRENTLY
, which avoids the table-lock
VACUUM FULL
operation used to reclaim disk space.
“And it will be very robust, after all the additional scrutiny,” he said.
The features reverted from PostgreSQL 19 will likely make it into PostgreSQL 20. Just a few months ago, developers expected PostgreSQL 20 to have no new features, just bug fixes. Now, it is likely to have the new features left over from the earlier release, Eisentraut said.®
Podcast: Cops Can Use AI to Pinpoint Your Home with Just One Photo
403 Media
www.404media.co
2026-10-16 11:40:44
How Raven, previously known as Geospy, can now find which house a photo was taken in; why a judge ruled a Flock search unconstitutional; and the wild AI video in a court case....
How Raven, previously known as Geospy, can now find which house a photo was taken in; why a judge ruled a Flock search unconstitutional; and the wild AI video in a court case.
Image: 404 Media.
We start this week with Joseph’s article about Raven, previously known as Geospy. This is an AI tool that can geolocate photos, and now says it can pinpoint a specific house based just on one photo taken inside. After the break, Jason explains why a judge ruled a particular Flock search as unconstitutional. In the subscribers-only section, we talk about the wild AI video that has derailed a manslaughter case.
Listen to the weekly podcast on
Apple Podcasts
,
Spotify
, or
YouTube
. Become a paid subscriber for access to this episode's bonus content and to power our journalism.
If you become a paid subscriber, check your inbox for an email from our podcast host Transistor for a link to the subscribers-only version! You can also add that subscribers feed to your podcast app of choice and never miss an episode that way. The email should also contain the subscribers-only link for the extended video version too. It will also be in the show notes in your podcast player.
Joseph is an award-winning investigative journalist focused on generating impact. His work has triggered hundreds of millions of dollars worth of fines, shut down tech companies, and much more.
Show HN: OneDeploy – Managed open-source apps with nightly backups and TLS
The apps your team wants, on a server that’s
only yours
Pick an app, a region and a plan. OneDeploy creates the server, installs the app, issues the certificate and backs it up every night.
Billed by the hour, with a monthly cap.
Delete anytime and billing stops.
No per-user fees
Nightly backups included
Delete anytime
88 apps, and the list keeps growing
Websites, chat, files, CRM, analytics, AI and developer tools. Each one deploys the same way.
A dedicated virtual server that runs only your app. It comes with a web address, a TLS certificate, an admin account, and scheduled backups.
How does billing work?
You add credit to your account with an online payment. Each service is charged to that balance by the hour while it exists. Each plan has a monthly cap, so a full month never costs more than the price you saw before deploying. We warn you before the balance runs out. If it reaches zero, your services are deleted and their backups stay restorable for about 14 days.
Can I use my own domain?
Yes. Add a domain in the service settings, create the DNS record we show you, and verify it. We issue the certificate.
Can I change the server later?
Yes. Resize in the same region, or migrate to another region or cloud. Your data and domains move with the app.
What happens to my backups?
Backups are encrypted and stored off-site. Storage up to twice the disk size is included. You can restore in place or into a new service.
Do I pay per user?
No. You pay for the server, not for seats. Invite as many people as the app supports. We install the open-source edition of every app; some makers sell paid editions separately.
Do I need to know how to run a server?
No. Deploying, updates, backups, certificates, domains and resizing all happen from the dashboard. You never touch the server unless you want to.
A story of WiFi secrets, UART lockdowns and a damaged flash memory chip
Dear Fell
owl
ship, just as we announced in our previous post, our beloved God Debugger has seen fit to cast his divine light -laden with opcodes- upon his humble servant, and we have a new homily here in our temple. Please, take a seat and listen to the story of how one of our owls, along with his brother-in-law, moved on to dissect the next component of the Eufy ecosystem: the Eufy HomeBase 2.
We focused our analysis in Eufy Homebase2 instead of Homebase3 because, as we explained in
From your doorbell to your home network
it’s the version that I found deployed in my city, and also was the easiest to buy. The firmware version we analyze here is
3.4.2.2h (2026-06-05 18:45:48)
This is the first time I touched something related to “hardware”. I always did vuln hunting on firmwares that I could download from internet, so please forgive the sins I commited
IMPORTANT!!!
You must read first the previous article before you continue reading this one.
Table of contents
Just as with the previous article, we will be covering a variety of topics here; consequently, some members of this fellowlship may have no interest in certain sections and might wish to skip straight to whatever appeals to them most. That is why we present this blessed offering: a table of contents.
0x00 Firmware extraction
. Description of how the firmware was extracted (and how we damaged part of the flash memory).
0x04 Final Words
. I share the lack of enthusiasm for writing articles in the age of AI.
In the
previous chapter of this saga
, I mentioned that we were only able to extract the doorbell’s firmware because the Homebase’s flash memory was soldered directly to the board and did not expose any pins to which we could attach test hooks to dump the firmware. Initially we did not want to desolder it (although in the end we had to as I will explain later) so I had to wait to acquire additional hardware.
Craig S. Blackie
pointed me to spring clips that would suit the size needed for the Winbond 25Q256JWEQ (WSON8 8.6mm). Once the clip arrived I created the most makeshift setup imaginable, using rubber bands to secure the clip while I proceeded to take readings using the Raspberry Pi’s SPI0 interface, just as we did with the doorbell.
Setup using rubber bands to read the firmware.
I performed three reads and the three had different checksums, which usually is a indicator of something being wrong. After inspecting the dumps, I quickly realized they were garbage and completely useless. Unlike with the doorbell, in this case, the power supplied for the read operation also activated other components on the board that interacted with the memory; therefore, to extract the firmware, we had to desolder the chip and read it off-board.
My brother-in-law (
Óscar Lestón
) was the brave soul that desoldered the flash memory (I was too scared to even try it):
Desoldering
Although the memory module looked terrible once removed, it was barely damaged…
Extracted flash memory
And finally we replicated the same setup using the Raspberry Pi SPI 0 to dump the firmware. This time the three dumps had the same checksum and contained “interesting data”. The only problem was… a block of 64kbs was erased / could not be read, highly probable because we damaged it when extracting the chip.
Using the Raspberry Pi to read the chip off-board
Most of the firmware could be extracted using Binwalk.
Some parts were recovered, others no. Because there was a lot of XS streams, we choose the stupid (or maybe not so stupid) idea of using directly
7z
to extract all in a big blob (and hopefully search by needles there to carve files).
➜ extractions mkdir-p 7z_mandanga
➜ extractions 7z e -y-o7z_mandanga homestation2_firmware00.bin
7-Zip 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20
64-bit locale=es_ES.UTF-8 Threads:16 OPEN_MAX:1024
Scanning the drive for archives:
1 file, 33554432 bytes (32 MiB)
Extracting archive: homestation2_firmware00.bin
ERRORS:
There are data after the end of archive
--
Path = homestation2_firmware00.bin
Type = xz
ERRORS:
There are data after the end of archive
Offset = 3022226
Physical Size = 11514432
Tail Size = 19017774
Method = LZMA2:17
Streams = 358
Blocks = 358
Characteristics = BlockPackSize BlockUnpackSize
ERROR: There are some data after the end of the payload data : homestation2_firmware00
Sub items Errors: 1
Archives with Errors: 1
Open Errors: 1
Sub items Errors: 1
➜ extractions ls-hal 7z_mandanga
total 42M
drwxrwxr-x 2 psyconauta psyconauta 4,0K sep 19 19:41 .
drwxrwxr-x 4 psyconauta psyconauta 4,0K sep 19 19:34 ..
-rw-rw-r-- 1 psyconauta psyconauta 42M sep 19 18:35 homestation2_firmware00
0x01 Identifying the Wifi credential generation algorithm
One of the key questions we wanted to investigate via the firmware was the new algorithm for generating credentials for the
OCEAN_XXXXXX
management Wi-Fi, as we observed that it differed completely from what was expected based on the 2024 paper. Specially, we were interesting in know if the algorithm was weak as previously or no.
After writing the previous article, I realized I had failed my brother-in-law as a mentor. I had shown him how to use Ghidra and pseudo-C instead of leading him down the path of light and reason. I atoned for my sin and drew radare2.
First we checked where the Wifi network ESSID and password could be found in the firmware. A simple
grep
was enough to identify NVRAM variables containing both wifi names and credentials (the ad-hoc wifi used to enroll the doorbell and the mangement wifi):
Then we tried a more broad search to try to identify binaries and/or scripts related to the wifi setup:
➜ 7z_mandanga strings homestation2_firmware00 | rg 'OCEAN_'
%s,<%d>file not exist.return OCEAN_TEST_TF_CARD_NOT_FOUND.
OCEAN_MAGIC
out of memory of OCEAN_TEST_DATA
OCEAN_TF_CARD_FORMAT_SUCCESSED
OCEAN_TF_CARD_FORMAT_FAIL_MOUNT
OCEAN_TF_CARD_FORMAT_FAIL
OCEAN_TF_CARD_FORMAT_IN_USE
ssid_prefix="OCEAN_"ssid_prefix="OCEAN_"CONFIG_LEDS_OCEAN_PWM=y
OCEAN_RUN=/mnt/ocean.sh
if[-f$OCEAN_RUN];then
chmod +x $OCEAN_RUN
sh $OCEAN_RUN &
Unraveling a bit more this thread we found an interesting line that matches what we already knew: the ESSID is the concatenation of “OCEAN_” and MAC address:
➜ 7z_mandanga strings homestation2_firmware00 | rg 'ssid_prefix'-B30-A40
.sdata
.sbss
.bss
.pdr
.gnu.attributes
.mdebug.abi32
#!/bin/shwork_mode="`cat /var/run/testmode`"def_mode="`nvram_get 2860 work_mode`"SSID_MAC=""nvram_ssid="`nvram_get 2860 SSID1`"bssid_num=`nvram_get 2860 BssidNum`eth_state=`apcliDaemon get_eth_state`repeater_enable=`nvram_get 2860 RepeaterEnable`wifi_11bgn_enabled=`nvram_get 2860 wifi_11bgn_enabled`Wireless_Mode=9
if["$eth_state"="0"-a"$repeater_enable"="1"-a"$wifi_11bgn_enabled"="1"];then
Wireless_Mode=9
get_wifi_mac()SSID_MAC="`ifconfig ra0 | grep HWaddr | awk'{print $5}' | awk-F':''{print $4$5$6}'`"#SSID_MAC="`ifconfig ra0 | grep HWaddr | awk '{print $5}' | awk -F ':' '{print $5$6}'`" while["$SSID_MAC"=""]sleep 1
SSID_MAC="`ifconfig ra0 | grep HWaddr | awk'{print $5}' | awk-F':''{print $4$5$6}'`"#SSID_MAC="`ifconfig ra0 | grep HWaddr | awk '{print $5}' | awk -F ':' '{print $5$6}'`"done
echo"get mac in ssid is:$SSID_MAC"if["$bssid_num"="2"];then
ifconfig ra1 down>/dev/null 2>&1
if["$work_mode"="1"];then
ssid_prefix="ocean_factory_"if["$def_mode"="factory_mode"];then
ssid_prefix="OCEAN_"
get_wifi_mac
WIFI_SSID=$ssid_prefix$SSID_MACecho"set wifi SSID:$WIFI_SSID"
iwpriv ra0 set SSID="$WIFI_SSID"if["$def_mode"="factory_mode"];then# only WIFI_SSID is not equ nvram_ssid, update nvram.if["$nvram_ssid"!=$WIFI_SSID];then
nvram_set SSID1 $WIFI_SSIDfi
else
ssid_prefix="`nvram_get ssid_pre`"if["$ssid_prefix"=""];then
ssid_prefix="OCEAN_"
get_wifi_mac
WIFI_SSID=$ssid_prefix$SSID_MACecho"set wifi SSID:$WIFI_SSID"# only WIFI_SSID is not equ nvram_ssid, update nvram.if["$nvram_ssid"!=$WIFI_SSID];then
nvram_set SSID1 $WIFI_SSID
iwpriv ra0 set SSID="$WIFI_SSID"if["$nvram_ssid"="MT7628_AP"];then
sleep 3
#reboot
/sbin/umount_and_reboot.sh
fi
iwpriv ra0 set HtBw=0
iwpriv ra0 set WirelessMode=$Wireless_Mode
iwpriv ra0 set HtGi=0
iwpriv ra0 set SCSEnable=1
if["$bssid_num"="2"];then# ssid and pwd set in RT2860_default_vlan#iwpriv ra1 set SSID="AKDevbind"#iwpriv ra1 set WPAPSK="Anker39#*"#iwpriv ra1 set SSID="XMCONFIG"#iwpriv ra1 set WPAPSK="12345678"
iwpriv ra1 set HtBw=0
iwpriv ra1 set WirelessMode=$Wireless_Mode
iwpriv ra1 set HtGi=0
iwpriv ra1 set SCSEnable=1
iwpriv ra1 set WmmCapable=1
iwpriv ra1 set ed_chk=0
wpapsk="`nvram_get WPAPSK1`"if["$wpapsk"!=""];then#echo "iwpriv ra0 set WPAPSK=$wpapsk"
iwpriv ra0 set WPAPSK=$wpapsk# set wmm
iwpriv ra0 set WmmCapable=1
# change wan mode,
wifi
apcli
iwpriv
home_security
if["$eth_state"="0"-a"$repeater_enable"="1"];then
switch_wan_interface.sh eth2.2 apcli0 0
#!/bin/sh
So, from one side we found how the ESSID is created and from the other side we found that the password is read from a NVRAM variable (
wpapsk="nvram_get WPAPSK1"
). Let’s do a quick search with that name:
➜ 7z_mandanga strings homestation2_firmware00 | rg -i'WPAPSK1'-A5-B5
wifi channel:%d.
fail to get freq.
/dev/gpio
Error while opening /dev/gpio
SSID1
WPAPSK1
SSID2
ra1 SSID=%s
WPAPSK2
ra1 WIFI_PWD=%s
/sbin/chpasswd.sh eufycamera %s
--(...)
Just in the first hit there is something that looks like a compiled binary (that
%d
is suspicious). I built this crappy script to extract the elf that search for the string, then search backwards to find the magic header and assume the following file in the blob is also an ELF:
Jumping into that function we can see that first it builds a password based on a MD5 hash that is used locally for the user
eufycamera
and it’s not related to the wifi. The wifi-stuff starts at
0x0053b690
where it checks one parameter from
base_param
(I guess the type of device or model) against 0x0C. This part is key because if the value is different to 0x0C, then it uses the MAC Address (right block) meanwhile if it matches then it would use what returns
z8GetSN()
(left block). We are in the
z8GetSN()
case.
Different flow based on device model.
The
z8GetSN()
function communicates through i2c and sends command
0xC1
(the i2c part is inside
z8SendData()
) and read 0x11 bytes from the response.
I2C communication to extract a serial number (it's not the device SN)
Then bytes are translated into 32 byte string and fed to a function called
mac_func()
which also receives the Homebase Serial Number (
T8010...
):
The SN from the I2C communication and the device Serial Number (obj.g_hub_sn) used as parameters for mac_func()
This
mac_func
calls a helper to perform HMAC SHA256 with the previous mentioned data, being the “message” the value returned by
z8GetSN
and the “key” the Serial Number:
HMAC SHA256
The result is used by a function that would encode the information into text.
Encoding memory contents
The
zx_Memory_Encode
function calls
urlsafe_b64_encode
which converts the value into base64 using the following alphabet:
Finally, the password is updated in NVRAM and changed executing the external command
iwpriv ra0 set WPAPSK=%s
:
Updating NVRAM value
So, the only unkown data to replicate the password is the value returned by
z8GetSN
. The other compontent, the device serial number, is “predictable” because it follows a known template based on the type of device.
0x02 Rubber-hose treatment to the UART lockdown
In the previous article, we mentioned that UART access was blocked. Specifically, connecting via UART yielded a prompt asking the user to press the “Enter” key. However, doing so caused the process to terminate and the same program to relaunch, once again requesting the key press; this created an infinite loop that prevented access to an actual shell. Logs can be seen below:
starting pid 5617, tty '/dev/ttyS1': '/sbin/login.sh'
process '/sbin/login.sh' (pid 5617) exited. Scheduling for restart.
Please press Enter to activate this console.
setrlimit(RLIMIT_CORE, &limit);
starting pid 6526, tty '/dev/ttyS1': '/sbin/login.sh'
process '/sbin/login.sh' (pid 6526) exited. Scheduling for restart.
Please press Enter to activate this console.
setrlimit(RLIMIT_CORE, &limit);
starting pid 6608, tty '/dev/ttyS1': '/sbin/login.sh'
process '/sbin/login.sh' (pid 6608) exited. Scheduling for restart.
On the other hand, trying to interrupt U-Boot witch a escape sequence did not work.
After acquiring the firmware and resolving questions about how the Wi-Fi password algorithm worked, the next objective was to understand the mechanism behind the UART access lockout and find a way to bypass it, as we intended to use the device itself to debug key services and search for vulnerabilities.
In the logs the serial port is
/dev/ttyS1
, so let’s search references to it:
➜ extractions grep-r ttyS1
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin: coincidencia en fichero binario
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin_3143840_aes_forward_table.raw: coincidencia en fichero binario
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin_3679760_unknown.raw: coincidencia en fichero binario
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin_3135648_aes_reverse_table.raw: coincidencia en fichero binario
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin.extracted/3F16A4/decompressed.bin: coincidencia en fichero binario
homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin.extracted/3F16A4/decompressed.bin.extracted/0/etc_ro/inittab:ttyS1::askfirst:/sbin/login.sh
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin.extracted/3F16A4/decompressed.bin.extracted/0/bin/recover_0_elf.raw: coincidencia en fichero binario
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin.extracted/3F16A4/decompressed.bin.extracted/0/bin/recover: coincidencia en fichero binario
homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin.extracted/3F16A4/decompressed.bin.extracted/0/sbin/makedevlinks.sh:mknod /dev/ttyS1 c 4 65
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin.extracted/3F16A4/decompressed.bin_0_cpio.raw: coincidencia en fichero binario
grep: homestation2_firmware00.bin.extracted/E70000/Linux_Kernel_Image.bin.extracted/0/decompressed.bin_3147936_aes_rcon.raw: coincidencia en fichero binario
grep: 7z_mandanga/homestation2_firmware00: coincidencia en fichero binario
The key is in the
inittab
file, where we can see the it triggers the execution of
/sbin/login.sh
script once the user press “Enter” (the BusyBox
askfirst
action shows the prompt with sentence “Please press Enter to activate this console”). The script is simple as:
#!/bin/shDEBUG_LOG="`nvram_get debug_log`"if["$DEBUG_LOG"="1"-o-f"/mnt/enable_console"];then
echo"enter debug mode"> /dev/console
/bin/login
fi
The script checks if debug mode is enabled by checking the NVRAM variable
debug_log
and based on that allows the access to the shell (well, to login in the shell) or exits, entering in the loop.
We did not find a straight way to enable that variable and bypass the lockdown. There are various ways on changing the boot mode to enable “debug”, but all of them are far away from our hands because:
One of them is based in the presence of a file in the filesystem. Because to be able to drop a file we would need access, it is a chicken-egg situation.
The other method involves a convoluted magic protocol based on ARP and commands signed by a private key which is not present in the firmware. Yes, they use encapsulate their own protocol on ARP and exchange magic signed packets to enable debug remotely. I am not sure what crack they smoked.
It occurs to me at this point that if we can not bypass the check for whether it is booting in production or debug mode, why not completely obliterate the check and jump straight to a shell?
The firmware did not contain anything encrypted, so should be straight forward to modify it to allow us direct access through the serial port. The problem was… Do you remember when I mentioned that it was “barely damaged”?. Well, we fucked 64kbs at
0x500000
which is the load address for the image.
At first, I thought our clumsy hands had ruined the project and that the idea of using the actual device for dynamic analysis with a debugger was slipping away (we would still have the option of trying to emulate some binaries, but having access to the original hardware is always infinitely easier). Fortunately, after analyzing the firmware layout a bit more, we discovered a much smaller “recovery image” that was still intact at
0xe70000
. So, because the “normal” image was fucked, the bootloader would have to load this recovery image that we can manipulate to remove the UART lockdown.
The actual filesystem is inside a matrioska of different compression layers that can be visualized in the following diagram:
Matrioska!
Once the filesystem was unpacked, I made the minimal changes to allow us to jump directly to the shell with root privileges. To avoid headaches, I padded the modifications to match the same size it had the original code (code is from python script I used to perform the modifications and re-pack/fix CRCs):
After doing some local test to verify that the modified recovery image was correctly modified and it would unpack/load correctly we proceeded to overwrite it in the flash chip. In order to disable the
Write Protection that appears in the documentation
this connection diagram was followed:
Diagram to disable Write Protection
Writing the new recovery image:
Overwriting the recovery image with our backdoored version
Then we performed three reads to verify the process was done correctly. After that, the chip was solded again into the device board:
Soldering again the chip
Once the chip was soldered I connected again my laptop to the device using a USB-TTL. First it tried to load the normal image, but it failed and then it jumped to backdoored recovery image and after loading it… we got a shell!!
Finally access to an admin shell!!
0x03 Filesystem gardening for debugging purposes
We finally have a shell; the only problem is that the recovery image is very limited and the file system is not mounted, so the binaries and libraries needed to properly debug the system are missing. Furthermore, the kernel lacks certain modules-such as those responsible for handling WiFi interfaces or the I2C interface used to generate the WiFi key.
The set of commands available in the default image is quite limited, but at least there are tools like
wget
, which allows us to transfer files from the laptop to the device. I prepared a crappy setup using an old TP-Link router that I got from Telefónica in 2015.
Not glamorous setup
I compiled a new BusyBox with loads of extra commands that were not present in the original one. Using this new BusyBox I started to try to create a “staged” filesystem and bind all the paths to this “staged” filesystem. I had to execute services needed to run before the big ELF in charge of main services (
homeapp_security
, the same binary that contained the WiFi logic), also because of memory limitations I had to modify some kernel parameters like
overcommit_ratio
. It was a three hours process of hit and miss until I could run the main binary and be able to interact with it.
Because this was a process that I would need to repeat each time I wanted to use the device (because the filesystem in the recovery image is not persistent, so after each boot I have to restore all) I shared the logs of
picocom
to Codex and asked it to prepare a all-in-one script that would repeat the same steps I did (and discard the stuff that didn’t work). To be honest, the following morning after that night of playing with the Homebase I barely remembered what I did, so having the logs was marvelous to rebuild and automatize the process. Keep logs of everything always, they will save your ass at some point.
The diagram of actions until the
homeapp_security
runs is the following:
Flow diagram from the patched firmware to getting the binary running
The two most important scripts to rebuild the filesystem are shown below:
#!/bin/sh# Recovery UART bootstrap. Run with sh; do not source into the login shell.# Usage: sh homeapp-restore-v5.sh [http://PC:8000] [--start]PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
unset LD_PRELOAD LD_LIBRARY_PATH
BASE=/media/homeapp-debug
ROOT=$BASE/rootfs
SERVER=http://192.168.90.112:8000
START=no
fail(){echo"homeapp-restore: $*">&2;exit 1;}for argument in"$@";do
case"$argument"in
http://*)SERVER=${argument%/};;--start)START=yes;;*) fail 'usage: sh homeapp-restore-v5.sh [http://PC:8000] [--start]';;esacdone
case"$SERVER"in*' '*|*'?'*|*'#'*) fail 'use a plain HTTP base URL without spaces/query/fragment';;esac["`awk'/^Uid:/ {print $3}' /proc/self/status`"= 0 ]|| fail 'root effective UID required'[-r /proc/self/mountinfo ]|| fail '/proc/self/mountinfo is required'[-c /dev/gpio ]&&[-c /dev/apsoc_nvram ]|| fail 'expected recovery device nodes missing'
mounted(){awk-vp="$1"'$2==p {n++} END {exit n==0}' /proc/mounts;}
check_tmpfs(){awk-vp="$1"-vsize="$2"'$2==p {
n++; if ($3=="tmpfs") {
count=split($4,a,","); for(i=1;i<=count;i++) if(a[i]=="size=" size "k") ok=1
}
} END {exit !(n==1 && ok)}' /proc/mounts
}
empty_dir(){[!-e"$1"]&&return 0
[-d"$1"]&&[!-L"$1"]||return 1
[-z"`ls-A"$1"`"]}
asset_md5(){# BEGIN GENERATED ASSET HASHEScase"$1"in
busybox-extra)echo b587f623ef28b84e277fbd1b2b0b2348 ;;
homeapp-enter)echo 8fde5ed1e3e65d07a7b9ebe672b25a5c ;;
homeapp-mount-runtime.sh)echo 19e73a1584137c0d2150d6968cccb4c5 ;;
homeapp-start-bounded-v4.sh)echo 19b70b8ac6751f8e161e490460ff8f3e ;;
homeapp-control-v5.sh)echo 2fc7613db0f02a0d16c1417bb0282264 ;;
homeapp_rootfs.tar.gz)echo bf6acaecf3301532bda2c1f6c41a3b2c ;;*)return 1 ;;esac# END GENERATED ASSET HASHES}
verify(){expected=`asset_md5 "$1"`|| fail "unknown asset: $1"actual=`md5sum"$2" | awk'{print $1}'`["$actual"="$expected"]|| fail "checksum mismatch: $2; stop and check the PC bundle"}
fetch(){asset=$1echo"homeapp-restore: downloading $asset"
wget -O"$BASE/$asset.part""$SERVER/$asset"|| fail "download failed: $asset; partial setup preserved"
verify "$asset""$BASE/$asset.part"mv"$BASE/$asset.part""$BASE/$asset"|| fail "cannot finish $asset"}
stamp(){awk'{sub(/^.*\) /, ""); print $20}'"/proc/$1/stat" 2>/dev/null;}
is_supervisor(){[-r"/proc/$1/cmdline"]||return 1
tr'\000''\n' < "/proc/$1/cmdline" | awk'
NR==1 {shell=($0=="sh" || $0=="/bin/sh" || $0=="/sbin/run_mini_system.sh")}
$0=="/sbin/run_mini_system.sh" {script=1}
END {exit !(shell && script)}'}
recover_pids(){for procdir in /proc/[0-9]*;do[-e"$procdir/exe"]||continue
if["$procdir/exe"-ef /bin/recover ]||["$procdir/exe"-ef /sbin/recover ];then
echo"${procdir#/proc/}"fi
done}
signal_recover(){for recover_pid in`recover_pids`;do
if["/proc/$recover_pid/exe"-ef /bin/recover ]||["/proc/$recover_pid/exe"-ef /sbin/recover ];then
kill"-$1""$recover_pid" 2>/dev/null || :
fi
done}
coordinate_recovery(){# Exact argv matching avoids accidentally signalling grep or the UART shell.for procdir in /proc/[0-9]*;do
supervisor_pid=${procdir#/proc/}if is_supervisor "$supervisor_pid";then
supervisor_stamp=`stamp "$supervisor_pid"`[-n"$supervisor_stamp"]||continue
kill-STOP"$supervisor_pid"|| fail "cannot pause recovery supervisor $supervisor_pid"echo"$supervisor_pid$supervisor_stamp">"$BASE/recovery-supervisor-$supervisor_pid"echo"homeapp-restore: paused recovery supervisor $supervisor_pid"fi
done
signal_recover TERM
sleep 2
signal_recover KILL
sleep 1
[-z"`recover_pids`"]|| fail 'recovery tasks survived stop'
pidof recover >/dev/null 2>&1 && fail 'unrecognized recover process remains; inspect ps'return 0
}
install_commands(){for asset in homeapp-mount-runtime.sh homeapp-start-bounded-v4.sh homeapp-control-v5.sh;do
verify "$asset""$BASE/$asset"done# Rename new files into place: never truncate a script a running shell# may still be reading during a repeated preparation command.for asset in homeapp-mount-runtime.sh homeapp-start-bounded-v4.sh homeapp-control-v5.sh;do
destination=/tmp/$asset["$asset"!= homeapp-control-v5.sh ]||destination=/tmp/homeapp
cp"$BASE/$asset""$destination.part.$$"|| fail "cannot copy $asset"chmod 755 "$destination.part.$$"|| fail "cannot mark $asset executable"mv"$destination.part.$$""$destination"|| fail "cannot install $asset"done}echo'homeapp-restore revision: v5; original firmware applications, RAM staging'if[-f"$BASE/restore-v5.ready"];then# Reusing this recipe's completed setup is safe; never extract over binds.
check_tmpfs "$BASE" 65536 || fail 'staging mount changed or is stacked'
check_tmpfs /media/mmcblk0p1 8192 || fail 'database mount changed or is stacked'
verify homeapp-enter "$BASE/homeapp-enter"
verify busybox-extra "$BASE/busybox-extra"
install_commands
sh /tmp/homeapp-mount-runtime.sh --resume|| fail 'runtime mount verification failed'
coordinate_recovery
echo'homeapp-restore: verified and reused completed setup; no archive download/extraction'else# Fail closed on partial/manual setups; no rm -rf, unmount or overlay of data.
mounted "$BASE"&& fail 'unrecognized/partial staging mount; inspect it or reboot before retrying'
empty_dir "$BASE"|| fail 'staging directory is not empty; preserve it and inspect or reboot'
mounted /media/mmcblk0p1 && fail 'database/storage path already mounted; will not cover it'
empty_dir /media/mmcblk0p1 || fail 'database/storage directory is not empty; will not cover it'free_kb=`awk'/^MemFree:/ {print $2}' /proc/meminfo`["${free_kb:-0}"-ge 81920 ]|| fail 'less than 80 MiB free; reboot to a fresh recovery shell or inspect memory'# Refuse existing normal services before staging/coordination.for service in home_security mdnsd mips_collector pushMuxer systemServer embdb_eufy;do
pidof "$service">/dev/null 2>&1 && fail "$service already running; use a fresh recovery boot"done
original_mode=`cat /proc/sys/vm/overcommit_memory`original_ratio=`cat /proc/sys/vm/overcommit_ratio`if["$original_mode"= 2 ]&&["$original_ratio"-lt 75 ];then
echo 75 > /proc/sys/vm/overcommit_ratio || fail 'cannot raise runtime commit ratio'echo"homeapp-restore: strict overcommit ratio $original_ratio -> 75 (this boot only)"fi
if["$original_mode"= 2 ];then
headroom=`awk'/^CommitLimit:/ {limit=$2} /^Committed_AS:/ {used=$2} END {print limit-used}' /proc/meminfo`["$headroom"-ge 65536 ]|| fail 'less than 64 MiB commitment headroom; no extraction attempted'fi
mkdir-p"$BASE"|| fail 'cannot create staging directory'
mount -t tmpfs -osize=64m tmpfs "$BASE"|| fail 'cannot mount staging tmpfs'
check_tmpfs "$BASE" 65536 || fail 'unexpected staging filesystem size'echo"$original_mode$original_ratio">"$BASE/original-overcommit"echo"$SERVER">"$BASE/download-server"for asset in busybox-extra homeapp-enter homeapp-mount-runtime.sh homeapp-start-bounded-v4.sh homeapp-control-v5.sh;do
fetch "$asset"done
chmod 755 "$BASE/busybox-extra""$BASE/homeapp-enter"|| fail 'chmod failed'"$BASE/homeapp-enter"--check|| fail 'native helper does not run'
fetch homeapp_rootfs.tar.gz
(cd"$BASE"&& ./busybox-extra tar-xzf homeapp_rootfs.tar.gz)|| fail 'extraction failed; preserve diagnostics, then reboot before retrying'# Only the verified temporary archive is removed, before any runtime binds.rm"$BASE/homeapp_rootfs.tar.gz"|| fail 'cannot remove staged archive'"$BASE/homeapp-enter""$ROOT" /bin/sh -c':'|| fail 'normal loader/BusyBox does not execute'mkdir-p /media/mmcblk0p1 || fail 'cannot create database path'
mount -t tmpfs -osize=8m tmpfs /media/mmcblk0p1 || fail 'cannot mount temporary database'
check_tmpfs /media/mmcblk0p1 8192 || fail 'unexpected database filesystem size'mkdir-p /media/mmcblk0p1/.sqlite || fail 'cannot create database directory'
install_commands
sh /tmp/homeapp-mount-runtime.sh --apply|| fail 'runtime mount setup failed; earlier mounts preserved'
coordinate_recovery
echo v5 >"$BASE/restore-v5.ready"|| fail 'cannot record successful setup'fi
echo'homeapp-restore: READY. /tmp/homeapp start|status|logs|stop|shell'echo'Wi-Fi/I2C drivers and persistent flash configuration are not restored by userspace staging.'df-k"$BASE" /media/mmcblk0p1
if["$START"=yes];then
/tmp/homeapp start || fail 'setup completed, but application startup failed; inspect /tmp/homeapp status'fi#!/bin/sh# Run with `sh`, never source into the interactive UART shell.# Does not start services, mount flash, or change memory policy.PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
BASE=/media/homeapp-debug
ROOT=/media/homeapp-debug/rootfs
fail(){echo"homeapp-mount: $*">&2;exit 1;}
mounted(){awk-vp="$1"'$2 == p {found=1} END {exit !found}' /proc/mounts;}
same_mount_root(){# Compare device ID and filesystem-root path, not just the filesystem type.awk-vs="$1"-vd="$2"'
$5 == s {source=$3 " " $4}
$5 == d {target=$3 " " $4; count++}
END {exit !(count == 1 && source != "" && source == target)}
' /proc/self/mountinfo
}case"${1-}"in--inspect)echo'--- Mounts ---'cat /proc/mounts
echo'--- Memory ---'cat /proc/meminfo
echo'--- Overcommit mode / ratio ---'cat /proc/sys/vm/overcommit_memory /proc/sys/vm/overcommit_ratio
echo'--- Staged executables ---'ls-l"$BASE/homeapp-enter""$ROOT/bin/busybox""$ROOT/bin/home_security"echo'--- Processes ---'
ps
exit 0
;;--apply|--resume)mode=$1;;*) fail 'usage: sh homeapp-mount-runtime.sh --inspect|--apply|--resume';;esac
mounted "$BASE"|| fail 'staging filesystem is not mounted'[-x"$BASE/homeapp-enter"]|| fail 'native helper missing'[-x"$ROOT/bin/home_security"]|| fail 'application missing'
mounted /media/mmcblk0p1 || fail 'prepare temporary database mount first'[-d /media/mmcblk0p1/.sqlite ]|| fail 'database directory missing'# Resume only matching binds, with one mount at each staged destination.# Leave staged /mnt (including its original zx_log.conf) in place. Recovery's# /mnt bind failed in the first attempt; persistent state is a separate step.for path in dev proc sys etc var tmp media dev/pts media/mmcblk0p1;do
if mounted "$ROOT/$path";then["$mode"=--resume]|| fail "$ROOT/$path already mounted; inspect partial setup first"
same_mount_root "/$path""$ROOT/$path"|| fail "existing bind does not match /$path, or is stacked: $ROOT/$path"fi
done
bind_path(){source_path=$1target_path=$2if mounted "$target_path";then
echo"homeapp-mount: keeping verified bind $target_path"return 0
fi
mkdir-p"$target_path"|| fail "cannot create $target_path"echo"homeapp-mount: $source_path -> $target_path"
mount -obind"$source_path""$target_path"rc=$?["$rc"-eq 0 ]|| fail "mount exited $rc: $source_path -> $target_path (earlier mounts preserved)"
mounted "$target_path"|| fail "mount returned success but $target_path is absent from /proc/mounts"
same_mount_root "$source_path""$target_path"|| fail "unexpected mount root at $target_path"}for path in dev proc sys etc var tmp media;do
bind_path "/$path""$ROOT/$path"done
bind_path /dev/pts "$ROOT/dev/pts"
bind_path /media/mmcblk0p1 "$ROOT/media/mmcblk0p1"echo'Runtime binds completed; no application services started.'
Then running it from the UART shell we can see it prepares everything and also launch the binary:
# wget -O /tmp/homeapp-restore-v5.sh http://192.168.90.112:8000/homeapp-restore-
v5.sh
Connecting to 192.168.90.112:8000 (192.168.90.112:8000)
homeapp-restore-v5.s 100% |*******************************| 9174 --:--:-- ETA
# sh /tmp/homeapp-restore-v5.sh http://192.168.90.112:8000 --start
homeapp-restore revision: v5; original firmware applications, RAM staging
homeapp-restore: strict overcommit ratio 50 -> 75 (this boot only)
homeapp-restore: downloading busybox-extra
Connecting to 192.168.90.112:8000 (192.168.90.112:8000)
busybox-extra.part 100% |*******************************| 673k --:--:-- ETA
homeapp-restore: downloading homeapp-enter
Connecting to 192.168.90.112:8000 (192.168.90.112:8000)
homeapp-enter.part 100% |*******************************| 622k --:--:-- ETA
homeapp-restore: downloading homeapp-mount-runtime.sh
Connecting to 192.168.90.112:8000 (192.168.90.112:8000)
homeapp-mount-runtim 100% |*******************************| 3054 --:--:-- ETA
homeapp-restore: downloading homeapp-start-bounded-v4.sh
Connecting to 192.168.90.112:8000 (192.168.90.112:8000)
homeapp-start-bounde 100% |*******************************| 4383 --:--:-- ETA
homeapp-restore: downloading homeapp-control-v5.sh
Connecting to 192.168.90.112:8000 (192.168.90.112:8000)
homeapp-control-v5.s 100% |*******************************| 6488 --:--:-- ETA
homeapp-enter: running;uid=0 euid=0; static MIPS helper
homeapp-restore: downloading homeapp_rootfs.tar.gz
Connecting to 192.168.90.112:8000 (192.168.90.112:8000)
homeapp_rootfs.tar.g 100% |*******************************| 14579k 00:00:00 ETA
homeapp-mount: /dev -> /media/homeapp-debug/rootfs/dev
homeapp-mount: /proc -> /media/homeapp-debug/rootfs/proc
homeapp-mount: /sys -> /media/homeapp-debug/rootfs/sys
homeapp-mount: /etc -> /media/homeapp-debug/rootfs/etc
homeapp-mount: /var -> /media/homeapp-debug/rootfs/var
homeapp-mount: /tmp -> /media/homeapp-debug/rootfs/tmp
homeapp-mount: /media -> /media/homeapp-debug/rootfs/media
homeapp-mount: /dev/pts -> /media/homeapp-debug/rootfs/dev/pts
homeapp-mount: /media/mmcblk0p1 -> /media/homeapp-debug/rootfs/media/mmcblk0p1
Runtime binds completed; no application services started.
homeapp-restore: READY. /tmp/homeapp start|status|logs|stop|shell
Wi-Fi/I2C drivers and persistent flash configuration are not restored by userspace staging.
Filesystem 1k-blocks Used Available Use% Mounted on
tmpfs 65536 44844 20692 68% /media/homeapp-debug
tmpfs 8192 0 8192 0% /media/mmcblk0p1
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/dev
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/proc
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/sys
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/etc
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/var
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/tmp
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/media
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/dev/pts
homeapp-mount: keeping verified bind /media/homeapp-debug/rootfs/media/mmcblk0p1
Runtime binds completed; no application services started.
homeapp: launcher PID 5880; startup output: /media/mmcblk0p1/homeapp-launch-5565.log
homeapp: startup in progress; /tmp/homeapp status and /tmp/homeapp logs
A running launcher is not proof of application or enrollment readiness.
The last thing was compiling a compatible version of GDB and upload it to the device to start playing
:)
GDB running on the Homebase2
Of course far more configurations changes are needed to make the binary work properly (e.g. I had to bridge an
eth
interface to create a
br0
within the range it needs for the peers -long story short: it uses a peer table with MAC addresses to reject or accept communications), but with a debugger everything is far more easy. Just fire the process, check what fails, correct it or just hook it to feed with the values it’s expecting to continue the flow.
0x04 Final words
With the arrival of LLMs, I’ve lost all enthusiasm for publishing technical content. I’ve been publishing articles online since 2007 sharing things I learned or discovered using dozens of different aliases across various blogs and forums. That is nearly 20 years. And today, I’ve lost all desire to share my experiences.
For one thing, there is the loss of value in writing if no one is going to read it. Nowadays, only a minority of people actually stop to read an article; most ask an AI for a summary or simply skim through without paying attention. There used to be an ecosystem where people spent time checking their RSS feeds (damn, I’m old) and reading articles from their favorite blogs or authors. The first major blow in this regard came from social media, where immediacy and “scoring Twitter points” became the primary driving force behind content creation.
Then there is the fact that the vast majority of published articles are generated directly by AI. Even interesting research pieces or vulnerability write-ups are churned out by automated looms, using that lobotomized language that gives me a stroke every time I try to read them. People seem delighted to gobble up such insubstantial crap. I suppose because it follows that first point. I write in “broken English” (yep, even though I’ve been working for a UK company for five years, my English is still terrible), yet I would a million times rather read an article written by a person in “broken English” than the umpteenth repetition of the same structures and stock phrases ChatGPT peppers its texts with.
The final nail in the coffin is the fact that… does it even make sense in 2026 to keep publishing technical content for human readers? In the past, you’d read a lot of material (or even bookmark it for future reference) because it was genuinely useful. Perhaps you were tinkering with a product’s firmware that someone else had already explored; you could find that article and follow the trail they blazed. The same applied to vulnerability analysis: you’d read about others’ work so you could replicate it when you encountered a similar scenario. And I’m not just talking about specific products; I’m talking about methodologies: how someone solved a problem, allowing you to face the same situation years later and apply what you had read back then. With AI, this no longer makes sense; the world is turning into a collection of meat proxies prompting the latest LLM to resolve whatever snag or situation arises.
I obviously use AI in my professional work, but not to tackle my “hobby” projects (like the things I post on this blog). I need to clarify that last point: I use it, for instance, when I’m reverse-engineering something and come across a function that performs mathematical operations (like when I used it in the previous article to identify Reed-Solomon), or to automate a task I’ve already performed manually (e.g., in this very article, I used it to build a script based on commands I had executed and that were recorded in the log). I thoroughly enjoy my hobby, and I don’t want automation to rob me of those hours spent banging my head against the wall trying to figure something out, or that moment of pleasure when the penny drops and I have a “eureka” moment.
About a decade ago I remember reading Matasano’s cryptochallenges and this sentence stuck in my head since then:
Breaking repeating-key XOR (“Vigenere”) statistically is obviously an academic exercise, a “Crypto 101” thing. But more people “know how” to break it than can actually break it
.
I guess now we live in the world where everyone
knows how to ask the LLM to hack something
instead of actual
knowing how to hack something
.
As usual, feel free to give us feedback at our twitter
@AdeptsOf0xCC
(although I lost the password and can’t access to the account anymore
:D
).
iPhone Duo Pre-Orders Launched, and Three Hours Later It’s Sold Out Through the End of January
Daring Fireball
www.macrumors.com
2026-10-16 11:19:28
Joe Rossignol, MacRumors:
If you were hoping to surprise someone with an iPhone Duo for
Christmas, you might be out of luck, as Apple’s online store in
the U.S. is already showing an estimated shipping date of January
25 for all configurations following the start of pre-orders today.
It is poss...
It is possible that some Apple Stores will have the iPhone Duo available for walk-in customers on Friday, October 23 launch day, but it seems likely that inventory will be very tight. For customers interested in reserving an Apple Store pickup slot, Apple's online store now says to check back on Saturday, October 24 for this.
Friday September 18, 2026 9:51 pm PDT by
Juli Clover
Apple hardware engineering VP Tom Marieb spoke with TechRadar and shared some candid thoughts about Apple's upcoming iPhone Duo.
The iPhone Duo uses a matte nano-texture display, which is meant to cut down on glare and minimize the visibility of the crease. When asked if the iPhone Duo's crease would be more visible over time, as that's what tends to happen on other foldables, Marieb said...
Apple on Instagram today shared a curated gallery of six photos shot on the iPhone Duo. The photos were shot by American photographers Jake Michaels and Jason Nocito, as part of a project commissioned by Apple.
iPhone Duo is equipped with four cameras:A rear 48-megapixel Fusion Main camera
A rear 48-megapixel Ultra Wide camera
A front 12-megapixel Center Stage camera in the outer display
A...
The iPhone Duo is reportedly facing production difficulties ahead of its October launch, with early output expected to be limited.
A person said to be close to Foxconn's supply chain told China's Jiemian News that final assembly yields for Apple's first foldable iPhone were only slightly above 60% as of September 17. The source said that, under Apple's current quality standards, it could...
Waymo is officially heading to Canada! We’re laying the groundwork for our fully autonomous ride-hailing service in Toronto, investing in local facilities and jobs, with the goal of welcoming our first riders in 2028.
In the coming days, you’ll start to see Waymo vehicles on the streets of Toronto as we begin driving manually. We are taking a rigorous, phased, safety-first approach starting with high-definition mapping of local street networks and testing with trained autonomous specialists behind the wheel. This validation period will ensure the Waymo Driver adapts seamlessly to Toronto’s distinct driving conditions.
“Expanding into Canada marks an important milestone in Waymo’s global journey,” said Waymo co-CEO Tekedra Mawakana.
“Toronto is one of the world’s great cities — innovative, diverse, and forward-looking. We’re proud to bring the Waymo Driver to Canada’s largest city and to partner with the vibrant business, arts and cultural communities that share our commitment to safer streets and more accessible mobility.”
To serve Toronto, we’re partnering with Element Fleet Management, a Toronto-headquartered company and global leader in intelligent fleet and mobility solutions that will provide end-to-end fleet management services. Together with Element and our partners, we’ll invest in hundreds of roles over time spanning fleet maintenance, validation driving, customer service, and other operations functions that support our service. This deep partnership builds on Waymo’s existing ties to Canada, which includes our long-term investor relationship with the
Canada Pension Plan Investment Board
and our manufacturing partner, Magna International.
"As a Canadian company, we are proud to be expanding our partnership with Waymo to help bring autonomous ride-hailing to Toronto,” said Laura Dottori-Attanasio, Chief Executive Officer, Element Fleet Management. Together with Waymo, Element will help create employment opportunities providing the fleet expertise, operational capabilities, and intelligent mobility solutions needed to support autonomous fleets reliably and at scale."
As one of North America’s fastest-growing metropolitan regions, Toronto has both evolving mobility demands and a dynamic and growing number of tools. From bike lanes to public transit, Waymo’s
all-weather Driver
can provide an additional option that complements the city’s transportation ecosystem. The data from over 400 million fully autonomous kilometres driven shows the Waymo Driver was involved in
95% fewer
(20x fewer) crashes involving serious injury or worse compared to humans in the cities where we operate.
Safety and accessibility are fundamental to Waymo's mission to be the world's most trusted driver, and we're proud to collaborate with leading accessibility and mobility advocacy organizations, including BALANCE for Blind Adults, CNIB, Community Living Toronto, Connected Canadians, and Epilepsy Ontario, among others.
“Innovation that removes barriers to independence is at the heart of everything we do. Waymo’s history of partnering with the sight loss community to build accessible solutions is encouraging and their decision to engage with us early reflects the kind of approach that leads to real results,” said Michelle McQuigge, CEO, BALANCE for Blind Adults.
We can't wait to help residents and visitors explore everything Toronto has to offer. If you’re ready to experience Waymo in Toronto, please sign up for updates to be among the first to ride when we’re ready:
waymo.com/waymo-in-canada
.
Waymo arrive officiellement au Canada ! Nous préparons le lancement de notre service de transport par véhicules autonomes à Toronto. Nous investissons dans les infrastructures locales et dans la création d’emplois en vue d’accueillir nos premiers passagers en 2028.
Au cours des prochains jours, vous commencerez à voir des véhicules Waymo circuler dans les rues de Toronto, avec un conducteur au volant. Notre démarche est rigoureuse et axée avant tout sur la sécurité. Nous procédons par étapes, en commençant par cartographier le réseau routier local en haute définition, puis en effectuant des essais avec des spécialistes qualifiés de la conduite autonome au volant. Cette phase nous permettra de vérifier que le Waymo Driver s’adapte aux conditions de conduite propres à Toronto.
« Notre arrivée au Canada marque une étape importante dans le développement international de Waymo », a déclaré Tekedra Mawakana, codirectrice générale de l’entreprise. « Toronto est l’une des plus grandes métropoles du monde : une ville innovante, diversifiée et résolument tournée vers l’avenir. Nous sommes fiers d’introduire le Waymo Driver dans la plus grande ville du Canada et de collaborer avec les communautés dynamiques des affaires, des arts et de la culture qui partagent notre engagement envers des rues plus sécuritaires et une mobilité plus accessible. »
Pour assurer notre service à Toronto, nous faisons équipe avec Element Fleet Management, une entreprise dont le siège social se trouve à Toronto et qui est un leader mondial des solutions intelligentes de gestion de flottes et de mobilité. Element nous fournira des services complets de gestion de flottes. Avec Element et nos autres partenaires, nous investirons progressivement dans la création de centaines d’emplois liés à l’entretien de la flotte, aux essais sur route, au service à la clientèle et à d’autres activités nécessaires à l’exploitation de notre service. Ce partenariat s’inscrit dans la continuité des liens que Waymo a déjà tissés avec le Canada, notamment avec l’
Office d’investissement du régime de pensions du Canada
(Investissements RPC), un investisseur de longue date, et Magna International, son partenaire manufacturier.
« En tant qu’entreprise canadienne, nous sommes fiers d’élargir notre partenariat avec Waymo afin de contribuer à l’arrivée des services de transport de personnes à la demande par véhicules autonomes à Toronto, a déclaré Laura Dottori-Attanasio, présidente et cheffe de la direction d’Element Fleet Management. Ensemble, Element et Waymo contribueront à créer des possibilités d’emploi en mettant à profit l’expertise d’Element en gestion de flottes, ses capacités opérationnelles et ses solutions de mobilité intelligente pour soutenir le déploiement à grande échelle de flottes de véhicules autonomes, tout en assurant la fiabilité de leurs opérations. »
Toronto figure parmi les régions métropolitaines dont la croissance est la plus rapide en Amérique du Nord. Les besoins en matière de mobilité y évoluent et les options de transport se multiplient. Des pistes cyclables au transport en commun, le Waymo Driver, conçu pour fonctionner
par tous les temps
, pourrait offrir une option supplémentaire en complément des moyens de transport existants. Selon les données recueillies sur plus de 400 millions de kilomètres parcourus en conduite entièrement autonome, les véhicules Waymo ont été impliqués dans
95 % moins d’accidents
entraînant des blessures graves ou plus graves que les véhicules conduits par des humains dans les villes où le service est offert. Cela représente 20 fois moins d’accidents de ce type.
La sécurité et l’accessibilité sont à la base de la mission de Waymo : devenir le service de conduite autonome auquel le public fait le plus confiance au monde. Nous sommes fiers de collaborer avec des organismes de premier plan qui œuvrent en faveur de l’accessibilité et de la mobilité, notamment BALANCE for Blind Adults, l’Institut national canadien pour les aveugles (INCA), Community Living Toronto, Connected Canadians et Epilepsy Ontario.
« L’innovation qui favorise l’autonomie est au cœur de tout ce que nous faisons. L’expérience de Waymo en matière de collaboration avec des personnes ayant une déficience visuelle pour concevoir des solutions accessibles est encourageante. Sa décision de nous consulter dès le début montre qu’une telle approche peut donner des résultats concrets », a déclaré Michelle McQuigge, PDG de BALANCE for Blind Adults.
Nous sommes ravis d’aider les résidents et les visiteurs à découvrir tout ce que Toronto a à offrir. Si vous avez envie de faire l’essai du Waymo Driver à Toronto, inscrivez-vous pour recevoir nos mises à jour et être parmi les premiers informés du lancement de notre service :
waymo.com/waymo-in-canada
.
Big Fish: Exploiting a 37-Year-Old Kernel Bug in OpenBSD
Calif frequently publishes our offensive research and work, but we otherwise don't draw much attention to the defensive work we do — assisting open source projects with remediation, patch generation, cryptographic improvements, and internal engineering projects we carry out for our clients.
Earlier this year, we reported some vulnerabilities, often along with suggested patches to OpenBSD. One traced back roughly
37 years to the original BSD sources
, where a shared memory attachment counter was defined as a signed 16-bit short. Repeatedly forking a process with shared memory attachment records could push that counter past its maximum value of 32,767, causing it to wrap to a negative value. This integer overflow could lead to a use-after-free via a race condition; combined with a separate out-of-bounds write in the kernel, it allowed local privilege escalation to root. The issues were addressed in
errata 026
and
018
, respectively.
The exploit
We managed to get local root in OpenBSD with
KARL
/
SMAP
/
SMEP
enabled without the use of an information disclosure vulnerability via the following path:
Map 127 SysV shared memory segments, unmap them via
munmap()
, and fork 259 processes to wrap the shared memory attach count to -32,643.
Perform heap grooming and layout, using metrics from sysctl(
KERN_MALLOCSTATS)
(such as
kb_total
and
kb_totalfree
) to track allocations and determine when new pages are allocated.
Win the race condition using
IPC_RMID
in one process while attaching a new size-confused shared memory segment in a helper process.
Align IP socket allocations and set
IP_MULTICAST_TTL
to a non-default value of 2 to allocate a persistent 16-byte
struct ip_moptions
. Its final word packs two 16-bit counters:
imo + 12 = imo_num_memberships | imo_max_memberships << 16
.
Trigger the conditional
-1
out-of-bounds write to overwrite both the number of memberships and maximum memberships fields.
close()
the socket to traverse the group members, triggering
atomic decrements
that modify the PTE self-referential mapping twice, switching it from user to supervisor accessible mapping, and achieving kernel code execution by overwriting a predictable kernel pointer.
Clean up shared memory accounting and restore the overwritten kernel pointer to obtain a root shell.
Taking a step back, this vulnerability ended up getting code execution via a
write what where
primitive, where the
write
was caused by a
TAILQ_REMOVE
, the
what
was our userland memory mapping that was made supervisor mode accessible to bypass
SMAP
/
SMEP
, and the
where
was a predictable kernel pointer location.
Exploit mitigation
While OpenBSD's KARL relinks the kernel binary to randomize both function and data addresses, the kernel's memory allocators remain deterministic. Both the
boot-time allocator
and the
best-fit allocator
lack base address randomization. Consequently, early boot allocations consistently land at predictable locations across boots on the same hardware. When these predictable structure allocations contain function pointers, they become ideal targets for exploitation. For instance, the exploit reliably targets the
lo0
and
enc0
ioctl
handlers, overwriting one to gain control flow and using the other to restore the overwritten pointer.
Aside from the aforementioned errata fixes, there's several other approaches that can be taken to either eliminate or reduce the likelihood of those avenues being used again.
Firstly, we can implement safe-unlinking, a technique that checks doubly linked list invariants before performing the unlink memory writes. If the invariants are violated, then a suitable
abort()
or
panic()
is called, depending on if user mode or kernel mode, preventing memory corruption from occurring. An example implementation is
here
.
FreeBSD
and
NetBSD
have an implementation of safe-unlinking in their
sys/queue.h
implementation.
Secondly, we can randomize the self-referential PTE map allocation address so that the targeted atomic decrement locations would not be possible. This is done by using a random byte (
.openbsd.randomdata
) and selecting a
PML4
slot (
320 + (random_byte & 127)
) at boot time, and installing the recursive entry at that location. The
PTE_BASE
definition becomes a runtime expression, yielding bases from
0xffffa00000000000
through
0xffffdf8000000000
at 512-GiB intervals. An example implementation is
here
. In case randomization is not suitable, other options might suffice, such as marking the PTE as read-only, and changing CR0.WP during modification.
Thirdly, the kernel allocator can be made non-deterministic using two approaches; by
randomizing the base address
where memory allocations occur at boot time, and additionally
randomizing the allocation order at run time
. The base address randomization is effectively free as the gap it creates can still be used later on; while runtime randomization does incur some overhead during allocation - it may be possible that more in-depth allocator changes could alleviate this impact. Either approach would be sufficient to break the predictable pointer location without additional vulnerabilities, be it software or hardware.
Furthermore, there are existing and upcoming compiler features that can be used to mitigate against entire vulnerabilities, from
array bounds sanitizer
(a subset of Undefined Behaviour sanitizer) which can eliminate out of bounds fixed size array accesses. Calif has
suggested to FreeBSD
that the array bounds sanitizer may make a useful exploit mitigation that can be enabled in release builds, along with privately reporting 21 issues that the array bounds sanitizer would have caught; some with local privilege escalation security impact. An upcoming compiler feature that can be used to help mitigate against heap issues is
Alloc Tokens
, which can be used to isolate pointer containing allocations from non-pointer allocations. This isolation can make overflows from the non-pointer containing allocation much more difficult to exploit by preventing pointer access, along with making vulnerability classes like Use-after-Free unable to use the opposite type of allocation as the replacement memory allocation.
Since its inception, OpenBSD has consistently championed proactive security through source code auditing, the replacement of insecure APIs, advanced password hashing, cryptography, privilege separation, sandboxing, along with memory safety via
ASLR
and
W^X
; frequently setting the standard for system and network hardening.
By proactively hardening, and adapting new and existing mitigation options, we can often systematically neutralize entire classes of exploitation primitives; or at the very least, increase the attacker's cost (i.e. additional time investment, additional vulnerabilities needed to exploit an issue, find alternative avenues, etc). Investing in defensive improvements before vulnerabilities are actively targeted raises the bar for attackers, helping ensure robust protection and long-term resilience. In the age of AI-assisted vulnerability discovery, mitigating against entire vulnerability classes, combined with increasing attack complexity only becomes more critical.
Newly filed court records show exactly what happens when messaging app Telegram provides data to U.S. authorities.
A letter written by Telegram, and providing a specific user’s phone number, user ID, and IP address, reads:
Dear Sir or Madam,
For this particular case, the following information was available:
User #7149269705 : +201155664529 [Mahmoud Almohtadi]
IP 184.186.72.239, 8 Oct 2025 2:08:12
We hope this information will be helpful in your investigation.
Kind regards,
The Telegram Team
The letter says Telegram provided the data “voluntarily” and that by providing it, Telegram is “not conceding that we are subject to U.S. jurisdiction for this or any other request or any purpose.” A related court filing written by the government the data came in response to a court order issued pursuant to the Stored Communications Act.
A screenshot of the letter.
The letter
also includes what Telegram calls its “non-public contact point” for requests made by U.S. law enforcement. This email address —
content-referral-u1@telegram.org
— is now in public court records. Hackers often contact tech companies impersonating law enforcement, often
using compromised government email accounts
, to trick them into handing over someone’s user data.
The case this document surfaced in centers around Mahmoud Amin Ya’qub Al-Muhtadi, who
allegedly participated
in the October 7 attacks against Israel.
Telegram only got serious about responding to lawful requests for data after French authorities arrested Telegram CEO Pavel Durov in August 2024, in part because the company
refused to assist law enforcement
in a child abuse investigation. Since then, Telegram has dramatically changed from a company that very rarely, if ever, provided data to the authorities, to one that does it as a matter of course, in line with other tech platforms and messaging apps.
About the author
Joseph is an award-winning investigative journalist focused on generating impact. His work has triggered hundreds of millions of dollars worth of fines, shut down tech companies, and much more.
This is our fifth article from Issue 26, which arrived with
print subscribers
last week. In it, Charles C Mann explains how he learned to love porcelain.
I am aware that I am a bit of a kitchen equipment nerd, okay? So maybe you don’t have to roll your eyes theatrically like my cousins did when I tell you my wife and I got a swanky induction cooktop that was, well, kind of pricey for a middle-class couple? And maybe you can imagine my irritation when it turned out that the swanky induction cooktop – did I mention it was pricey? – did not include the necessary smooth cooking surface above the induction burners, and that you had to buy the cooking surface separately from a separate company, a fact not exactly advertised on the website, and that the surface could not be tempered glass, which is what I had thought was on top of induction ranges, a sheet of which costs maybe $30 per square foot, but a special, newly created material called Dekton that cost five times as much. ‘What on earth is Dekton?’ I asked the heavens, or at least my wife.
My question turned out to have two answers. The first is that Dekton is an artificial material invented by the Spanish company Cosentino in 2013 that is amazingly heat-, pressure-, scratch-, shatter-, and stain-resistant – a high-tech substance that would have been almost impossible to fashion even thirty years ago. The other answer, equally true, is that Dekton is basically porcelain.
Paradoxically, porcelain is both one of humankind’s oldest high technologies and one of its newest. The earliest proto-porcelain was created more than three thousand years ago, and was, for the time, an astonishing technical feat, as unprecedented as the roughly concurrent development of iron metallurgy. Iron technology had its second flowering in the mid-nineteenth century, when the invention of the Bessemer and Siemens-Martin refining processes allowed manufacturers to produce cheap, high-quality steel. Porcelain is having its resurgence today – indeed, high-tech ceramics are key elements in the ongoing upsurge in materials science, the study of the relationship between a substance’s structure and its physical properties.
Much attention is rightfully focused now on the rise of the digital world and the explosive arrival of artificial intelligence. But that attention sometimes obscures the ongoing, equally important transformation of our physical world, the built environment, by materials science. Unleashing a cataract of innovation so ubiquitous as to be almost invisible, materials science has literally changed the walls around us. Porcelain is a reminder that the drive to create new types of matter has long played a powerful role in human history.
The initial steps toward porcelain occurred when potters in northern China started to tinker with an unusual clay, chalk colored and fine grained, called kaolin. Kaolin was known for its color, useful in paints, coatings, and fillers. Potters learned that subjecting this soft, white, unremarkable-looking mud to extreme temperatures produced startling effects.
Ordinary clay looks like amorphous glop but actually is composed of huge numbers of microscopic crystals. The crystals have an unusual structure: flat plates stacked atop each other like playing cards in a deck, loosely held together by hydroxyl groups (hydrogen and oxygen bound together, or -OH, in chemists’ terms). When clay is cooked in a kiln, the hydroxyl groups vibrate and break free, causing the plates to fall apart and reform into long, needle-shaped crystals that lock together into a sturdy structure. Meanwhile, the free hydroxyls merge, becoming water molecules that steam away in the hot kiln, leaving behind oxygen in the new crystals.
Kaolin clay is abundant in kaolinite, a mineral made of aluminum, silicon, oxygen, and hydrogen – Al
2
Si
2
O
5
(OH)
4
, with the parentheses meaning that each molecule has four hydroxyl groups. When heated in a kiln, kaolinite also loses its hydroxyls and reorganizes itself into a three-dimensional web of needle-like crystals. But when the temperature rises to about 1,200 degrees centigrade, well above the typical level for earthenware pottery, kaolin does something else. The silicon and oxygen break free, forming silica, which forms a thick liquid glass, filling all the spaces around and inside the web of needles, creating a dense, continuous, translucent matrix – porcelain.
In China, like everywhere else, ceramics had been a foundational industry for millennia. Clay was a primary part of construction (bricks, adobe, wattle-and-daub), cooking (pots, tableware), art (paints as well as sculpture), and even communication – clay tablets were the first surfaces used for writing. But porcelain was a giant leap, a concatenation of multiple innovations.
Ordinary kilns couldn’t reach the temperatures required to fire porcelain, partly because their exhaust vents, located on the ‘roof’, let out the hot air almost as fast as it was created, cooling the kiln. (This is a problem for conventional home fireplaces, which are fun to look at in use but wildly inefficient as a means of heating.) Chinese potters designed downdrafts, which forced the hot air to escape through floor vents, trapping the heat around the pottery. Alarmingly, ordinary kilns would shatter or even melt at such high temperatures. Chinese potters invented new types of heat-resistant brick. And so on.
When Europeans first saw East Asian porcelain, probably in the thirteenth century, they were astounded. Harder, stronger, finer, smoother, and more lustrous than any other pottery, it became an obsessive object of desire, ‘white gold’ for the Continent’s wealthy and powerful. Enormous sets of gleaming white china became symbols of luxury – the private jets and invite-only clubs of the Renaissance era.
Unhappy about the high prices charged by the merchants who imported porcelain from Asia, European elites spent lavishly on efforts to make their own porcelain – and failed comprehensively for several centuries.
A key problem was that nobody on the Continent knew that porcelain was made from kaolin. Or that kaolinite alone didn’t actually contain enough glassy liquid silicate to make proper porcelain, so that Chinese potters added pulverized ‘China stone’ – a type of partly decomposed granite containing silicon – into the kaolinite.
Trying to make their wares porcelain-white, European potters added materials like tin oxide and ground glass to the clay, an approach that led to Italian maiolica, French faience, and Delftware. The results were often beautiful, but lacked porcelain’s impermeability to water, high tensile strength, and the distinctive ring made by porcelain cups when tapped with a spoon.
Enter Count Ehrenfried Walther von Tschirnhaus (1651–1708), a mathematician, physicist, and philosopher born in the Electorate of Saxony. Tschirnhaus initially studied math and philosophy but in his twenties became fascinated by porcelain. Beginning in about 1679, he conducted a series of experiments that used concave copper mirrors to beam intensely hot sunlight on multiple types of metals, minerals, and ceramics. Eventually he realized that glass lenses could outperform mirrors and invented a method of casting glass to make big, thick lenses for focusing sunlight, sending samples of the results to European monarchs in an unsuccessful quest to obtain financial backing to establish a science academy in Saxony.
In the winter of 1693–94, Tschirnhaus discovered a surprise: a type of clay that wouldn’t melt. Dug from Colditz, about 25 miles southeast of Leipzig, in Saxony, it contained kaolin (Tschirnhaus, of course, didn’t know this). Adding alabaster or chalk to the clay and heating the mix produced a hard, yellow, somewhat translucent ceramic that Tschirnhaus called ‘wax porcelain’. Unfortunately, he couldn’t produce it in quantity – his lenses could focus sunlight on an area of 10 to 15 square centimeters but not heat spaces of any size. When he tried making his porcelain in commercial kilns, their walls shattered or melted. Tschirnhaus was struggling to develop a better kiln when he was approached by Augustus the Strong, the ruler of Saxony.
A few years earlier, a young mountebank in Prussia named Johann Friedrich Böttger had let it be known that he had discovered the
Alltinktur
, an alchemical substance that cured any disease and turned base metal into gold. In a fine example of FAFO, Prussia’s gold-hungry king, who wanted to monopolize the
Alltinktur
, immediately ordered Böttger to be taken into ‘protective custody’. Böttger escaped into Saxony, whereupon he was seized by Saxony’s equally gold-hungry ruler Augustus the Strong, confined to an attic in a fortress outside Dresden, and ordered to produce gold. Böttger toiled for years, promising all the while to produce ‘alchymist gold’. Surprisingly, he was unable to deliver. Augustus grew exasperated and in 1704 asked Tschirnhaus to supervise work on the
Alltinktur
. Tschirnhaus, who evinced no interest in alchemy, invited Böttger to work with him instead on porcelain. To save his neck, Böttger grudgingly agreed.
Tschirnhaus, Böttger, and Gottfried Pabst von Ohain, a high-ranking mining official (in those days, the closest thing available to an earth scientist), developed a red clay that could be made into bricks suitable for porcelain kilns. In June 1708, Pabst von Ohain found a source of white clay – nearly pure kaolin, though he didn’t know it – and shipped it to the other two. Mixing the white clay with ground limestone and heating it in kilns made from the new red clay in August and September, Tschirnhaus single-handedly created a cup that looked and behaved very much like white Chinese porcelain.
He did not live to enjoy his triumph. In October, Tschirnhaus suddenly dropped dead, supposedly of dysentery. On his deathbed, he gave Pabst von Ohain a black box filled with documents. The box was found in Böttger’s belongings after his death, which may explain why he wrote to Augustus in March 1709, claiming to be the sole discoverer of the process to make porcelain. Augustus officially chartered the Royal Porcelain Manufacture in Meissen, another small town near Dresden, the following year and put Böttger in charge. It took ten more years for its workers to figure out that ‘China clay’ (or, more precisely, a similar local stone) was a better additive than limestone. Meissen then became Europe’s porcelain center. Augustus made so much money that he built a ‘Japanese palace’, filled it with Meissen copies of Asian originals, and crowed to visitors that he had beaten the Chinese – correctly, because Meissen porcelain was harder and less porous than the original.
If Meissen was Porcelain 2.0, the Dekton for my cooktop is Porcelain 3.0 or more. Made by baking a slurry of ground porcelain, glass, and quartz into slabs, running the slabs through a huge hydraulic press that applies 25,000 metric tons of pressure, and hardening them at 1,200 degrees centigrade, Dekton took six years and almost $200 million to invent. Traditional ceramics contain microscopic voids and flaws that act as ‘stress concentrators’, focusing rather than diffusing the energy from impacts, which is what causes them to crack. The high pressure and heat used to produce Dekton cause atoms in the particles of kaolinite and quartz to diffuse across the boundaries where they touch, turning the entire thing into what amounts to a single solid mass. In consequence, Dekton has nearly eliminated porcelain’s long-standing weakness: its brittleness and structural fragility.
Dekton is but one part of an ongoing resurgence in porcelain, which itself is part of the still larger revolution in materials science. The field was founded in the 1940s and 1950s, when physicists, chemists, and engineers had to work together in the Second World War, the Cold War, and the space race. But it really took off in the 1980s and 1990s, with the development of precision measuring and manufacturing techniques. Most of its innovations have been incremental, but the accumulated total has had enormous impact in our daily lives.
To give a personal example, my late mother-in-law was injured permanently by slipping on a wet porcelain bathroom tile – something that happens to
tens of thousands
of people in the United States every year. In the past, firms made nonslip tiles by coating them with rough, jagged grains – a bit like laying sandpaper over the surface, and deservedly unpopular in the home. Ten years ago, Italian and Spanish tile manufacturers like Ceramica Sant’Agostino and Inalco introduced ‘wet-activated’ or ‘in-out’ tiles, with special crystalline compounds baked onto the surface. Dry, they look and feel like ordinary porcelain tiles. But when they are wet and someone steps on them, the pressure drives the water into thousands of pores on the surface, creating a suction-cup effect between foot and tile, instantly making them less slippery. (How much suffering will wet-activated tiles prevent? Back-of-the-envelope calculations suggest it would be equivalent, in terms of deaths prevented, to curing childhood cancers.)
Another personal example: My daughter, hit with a rare bone infection at age eleven, now has a porcelain hip joint – porcelain because the previous cobalt and chromium replacement joints can release metal ions into the bloodstream, which can migrate into the placenta of pregnant women, potentially harming the fetus. About the same time that ceramics firms introduced wet-activated tiles, researchers deployed 3D printing to create porous, lattice-like ‘bioceramic’ structures to replace defective bone. The structures are not permanent replacements but scaffolds that allow blood vessels and bone cells to migrate into the spaces in the bioceramic. Over time, the porcelain structure dissolves and is replaced by the patient’s own tissue. (The scaffold is expelled from the body.)
I could go on to talk about the use of nanotechnology to fill porcelain pores to enhance color depth and stain resistance, imprinting porcelain with silver ion layers to enhance antimicrobial activity, or the use of lithium disilicate to make ultrathin dental implants of unprecedented strength. But maybe the best way to say it is that my grandmother, who proudly displayed her mother’s eggshell-thin Meissen china on the sideboard, would have been astonished to find that I was cooking on a thin slab of porcelain, heedlessly dropping heavy pots of boiling water on its surface. But when I tried to explain how remarkable this is to my son, he gave me a blank look. He had never lived in a world that wasn’t made of porcelain.
Charles C Mann is a correspondent for
The Atlantic
.
Discussion about this post
Ready for more?
[$] Recent and future changes to the Linux NFS server
Linux Weekly News
lwn.net
2026-10-16 10:26:57
The NFS network filesystem protocol has a long history on Unix-like
operating systems (and beyond). NFS is still evolving, though, and
implementations need to keep up. At the 2026 Linux Plumbers Conference, NFS developer
Jeff Layton gave an overview of recent enhancements to the Linux
implementati...
The page you have tried to view (
Recent and future changes to the Linux NFS server
) is currently available to LWN
subscribers only.
Reader subscriptions are a necessary way
to fund the continued existence of LWN and the quality of its content.
If you are already an LWN.net subscriber, please log in
with the form below to read this content.
Please consider
subscribing to LWN
. An LWN
subscription provides numerous benefits, including access to restricted
content and the warm feeling of knowing that you are helping to keep LWN
alive.
(Alternatively, this item will become freely
available on October 29, 2026)
StarSkirmish is a benchmark where LLMs write bots for StarCraft: Brood War
Each LLM gets one hour to write a Protoss bot in C++, which is then evaluated against other LLMs' bots and established human written bots
StarSkirmish tests long horizon reasoning and agentic coding as LLMs must incorporate learnings from practice games to improve their StarCraft bot
The StarSkirmish Bench evaluates how strong of a StarCraft bot can each LLM write given 1 hour of wall clock time. v0.2 updates
StarSkirmish Bench v0.1
with flagship models from OpenAI, Anthropic, Google and Meta, each running in its lab's 1st party CLI harness.
An LLM’s score reflects its win rate against a roster of competitive human written bots and demo bots.
StarSkirmish Bench v0.2
1 hour runs, in its 1st party CLI harness. Scores are average win rates (0–100) of each model's 5 runs against a roster of competitive human written bots.
Gemini 4 Argon runs at
high
, the highest reasoning effort available to it; every other model runs at
max
.
GPT-6 Astra is the top scoring StarSkirmish Bench v0.2 LLM, a clear step ahead of GPT-6.1 Sol in second.
Gemini 4 Argon, Claude Opus 5.5 and Claude Fable 5.1 are functionally tied behind them, all scoring between 37 and 39.
StarSkirmish Bench vs. Cost
StarSkirmish Bench score against the average API cost of one 1 hour run. Cost is on a log scale.
Muse Wonder Full's pricing is based on Muse Wonder's API pricing.
GPT-6.1 Sol offers uniquely good value: it is the only LLM in the most attractive quadrant, scoring second at just over a tenth of GPT-6 Astra's cost per run.
The strongest human written bots are still well ahead of every model. Against Stardust, PurpleWave and BananaBrain, the best model, GPT-6 Astra, wins only 7% of its games.
Win rates vs the top human written bots
Average win rate of each model's 5 bots against top human written bots Stardust, PurpleWave, and BananaBrain.
1 hour reasoning limits are a factor, but these matches are played on three 2 player maps. Real human written bot tournament conditions are significantly harder.
Google and Meta's new flagships replace v0.1's Gemini 3.8 Flash and Muse Spark 1.3: Gemini 4 Argon places 3rd, and Muse Wonder Full 7th. GPT-6 Astra and Claude Opus 5.5 were covered in
v0.1
.
Each run's agent trace records how it spent its hour. The strongest predictor of a model's score is how much it practiced against the 7 strongest bots on the roster.
Win Rates vs. Practice Against Strong Bots
StarSkirmish Bench score against the number of practice games a model's median run played against the 7 strongest roster bots during the hour. The dashed line is a linear fit across the 9 models.
GPT-6 Astra, GPT-6.1 Sol and Gemini 4 Argon start playing these bots early in the hour, while their own bots still lose to them. Muse Wonder Full, Claude Haiku 5.5 and GPT-6 Luna rarely or never do. Claude Fable 5.1 is the outlier: it scores 37 while practicing almost entirely against weaker bots.
Run-to-Run Variance
Win rates of each model's 5 runs. Each dot is one run's final bot; the line spans the lowest to the highest run, the bar marks their mean (the model's Bench score) and the band one standard deviation (σ).
Results also vary between runs of the same model. Gemini 4 Argon varies far more than the other labs' flagships: its best and worst runs are 18 points apart, against 9 for GPT-6 Astra and 8 for Claude Opus 5.5.
Each LLM writes a Protoss bot in C++ against
BWAPI 4.4.0
, played on
OpenBW
. Games are Protoss versus Protoss on three
ladder maps: Heartbreak Ridge, Benzene and Destination. A game ends when one side's buildings
are all destroyed. Games that reach the 60 minute cap (86,400 frames) are decided as on the
BASIL
ladder: the higher kills + razings score wins.
The LLM starts from a skeleton bot that only mines, with the source code of the three demo bots and two standard bot libraries: FAP, a combat simulator, and BWEM, a map analyzer. Whatever is in its bot folder when the hour ends is its final bot, so it has to keep the bot compiling.
The LLM has tools to compile its bot, play practice games, and read each game's summary, transcript and its bot's own log. Practice opponents are grouped into tiers: D (the three demo bots), C and B (three mid-ranked
human written bots each), A (BananaBrain, Locutus) and S (Stardust, PurpleWave).
Each model's 5 final bots play each of the 13 roster bots, the 10 competitive human written bots and the 3 demo bots, 6 times on each map, on fresh seeds. Unlike v0.1, the LLM bots don't play each other.
StarSkirmish Bench v0.1
ran every model in the same harness at 'high' reasoning. v0.2 runs each model in its lab's 1st party CLI harness at the highest reasoning setting it offers.
Harness
v0.1 ran every model in one neutral 3rd party harness; v0.2 runs each lab's models in its 1st party CLI harness. Both versions give each model 1 hour.
v0.1
v0.2
Claude Code
Claude Opus 5.5, Fable 5.1, Sonnet 5.5, Haiku 5.5
Codex
GPT-6 Astra, GPT-6.1 Sol, GPT-6 Luna
Antigravity CLI
Gemini 4 Argon
Muse Code
Muse Wonder Full
CLI versions: Claude Code 2.1.296, Codex 0.162.1, Antigravity CLI 1.3.5 and Muse Code 1.4.7.
Reasoning Effort
v0.1 ran every model at high reasoning effort; v0.2 runs them at max.
v0.1
Low
Medium
High
XHigh
Max
High
v0.2
Low
Medium
High
XHigh
Max
Max
Gemini 4 Argon runs at
high
, the highest effort supported.
Every v0.2 harness compacts the model's context at about 250k tokens. When a conversation nears that point, the CLI condenses it and the model carries on. Codex, OpenAI's CLI, for example, gives the GPT models its default 272k token window and triggers compression once 90% filled.
The CLIs' web search and web fetch tools are turned off, and the agent has no other internet access. The CLI is installed before the clock starts, and the hour counts from when the agent starts. There is no submit tool: the harness collects the bot when the time runs out.
v0.2 replaces v0.1's Elo ratings with plain win rates. A bot's score is its win rate over its
tournament games, and a model's StarSkirmish Bench score is the average of its 5 bots' scores, from 0 (every game lost) to 100 (every game won).
Because every bot plays the same fixed roster, its games don't depend on the other LLM bots in the field. They all run in parallel, and a new model's bots can be scored without replaying anyone else's. A fixed roster also keeps the bar the same over time, so scores from different model generations are more directly comparable than Elo ratings fitted within one field.
StarSkirmish no longer tracks the most widely reported evals. It barely moves with the Artificial Analysis Intelligence Index (ρ 0.26), where GPT-6 Astra, the top model here, only ties for 4th of these 9 models. It has also drifted away from Terminal-Bench 4.0, which it tracked closely in v0.1. Claude Sonnet 5.5 and Muse Wonder Full both rank near the top of Terminal-Bench 4.0 but near the bottom here.
Benchmark Correlation
Each model's StarSkirmish Bench score against its Vals IOI and WeirdML v3 scores, with the Spearman ρ between them. The dashed line is the best straight-line fit.
WeirdML v3 scores 7 of the 9 models: Gemini 4 Argon and Muse Wonder Full have not been included at time of writing.
StarSkirmish still tracks Vals IOI, olympiad programming problems solved in C++, and WeirdML, an independent benchmark of unusual machine learning coding tasks. One reading is that the most heavily benchmarked evals have become targets that models are tuned for, while less targeted tests of long horizon, difficult coding tasks still move together.
How to make System 1 LLMs show System 2 competencies?
The results
from the 2026 election for members of the Linux Foundation Technical
Advisory Board (TAB) have been announced. Kees Cook, Dave Hansen, Miguel
Ojeda, and Shuah Khan have all been re-elected, and Laurent Pinchart will
be joining the board....
(This is a guest post, written by Jeremy Avigad, Kevin Buzzard, Johan Commelin, Rémy Degenne, Kim Morrison, Oliver Nash and Adam Topaz.)
Mathematicians’ reactions to last week’s big OpenAI release range from excitement to frustration, but one thing is clear: AI has become remarkably good at proving theorems, both formally and informally. The successes in the formal realm have led AI enthusiasts to declare that now is the time to formalize all of mathematics as a legacy for future generations.
We are sympathetic to this proposal. We recognize the power of new technologies for mathematical reasoning and appreciate what they can contribute to the subject we know and love. We are generally optimistic about the role AI can play, but we are deeply concerned by some recent calls to formalize everything as quickly as possible. If done well, a large-scale, coordinated formalization effort could enormously expand mathematical exploration and discovery. Done poorly, it will be, at best, a waste of resources; more likely, it will do lasting damage.
We prefer to see formalization done well. This post therefore clarifies our concerns, describes some of our experiences with AI and formalization, and offers a positive vision of how we can all work toward a world in which all, or almost all, mathematical definitions, theorems, and proofs are equipped with a formal representation, and in which these artifacts help mathematics flourish.
Just as the role of AI in mathematics is a fraught subject these days, so too is its role in formalization. The range of attitudes among expert formalizers toward AI is as wide as the range of attitudes among mathematicians more broadly. We are aware that some of our closest friends and colleagues, whose opinions we value and respect highly, stand strongly opposed to large-scale formalization using AI. Nothing we say here should be taken as representative of the views of any of the organizations or communities with which we are associated.
The concerns
Let’s start with the observation that a formal artifact is not worth much if nobody uses it. When Math, Inc. tried to hijack
a project
to formalize Maryna Viazovska’s higher-dimensional sphere-packing results last February, it impressively demonstrated what the technology could do, but beyond that, it contributed nothing to mathematics. The original project team kept preparing a quality formalization of the 8-dimensional result and soon discovered that cleaning up the AI-generated code was more trouble than it was worth; it turned out it was better to throw the code away and do it right, still with ample help from AI.
When Anthropic
announced
that Claude had formally verified Fermat’s Last Theorem with 13 million lines of code written over 11 days, Kevin Buzzard cheerfully lauded the result while also declaring he had no intention of ending his ongoing formalization of a more modern proof. Once again, although the accomplishment is impressive, this piece of AI-generated code probably has little ongoing value.
What is going on here? The theorems were not seriously in doubt, so the value of the formal artifacts lies solely in what we get beyond mere correctness. We want to formalize everything because we want to use the formalizations to do more mathematics, and to do it better than we could have done without them. We want to think about possible generalizations, explore connections between different branches of mathematics, and consider unexpected applications. We want to refactor and improve our knowledge: part of the joy of manual formalization comes from realizing that we can adjust our concepts to make them more elegant, more efficient, and better suited to our purposes. Knowledge isn’t worth having until it contributes to our understanding; the value of a formalization comes from our ability to use and interact with the data.
When OpenAI
announced
solutions to the Navier–Stokes equations that blow up in finite time, the natural-language proof was accompanied by a Lean formalization. In contrast to the previous examples, the correctness signal played a key role here: there seems to be little doubt now that the solution is correct, even though the natural-language proof is mostly incomprehensible. OpenAI nonetheless drew the mathematics community’s anger over concerns about how it obtained the result, provenance and credit for ideas, and worries that focusing on correctness alone discouraged the exploration and understanding the Millenium prize was meant to foster. So, even here, the unadorned formal artifact is a mixed blessing. OpenAI’s later
dump
contains astonishing and important mathematics, and at the same time shows a remarkable disregard for readers and for building understanding (some results have been retracted, many of the informal/formal pairs diverge in subtle or significant ways, and most of the informal writeups are impenetrable).
This explains our concern. If spending millions of dollars to formalize mathematics results in libraries nobody uses, it will be a terrible waste of resources. Worse, the project could disincentivize good research and productive use of AI, disrupt the social norms and practices research depends on, and set the field back decades. A grand failure will make it hard, or even impossible, to recover later. A lousy formalization of existing results is worse than no formalization at all.
The positives
Some of the results from the big labs have been done well: OpenAI’s
unit distance conjecture
work, and Anthropic’s work on the
density of Riemann zeta zeroes
stand out. They demonstrated impressive new capabilities, contributed to understanding, and the community subsequently built on their work. These are examples of how the labs can contribute positively and we invite further constructive partnerships between the research community and the labs.
Good formal libraries will enable the positive vision we have for the future of mathematical research. Humans, AIs, and the Lean language work in concert. Today, AIs are extremely capable in many aspects of mathematical research. Researchers using interactive theorem provers already understand and appreciate the power of having a compiler that can check
1
the validity of a proof. Together, these tools are incredibly effective. The AIs will generate formal proofs as they work, constantly checking these against the Lean compiler, and automatically pruning incorrect reasoning. To realize this vision, we will need a high-quality, comprehensive library of formalized mathematics at an unprecedented scale, so mathematicians can work effectively at the frontiers of research. While we are writing as research mathematicians, we must keep in mind that this vision extends beyond mathematics, potentially accelerating research in engineering and science. If and only if we do it right, that payoff would justify a very large investment of resources.
Lessons so far
We have argued that if we want to use AI to help with formalization, we need to solve a special case of the alignment problem, namely, ensuring that formal libraries fulfill the community’s mathematical goals. We believe that solving this case will provide powerful lessons about how we can more generally use AI in ways that are safe, reliable, and support our values.
How can we do that? None of us know with certainty: that is part of what makes life on the frontier both exciting and unnerving. But collectively we have experience using AI for formalization, and we should expect any serious effort to pay attention to what we have learned so far. In particular, we want to call attention to the following projects.
Mathlib
is an open-source community-driven library that supports the formal mathematical ecosystem and was awarded the 2026 Jean-Pierre Demailly Prize for Open Science in Mathematics. It is curated by a team of 65 reviewers and 950 contributors to date. Because it emphasizes high-quality, trustworthy code and human curation, Mathlib grows steadily, but more slowly than AI-generated libraries. For the same reasons, it has been the primary place where we learn how to formalize better.
Formal Conjectures
is a collaborative effort to collect the formal statements of open problems. This is a social enterprise that requires discussion, review, and auditing. AIs can be useful adjuncts, but the goal is to obtain trustworthy statements of the important open questions in various disciplines. We should encourage projects announcing formalizations to use the existing vetted statements of problems wherever possible.
The Annals Challenge.
Kevin Buzzard is leading a
project
to state (but not prove) all the theorems from recent issues of Annals of Mathematics (and later other top journals). The blocker here is missing definitions, and one of the points of the project is that it incentivises good formalizations of definitions which are being used in practice by leaders of the field. Projects like this help us focus effort where it has the highest payoffs.
Tau Ceti
is building a large coherent library of formal mathematics, incubated by the Lean FRO and the Mathlib Initiative. While structurally similar to Mathlib, all contributions are written by AIs, and then adversarially reviewed by other AIs using standard rubrics. These contributions follow roadmaps curated by mathematicians and formalization experts. The review criteria include appropriate generality, avoiding duplication by reusing existing material, documentation, and naming conventions. Tau Ceti extends Mathlib without any duplication, and defers to all design decisions made there. It is possible to contribute to Tau Ceti either by writing roadmaps or by supplying inference
2
. Tau Ceti is now slightly larger than Mathlib (3 million lines of code), and growing rapidly. Recent results include
Riemann-Roch
,
Schur-Weyl duality
,
Jordan-Brouwer separation
,
Rellich-Kondrakov compactness
, and
Chebotarev density
.
Formal Frontier
is a Mathlib Initiative project building a pipeline converting source texts into interlinked formal libraries. It uses an interacting community of AI agents that can be instructed to formalize specific texts. This system is designed with scalability in mind, so it can ingest thousands of textbooks. There are now 41
released
libraries (e.g. on profinite groups, toric ideals, and homological algebra) comprising approximately 200k lines of code. In addition to providing infrastructure to manage the agent swarm, the Formal Frontier project has written a build server for large Lean projects. Recent highlights from Formal Frontier include formalizations of
the hairy ball theorem
,
Kaplansky’s theorem on projective modules
,
Bass’s stable range theorem
,
Tate periodicity
, and
Stone duality for spectral spaces
.
Formal Frontier and Tau Ceti both use agents and adversarial review, but they differ in their drivers and output structure. Tau Ceti uses roadmaps curated by experts and builds a single coherent library. Formal Frontier is primarily a source-to-library pipeline. Both insist that a formalization is only valuable if others can build on top of it. We anticipate that future autoformalization projects will build upon both approaches.
Palomar
is an online registry of formal mathematics projects. The goal of Palomar is to index formalization projects aimed at particular results, but not necessarily aspiring to be part of a general library. Many such results have recently been “dumped” on GitHub, and it can be very difficult to interpret or trust them. Palomar addresses this problem by requiring two features in every project it indexes. First, the project must contain a
formalization.yaml
file, a metadata file containing a self-assessed description of what was formalized, how it was formalized (e.g. solely by humans, in conjunction with AIs, or autonomously by AIs), and also relationships to other work, and how the authors of the underlying informal research were involved in the project. Second, the project must include a
Comparator
setup, which makes it easier to audit exactly what the statement proves.
Mathlib, Tau Ceti, and Formal Frontier aspire to common values. These are not specific to autoformalization, but rather principles that apply to all formal libraries. The Mathlib community has recently published a document on
values
, and this is the starting point for our own list.
Defer to human-curated libraries, particularly Mathlib; follow their design principles and code rules, and continuously refactor to adopt their decisions.
Prefer thoroughness and breadth. These must come before depth, but ultimately enable it.
Avoid duplication. Generalize theorems for maximal reuse.
Review additions publicly, according to agreed standards.
Publish freely. Libraries should be open source, interoperable, and explorable.
Stay up to date. Ensure continuous compatibility with every release of Lean and Mathlib.
Stay open-minded about changes. If a better approach is discovered, it’s never too late.
Document and organize. Files should be coherent, systematically organized, and their contents must be documented.
Link to the existing literature. A mathematician should be able to trust and verify that the concepts described in the library have the expected meaning.
Set standards, and meet them. Producing low-quality or unaudited code and claiming or hoping to “clean it up later” is counterproductive.
Mathlib implements these values through its review process and community
discussions
. Tau Ceti and Formal Frontier instantiate these values in the code and prompts that drive them, as well as in community-written planning documents.
The way forward
Within three years, and possibly much sooner, most of mathematics can be formalized in such a way that mathematicians can explore, build on, and make use of formal libraries. This would significantly extend our ability to develop and discover new mathematics. The Lean FRO is committed to ensuring that Lean is able to support projects at this scale. Achieving this ambitious project will require several types of additional support and community participation:
Curate and contribute to Mathlib, the foundation of the formal mathematics ecosystem, where we discover best practices in formalization.
Provide the resources needed for the shovel-ready projects, Tau Ceti and Formal Frontier, to grow by an order of magnitude in a matter of months.
Write the expert roadmaps and blueprints that guide the implementation of large formal libraries. Propose and support workshops to design and improve subject-specific libraries.
3
Develop credible modeling of the financial, engineering, and technical requirements for scaling.
4
Advocate for control by mathematicians of the tools and resources required for autoformalization.
Launch non-profit or academic hosting for the mathematicians, engineers, and inference required for implementation of large-scale formalization, with the necessary governance and advisory bodies.
Anyone can help build Tau Ceti by running
uv tool install git+https://github.com/TauCetiProject/TauCetiWorker
followed by
tauceti work --loop
(You need `claude` or `codex`, and the `gh` GitHub command line tool authenticated.)
↩︎
This is already happening, e.g. meetings on statistics and
physics
at ICARM,
analysis
at ICERM, and
PDEs
at SLMath.
↩︎
We’re planning on delivering models based on Tau Ceti and Formal Frontier as soon as possible, but this is out of scope for a blog post.
↩︎
Cops Used AI Generated Photos of a Child to Lure Out a Suspected Predator
403 Media
www.404media.co
2026-10-16 09:57:18
Christopher Thomas Mertens, a high school maintenance worker, was arrested after attempting to meet up with an AI persona that he thought was a 15 year old boy....
Police arrested a Chicago area high school maintenance worker who attempted to meet a child for sex after investigators posed as a 15-year-old boy using AI generated images.
Christopher Thomas Mertens started talking to who he thought was a child through a dating app in September. According to
an affidavit
written by the department’s FBI Task Force Officer McKailey Scott, the investigation was done by the Livonia Undercover Resistance to Exploitation Unit (LURE), which identifies and prosecutes child sex offenders. Scott set up an account on the queer-focused dating app Taimi with “an AI generated image of a teenage-appearing male with the name ‘Caleb,’ and no age listed on the profile.
Scott wrote that an unknown user messaged “Caleb,” and they moved to Whatsapp. After a few minutes of talking, the man asked Caleb for their age, and when Scott — posing as Caleb — said he was 15, the man said “Im interested” and “Im hard now.”
The investigator used a combination of tools, including checking the man’s phone number using Thomson Reuters CLEAR and running images of his face through Clearview AI to identify him as Mertens. For days, Caleb and Mertens exchanged sexually explicit text messages and Mertens made plans to drive to meet Caleb on his day off, believing Caleb’s (non-existent) parents weren’t home. Cops used Flock to look up and track Mertens’ car and see that he was driving to the meetup spot, but Mertens was also texting Caleb the entire time to let him know he was on the way and when he arrived. When he got out of the car, Livonia police took him into custody.
Two hours after being booked, Mertens told jail attendants that he wanted to speak to Scott. When Scott got to the jail, Mertens admitted everything, including that he works at a high school in Illinois. The complaint doesn’t mention which high school.
Investigators have been generating images of children for years. One of the earliest examples of these is Sweetie,
a computer generated child
developed by Dutch children’s rights organization Terre des Hommes in 2013 that the organization used to talk to men online. Today, police departments at the U.S. border use AI-generated online personas designed to interact with and monitor protestors and activists,
according to documents obtained by 404 Media
.
In August, a 24-year-old Connecticut man was arrested after soliciting an undercover police officer who used what
was reported as
“age regression technology” to appear as a 14 year old in videos. He was charged with enticing a minor and criminal attempt to commit risk of injury to a child.
In 2025, a 45-year-old man
was arrested
after investigators used AI generated images of children to catch him distributing child sexual abuse material. He was recently
sentenced
to 12 years in federal prison.
And in 2024, the state of New Mexico
sued Snapchat
after investigators set up a fake account, including AI generated images of children, that the platform allegedly recommended to “dangerous accounts, including ones named ‘child.rape’ and ‘pedo_lover10,’ in addition to others that are even more explicit,”
according to
the New Mexico Department of Justice.
AI generated child sexual abuse material is a
rapidly growing problem
for law enforcement. The National Center for Missing and Exploited Children has
reported
a massive rise in generative AI child abuse material, with criminals using it to extort and entice children, and children using it to
bully and harrass
other children.
Livonia police did not respond to a request for comment.
About the author
Sam Cole is writing from the far reaches of the internet, about sexuality, the adult industry, online culture, and AI. She's the author of How Sex Changed the Internet and the Internet Changed Sex.
Employees using personal ChatGPT at work? Here's what IT admins need to do
Bleeping Computer
www.bleepingcomputer.com
2026-10-16 09:50:59
Employees using personal ChatGPT accounts at work can expose sensitive company data, even when their organization provides an approved Enterprise workspace. NordLayer explains how IT teams can investigate unauthorized AI use and block sensitive information before it reaches personal accounts. [...]...
Article written by Vakaris Noreika, VP of Product Research and Development at NordLayer
Monday morning, you handle security for an organization, and suddenly, your security tools flag personal ChatGPT use on a managed laptop, even though your org pays for ChatGPT Enterprise.
You wonder what the employee submitted to ChatGPT. Could be a public job description, or a customer ticket with contact information and internal account details. Maybe sensitive government documents, if that is your line of work, as the acting director of CISA
did
in 2025?
The case is hypothetical. In this article, we will follow 2 versions of the same event.
In the first, your security tools identify personal account use, but nothing in your current configuration checks what goes into the prompt. In the second,
NordLayer AI Scout
is deployed on the managed browser, with a custom detector set to “Block” for your customer account number format.
What do you do next?
1. Confirm the account and the employee
You start with the basics. With only your existing controls, you open the event that flagged personal ChatGPT use and work out which identity belongs to what. The user who signed in to your security tools may have a corporate email address. But the ChatGPT login behind the event may be a personal Gmail account.
That gives you 1 person, 2 identities, and 1 awkward conversation ahead.
With NordLayer AI Scout, the signed-in ChatGPT account appears beside the conversation, and the tool classifies new ChatGPT conversations as Personal or Corporate.
Activity is tied to a person through the work email that your MDM tool pushes to the device. Directory sync with Entra ID, Okta, or HiBob adds the department, team, and role information.
2. Establish what reached ChatGPT
In the first scenario, the retained event says the employee used a personal account. It holds no prompt text and no sensitive data findings, so you can’t rebuild the submission from it.
Under the incident review procedure, you ask the employee to show you the conversation. Better keep the request narrow and limit it to the work exchange around that timestamp, unless you want a tour of your colleague’s meal plans or medical questions.
Let’s say, the customer ticket is right there in the prompt, and ChatGPT's reply discusses it in detail. You now have evidence that customer information reached the service.
With NordLayer AI Scout, you open the blocked finding. The browser extension had checked the prompt on the device before it left. A configured detector matched the customer data, and the “Block” action stopped the submission.
The employee then saw an on-page notice that the prompt had been blocked. Nobody on the security team needed to read the prompt for this to happen.
Get a clearer picture of how employees use AI tools and coding agents across your organization, including applications that may be operating outside your approved tool list.
Try NordLayer AI Scout for 30 days and put that visibility to work.
There’s a 99% chance that the explanation is mundane: the corporate session had expired, 2FA took too long, the customer was upset, and the personal ChatGPT tab was already open and signed in.
The employee says that’s why they pasted a customer support exchange into the chat, typed “Draft a response explaining why this customer cannot access their account,” and pressed “Send.”
Without a matching prompt-blocking rule, the prompt reached ChatGPT. Good. Next, you should find out whether this was the first time.
Without NordLayer AI Scout in place, you depend on the employee’s memory. You have to ask whether they ever pasted whole tickets before, uploaded attachments, or created shared conversation links, and generally whether personal ChatGPT became their plan B every time the corporate session expired.
It is also a good idea to ask what they understood about the policy. Sometimes people remember that ChatGPT is approved, but they forget which workspace and data it applies to.
4. Respond to the outcome you confirmed
Without dedicated prompt-level controls, customer data reached a completed conversation in a personal ChatGPT account. You should preserve the evidence you need and bring in the incident, privacy, or data owner.
Then, judge how serious it is based on what was shared. If credentials were exposed, they need revocation or rotation. If it’s customer records, the process may need a privacy assessment. If public text was pasted, there’s no data incident at all, but it makes sense to have a word with the employee about their more powerful Enterprise seat, which is paid for.
In any case, you should keep the write-up accurate, because using a personal account does not prove that the prompt went into model training, became public, or reached another user.
You confirmed that company data entered a service through an account outside of the approved arrangement—that is serious enough without embellishment.
If you use NordLayer AI Scout, you just record that the configured rule blocked this submission. The event shows an attempted policy violation and the control that stopped it. If the employee mentions earlier use of their personal account, you assess it separately.
5. Fix the workflow before you close the ticket
You help with the 2FA and ask the employee to sign in to the Enterprise workspace and finish the support task there so you can see it work. However, an Enterprise subscription does not mean that employees can submit anything, so you also verify that the task and data are permitted.
In the first scenario, you review restrictions on personal instances and the DLP rules that apply.
With NordLayer AI Scout, you confirm the prompt policy on the browser extension.
“Warn,” “Redact,” and “Block” do different jobs.
“Warn” pauses the send and lets the employee choose whether to send anyway or go back and edit the text. “Redact” removes the matched value and sends the rest. “Block” stops the prompt. You pick the action that fits each data category.
Then, you document the account, the device, the confirmed contents, whether the prompt was sent, and who owns the response. Finally, you record the access fix and schedule a check for repeat events.
All in all, in one version, customer data reached personal ChatGPT and needed an exposure assessment. In the other, the configured detector blocked the prompt before it left the device.
In both versions, the employee needs corporate access that works on a Monday morning. Without it, the ticket will close, and a workaround will be ready by tomorrow.
About the author:
Vakaris Noreika, VP of Product Research and Development, is a cybersecurity expert who oversees the development of business security products at NordLayer, a toggle-ready network security platform for businesses. He has many years of experience working on threat intelligence, network security, data privacy, and automated monitoring. He focuses on controls that reduce exposure without creating unnecessary operational overhead.
MLX
on Mac with Apple silicon lets AI researchers and developers experiment locally with the latest models and methods in a private environment. The open-source array framework leverages the unified memory architecture of Apple silicon, enabling anyone to run new inference and fine-tuning methods on their own hardware and explore other AI techniques.
In a previous post
, we highlighted the advantages of the M5 architecture and its GPU Neural Accelerators.
In this post, we show how to run the latest frontier-class model — Muse Spark Open, with nearly a trillion parameters — right from your desk, using the latest version of MLX, released today. On a cluster of four Mac Studios, Muse Spark Open generates over 36 tokens per second (see
Figure 1
), well above average human reading speed.
Beginning on a single Mac Studio (up to 512GB of unified memory), then scaling out across multiple Macs with the RDMA over Thunderbolt driver, below we share an overview of the range of models you can now run on Mac Studio.
Muse Spark Open Decode Speed
Context size of 8,192 tokens
Figure 1: Muse Spark Open decode speed in tokens per second, on Mac Studio with M5 Ultra, at a context size of 8,192 tokens. Higher is better. We report performance for three parallelization schemes: pipeline parallelization over two Mac Studio computers (2 M5 Pipeline), and tensor parallelization over two (2 M5 Tensor) and four Mac Studio (4 M5 Tensor) computers.
We benchmark several popular open-weight LLMs on
Mac Studio
, using the MLX LM package, as described in our
prior post
. We compare two generations of Mac Studio: the recently released M5 Ultra and the previous generation, M3 Ultra. The M5 generation features the GPU Neural Accelerator, which supports dedicated matrix multiplication operations, essential for many machine learning workloads.
We evaluate three frontier-class models (
Table 1
) spanning a wide range of sizes (in billions of parameters, B): the newly released Muse Spark Open (816 B), Mistral Medium 3.5 (128 B), and Qwen 3.8 (27 B). Muse Spark Open is a mixture of experts (MoE) model, which keeps only a fraction of its experts — and thus parameters — active, reducing compute at inference, and it is evaluated in NVFP4 precision. Mistral Medium 3.5 and Qwen 3.8 are dense architectures, where all parameters are active at inference, and they are evaluated in their native floating-point precision (FP8 and BF16, respectively).
Model
Total Parameters
Active Parameters
Native Precision
Evaluation Precision
Muse Spark Open
816B
42B
BF16
NVFP4
Mistral Medium 3.5
128B
128B
FP8
FP8
Qwen 3.8
27B
27B
BF16
BF16
Table 1: Language models used in this post. Models ship in various precision formats; we evaluate Qwen 3.8 and Mistral Medium 3.5 in their native precision, and Muse Spark Open in 4-bit (NVFP4) precision.
Our evaluation measures three metrics across a range of context sizes: time to first token (TTFT, in seconds), generation throughput (in tokens/second), and peak power usage (in watts). All the performance numbers in this post were obtained with
mlx_lm.benchmark
. For example, running Qwen 3.8 with 8,192 tokens of context and generating 128 tokens is performed with the command line:
A popular use of local LLMs on Mac Studio is running agentic experiences in a private environment, including agentic coding applications that often need large contexts. We therefore report performance at both 8,192 and 65,536 context sizes.
Raw TTFT and decode throughput are reported in
Table 2
and
Table 3
, respectively.
Qwen 3.8 27B and Mistral Medium 3.5 128B fit comfortably on a single Mac Studio with 512GB, taking up to 68GB and 158GB of RAM in the large context size (65,536 tokens) setup. In
Figure 2
, we compare their inference performance on a single Mac Studio with 512GB of RAM, both on M3 Ultra and M5 Ultra.
Time to first token (TTFT) is essentially compute bound, and that is where the Neural Accelerators in the M5 Ultra GPU shine: the specialized hardware support for fast matrix-multiplication of the GPU Neural Accelerator directly translates into significant speedups for TTFT, up to 4.6× faster compared to an M3 Ultra (see
Figure 2
). That makes the Mac Studio with M5 Ultra the desktop of choice when it comes to handling tasks involving very large contexts.
Generation speed (in tokens per second) is memory-bandwidth bound. The M5 Ultra chip delivers 1.2 TB/s of unified memory bandwidth, up from 819 GB/s for the M3 Ultra. Here again, that translates directly into generation speed (see
Figure 3
), with the Mac Studio with M5 Ultra reporting 1.6× faster tokens/s.
TTFT Speedup
Single Mac Studio, M5 Ultra over an M3 Ultra baseline (1.0×)
Figure 2: Time to first token (TTFT) speedup on M5 Ultra over an M3 Ultra baseline, for Qwen 3.8 and Mistral Medium 3.5, at context sizes of 8,192 and 65,536 tokens. The M5 Ultra GPU Neural Accelerator shines on compute-bound workloads.
Decode Speedup
Single Mac Studio, M5 Ultra over an M3 Ultra baseline (1.0×)
Figure 3: Decode speedup on M5 Ultra over an M3 Ultra baseline, for Qwen 3.8 and Mistral Medium 3.5, at context sizes of 8,192 and 65,536 tokens. Decode is memory-bandwidth bound, and the M5 Ultra’s 1.2 TB/s of unified memory bandwidth (vs 819 GB/s on the M3 Ultra) is a key advantage.
The Mac Studio is also energy-efficient for LLM inference (see
Figure 4
): peak power consumption is about 200W for the Mac Studio with M3 Ultra, and 300W for the Mac Studio with M5 Ultra — a fraction of the power used by a common toaster. More importantly, that modest amount of power consumption means a Mac Studio can be deployed for AI work in any home or office environment.
Peak Power Consumption
Context size of 65,536 tokens
Figure 4: Peak power consumption (in watts) during Qwen 3.8 and Mistral Medium 3.5 inference, at a context size of 65,536 tokens, on Mac Studio with M3 Ultra and with M5 Ultra.
While both the Qwen and Mistral models fit on a single Mac Studio with 512GB of RAM, Muse Spark Open would require more than 1.6TB of RAM in its native precision (BF16) for the model parameters alone. In a 4-bit quantized (NVFP4) format, the model memory footprint is lowered to about 493GB. Add the memory needed for intermediate computations during inference, and the model cannot fit on a single machine. It requires parallelization across multiple Mac Studio computers.
Very large frontier-class models like Muse Spark Open will not fit on a single machine. It is, however, possible to store half of the model on one Mac Studio and the other half on another. We can then pipeline the model’s inference across two computers: the first Mac Studio executes the first half of the model’s layers, then sends the output to the second Mac Studio, which executes the second half. This parallelization scheme is called pipeline parallelization (see
Figure 5
) and is extremely simple to implement, requiring only minimal code changes.
Splitting Large Models Across Multiple Computers
Figure 5: MLX supports two approaches to splitting large models across multiple computers. With pipeline parallelization, a model is split across depth, while with tensor parallelization, a model is split across width.
MLX supports different parallelization schemes, as described in the
MLX distributed documentation
. These rely on fast inter-machine communication:
macOS 26.2
introduced a low-latency RDMA driver over Thunderbolt 5, and MLX (v0.30.1 and later) builds on top of this driver and provides new communication collectives (
jaccl
, pronounced “jackal”) for different parallelization schemes. In our setup, the two Mac Studios are connected with two Thunderbolt cables (to double the link bandwidth), providing the RDMA-over-Thunderbolt link that
jaccl
uses. Once the hosts are set up, MLX provides
mlx.launch
, a helper command to launch jobs across multiple nodes:
In this command,
--backend jaccl
specifies the RDMA Thunderbolt driver backend. The
--env MLX_METAL_FAST_SYNCH=1
flag enables an experimental MLX feature for fast CPU-GPU synchronization, reducing communication overhead between the CPU (which initiates the Thunderbolt communication) and the GPU (which does the compute).
In general, decode inference speed with pipeline parallelization (see
Figure 7
) is very similar to that of a single machine, since the layers are still evaluated sequentially. Communication overhead is also very low, as only the intermediate outputs between the two sets of layers need to be exchanged.
It is however notable that for very large contexts (65,536 tokens in our benchmark), pipeline parallelization ends up faster than a single node for prefill — up to ~1.8× faster (see
Figure 6
). This is because MLX segments large contexts into smaller chunks (here, 8,192 tokens, as set by
--prefill-step-size 8192
) and pipelines the prefill across the machines: while the second machine computes the later layers of chunk
, the first machine computes the earlier layers of chunk
, so consecutive chunks overlap in time. For even better compute parallelization, we next turn to tensor parallelization.
TTFT Speedup
Two Mac Studios with pipeline parallelization, over a single M5 Ultra baseline (1.0×)
Figure 6: Time to first token (TTFT) speedup of two M5 Ultras with pipeline parallelization over a single M5 Ultra baseline, for Qwen 3.8 and Mistral Medium 3.5, at context sizes of 8,192 and 65,536 tokens. Splitting the context (here into 8,192-token chunks) lets MLX overlap computation across the two machines — hence the speedup at 65,536 but not 8,192.
Decode Speedup
Two Mac Studios with pipeline parallelization, over a single M5 Ultra baseline (1.0×)
Figure 7: Decode speedup of two M5 Ultras with pipeline parallelization over a single M5 Ultra baseline, for Qwen 3.8 and Mistral Medium 3.5, at context sizes of 8,192 and 65,536 tokens. Pipeline parallelization leaves decode speed essentially unchanged.
Tensor parallelization (see
Figure 5
) distributes the LLM’s width across several computers, in contrast to pipeline parallelization, which distributes the model across its depth. Each machine now holds a fraction of each of the layers of the model, such that per-layer computation is parallelized. When efficiently implemented, tensor parallelization improves inference speed. However, tensor parallelization is more complex to implement than pipeline parallelization: each layer must be parallelized, which increases code complexity. The scheme also involves many small communication operations: for each input token and for each layer, one must broadcast inputs and aggregate outputs. As a result, a very low-latency communication technology like Thunderbolt RDMA, supported by MLX
jaccl
, is critical for this approach to yield any speedup.
With MLX’s high-level
mlx.launch
helper, it is easy to switch to tensor parallelization. The Mac Studio computers are connected in a Thunderbolt mesh, with each pair of machines linked peer-to-peer by two Thunderbolt cables. Assuming the hosts are set up, we simply launch the benchmark across multiple machines with:
Figure 8
and
Figure 9
show the speedups obtained with two or four Mac Studio computers with M5 Ultra, relative to a single-machine baseline (or, for Muse Spark Open, the pipeline parallelization baseline). Notably, dense architectures scale better across multiple computers.
With a small number of machines, the communication overhead of tensor parallelization can offset some of its compute benefits at very large contexts, though this applies to prefill only. This shows up with Muse Spark Open, where separate normalization of the experts’ outputs adds some prefill communication, enough that at very large contexts (65,536 tokens), two-machine tensor parallelization lags behind two-machine pipeline parallelization. The approach however pays off as machines are added, as seen with four M5 Ultras. Decode is unaffected: Muse Spark Open sustains a significant decode speedup under tensor parallelization even at large contexts, comparable to dense models like Qwen 3.8 and Mistral Medium 3.5.
The two-cable mesh also pays off during prefill, where the extra link bandwidth is felt. For Muse Spark Open on four M5 Ultras at a 65,536-token context, two cables per link cut TTFT from about 50.5s (one cable) to 40.6s — the two-cable value reported in
Table 2
, the one-cable run being an additional experiment.
TTFT Speedup
Two or four Mac Studios with tensor parallelization, over a single M5 Ultra baseline (1.0×; Muse Spark Open: two-machine pipeline)
Figure 8: Time to first token (TTFT) speedup of two or four M5 Ultras with tensor parallelization over a single M5 Ultra baseline, for Qwen 3.8, Mistral Medium 3.5, and Muse Spark Open, at context sizes of 8,192 and 65,536 tokens. Muse Spark Open does not fit on a single machine, so its baseline is the two M5 Ultra pipeline configuration.
Decode Speedup
Two or four Mac Studios with tensor parallelization, over a single M5 Ultra baseline (1.0×; Muse Spark Open: two-machine pipeline)
Figure 9: Decode speedup of two or four M5 Ultras with tensor parallelization over a single M5 Ultra baseline, for Qwen 3.8, Mistral Medium 3.5, and Muse Spark Open, at context sizes of 8,192 and 65,536 tokens. Muse Spark Open does not fit on a single machine, so its baseline is the two M5 Ultra pipeline configuration.
Time to First Token (seconds)
Lower is better
Model
M3 Ultra
M5 Ultra
2 M5 Pipeline
2 M5 Tensor
4 M5 Tensor
Muse Spark Open
—
—
8.4
8.2
4.8
Mistral Medium 3.5
95.9
24.6
24.5
14.4
7.5
Qwen 3.8
18.2
4.1
4.1
3.1
1.7
Table 2: Time to first token (TTFT) in seconds for Qwen 3.8, Mistral Medium 3.5, and Muse Spark Open, at context sizes of 8,192 and 65,536 tokens. Lower is better. We report a single M3 Ultra, a single M5 Ultra, two M5 Ultras (pipeline and tensor parallelization), and four M5 Ultras (tensor parallelization).
Decode Speed (tokens per second)
Higher is better
Model
M3 Ultra
M5 Ultra
2 M5 Pipeline
2 M5 Tensor
4 M5 Tensor
Muse Spark Open
—
—
15.74
24.99
36.73
Mistral Medium 3.5
4.95
7.70
7.70
13.69
23.37
Qwen 3.8
12.46
19.69
19.44
33.27
50.89
Table 3: Decode speed in tokens per second for Qwen 3.8, Mistral Medium 3.5, and Muse Spark Open, at context sizes of 8,192 and 65,536 tokens. Higher is better. We report a single M3 Ultra, a single M5 Ultra, two M5 Ultras (pipeline and tensor parallelization), and four M5 Ultras (tensor parallelization). Decode speed was measured over 128 generated tokens following the context.
Recently, agentic AI on Mac has gained considerable traction, with agentic coding tools seeing widespread adoption among developers. With MLX, powering these tools locally is as simple as launching a server with the
mlx_lm.server
tool. For example, a server running Muse Spark Open on port 8080 is started with:
As with
mlx_lm.benchmark
, the
mlx_lm.server
helper can be prefixed with
mlx.launch
to parallelize computation across multiple Mac Studios. From there, agentic AI can be enabled with tools like
OpenCode
, which can be easily configured to use that local LLM server:
{"$schema":"https://opencode.ai/config.json","model":"meta-models/Muse-Spark-Open-816B-A42B-NVFP4","provider":{"mlx":{"npm":"@ai-sdk/openai-compatible","name":"Local MLX","options":{"baseURL":"http://127.0.0.1:8080/v1"},"models":{"meta-models/Muse-Spark-Open-816B-A42B-NVFP4":{"name":"Muse Spark Open 816B (MLX)"}}}}}
Many other local agentic AI experiences can be enabled through a similar approach.
Over the past year, we have worked on several key innovations in MLX to make it easier and more efficient to run state-of-the-art LLMs locally on recent Apple silicon. These include software support for the Neural Accelerators in the GPU of the M5 family of chips, low-latency communication across several Macs using RDMA over Thunderbolt, and efficient implementations of recent popular architectures such as mixture of experts (MoE). Each of these helps on its own, but it is their combination with the latest Apple silicon — Mac Studio with M5 Ultra, Neural Accelerators in the M5 Ultra GPU, 512GB of unified memory, and RDMA over Thunderbolt 5 — that now lets us run models like Muse Spark Open with more than 800B parameters locally, at up to 4.6× the start-up (time-to-first-token) speed of the previous generation of Mac Studio.
Apple is presenting new research at the annual
International Conference on Learning Representations (ICLR)
, which takes place in person in Rio de Janeiro, Brazil, from April 23 to 27. We are proud to again sponsor the conference, which brings together the scientific and industrial research communities focused on deep learning. Below is an overview of Apple’s participation at ICLR 2026.
Mac with Apple silicon is increasingly popular among AI developers and researchers interested in using their Mac to experiment with the latest models and techniques. With MLX, users can explore and run LLMs efficiently on Mac. It allows researchers to experiment with new inference or fine-tuning techniques, or investigate AI techniques in a private environment, on their own hardware. MLX works with all Apple silicon systems, and with the latest…
What was a Token Ring network? Token Ring is an obsolete networking technology that competed with Ethernet in the 1980s and 1990s. IBM first announced it October 15, 1985. It is more of a curiosity today, as the networking standard that lost. But when Token Ring equipment turns up, it can look enough like Ethernet to confuse people. And why it lost can be interesting to study.
Ethernet versus Token Ring
This Intel Token Ring card can pass for Ethernet. The best indicator from this photo is the DE-9 connector on the back. Ethernet never used that. Even though it was an IBM technology, companies like Intel and 3Com wanted in on the game.
Token Ring gets a bad rap today, and that isn’t necessarily fair. Token Ring was a standard backed by IBM. Ethernet was an open standard backed by
DEC
,
3Com
and others. Of course Ethernet won.
The main reason Ethernet won the war was because it was cheaper. Once you bought everything you needed, Ethernet cost a third as much. Whether Ethernet was half as good or 75% as good was always a matter of debate, but for a third the price, it only needed to be half as good to be a reasonable value.
Token Ring had one big weakness besides cost. It ran at specific speeds, and unlike Ethernet, all the cards on the ring had to talk at the same speed. If you had a 16 megabit network and brought up a system at 4 megabits, it took down the whole network.
I know this from experience. But I only made that mistake once.
But as long as you didn’t do that, Token Ring was extremely robust. it didn’t have a problem with collisions, unlike early Ethernet. The way Token Ring worked was the systems passed a token around the network. If you didn’t have the token, you didn’t get to talk. That meant no collisions. And it handled saturation much better.
I brought down an Ethernet network once just by trying to clone a classroom full of systems using Symantec Ghost’s multicast feature. I did it all the time when I worked in a Token Ring shop. The first time I did that on an Ethernet network, I took down all of the networking in the building. They had to isolate the classroom behind a bridge to allow me to do that. That was 24 years ago and I guarantee there are two people who who still hold that against me even though none of us work there anymore.
Why Ethernet won
Ethernet was junk if you went with the cheapest options all around, but you could make it acceptable if you invested some of the savings in improved technology. Replacing hubs with switches mostly eliminated the collision problem. Buying higher quality cards cut down on the reliability problem.
But the other reason Ethernet won was because of scale. It scaled to higher speeds first, so it won the war through brute force. Ethernet made it to 100 megabits first. Anyone who saw 16 megabit Token Ring in action can tell you it was way more than 60% faster than 10 megabit Ethernet, but 16 megabit Token Ring couldn’t keep up with 100 megabit Ethernet. And when 100 megabit Token Ring came out, the next iteration was going to be 128 megabit. Gigabit Ethernet came out before 128 megabit Token Ring ever saw the light of day.
And at gigabit speeds, the advantage of Token Ring over Ethernet was mostly academic. Maybe the network itself was a bit more robust in some ways, but the better efficiency didn’t matter much. The bus the cards plugged into and the disks in the system were bigger bottlenecks.
In 2022, we have a faster bus and SSDs so we’d be able to tell a difference, but then we’d be back at that problem of scale.
Telling the difference between a Token Ring and Ethernet card today
Whenever a retro computing Youtuber does a mail call that includes batches of random ISA cards, inevitably, when faced with a mystery network card, they will wonder aloud into the camera whether it is Ethernet or Token Ring. Telling the difference can be difficult. Even in the ’90s when both technologies were viable, professionals sometimes made the mistake. Plugging Ethernet into a Token Ring network because they were both CAT5 is just as fun as bringing up a node at 4 megabits on a 16 megabit network. And by fun, I mean destructive.
Yes, by the mid-90s, both technologies could run on RJ45 cabling. The pinout was different, but you could use the same cable for either. If you want to try to tell the difference by toning it out with a multimeter, what you need to know is that on Token Ring, the outer pins weren’t connected. On Ethernet from the same time period, the two center pins were the unconnected pins.
The D-sub connectors
But it’s usually easier to distinguish the two by looking at the other connectors. Ethernet used a 15-pin connector that looks quite a bit like a PC joystick connector. Token Ring used a 9-pin connector that looks like a 9-pin video connector or an Atari style joystick plug.
Coax connections
Coax connectors for Token Ring did exist, but were more common on Ethernet networks. The presence of a coax connector on a card isn’t a reliable indicator of either network type. But it was more common with Ethernet than Token Ring, so if I see a coax connector on an unknown card, it tilts it in favor of Ethernet.
Speed indicators
The LEDs and other printing on the card can be a very good indicator. The majority of ISA Ethernet cards you will find ran at 10 megabits. PCI cards ran at 10 and 100 megabits. So look for any speed indicator legends that might be printed or embossed on the card, either on the backplate or on the PCB itself.
Token Ring ran at 4 megabits and 16 megabits. So on an ISA card, if you see both a link activity light and a speed light, and the light indicates a speed of 4 or 16, that’s Token Ring. If there is a dip switch to set a speed of 4 or 16 megabits, that’s Token Ring.
Brand
You can’t necessarily go by brand. IBM sold Ethernet cards, and Intel and 3Com did make Token Ring cards. So don’t automatically assume a 3Com or Intel ISA card that looks like a network card is Ethernet.
There were other obscure makers of Token Ring cards, including Thomas Conrad and Madge.
Is Token Ring hardware worth messing with today?
I liked Token Ring when it was still on the market, though I might have thought differently if I had been in on the yearly computing budget. But once it was becoming clear that Token Ring was the
Betamax of networking
, people started replacing it with Ethernet. Since the cards took up less space, they were less likely to get scrapped than the equipment in the racks or wiring closets.
It’s easier to find the cards today than the necessary supporting infrastructure, like a MAU, the equivalent of an Ethernet switch. And bridging Ethernet and Token Ring is more difficult than just slapping one of each card in a Linux box and configuring the two cards to route.
That’s not to say using it is impossible today. It’s impractical and difficult. But if that’s your idea of fun, don’t let me dissuade you. It’s not my idea of fun. But I don’t think coax-based Ethernet is worth messing with either, and there are people who do that.
Why anyone messed with Token Ring at all
One question I hear sometimes is why anyone messed with Token Ring at all, since Ethernet was an open standard, and open standards are better.
It helps to remember that the IBM of the 1980s was not the same company that
IBM is today
. Not only you were they a dominant player in the personal computer market, they were also the dominant player in the minicomputer and mainframe markets, which, at the time, was what some people considered serious computing. It was the preferred networking option for IBM minicomputers and mainframes.
There was a saying in the 1980s that nobody got fired for choosing IBM. That alone gave Token Ring a chance, for a few years.
ARCNET
was another competitor from the same timeframe. It, too, was a contender for a while because it was backed by
Datapoint
, a pioneer in office automation using small computers.
Are Ethernet and Token Ring interchangeable or interoperable?
Sometimes you will see cards and hubs listed on eBay as both, which may lead someone to believe the two are interchangeable, or that some kind of dual-standard cards and hubs existed for a time. Don’t believe the listing. Network cards were one or the other, not both. Hubs and switches are Ethernet. The equivalent equipment for Token Ring was called a MAU.
Unless you can tell from looking at the photos what it is, don’t buy it. And if they listed it as both, assume it’s untested. If the price is good and the photographs permit identification, you
may
be able to snag a bargain.
David Farquhar is a computer security professional, entrepreneur, and author. He has written professionally about computers since 1991, so he was writing about retro computers when they were still new. He has been working in IT professionally since 1994 and has specialized in vulnerability management since 2013. He holds Security+ and CISSP certifications. Today he blogs five times a week, mostly about retro computers and retro gaming covering the time period from 1975 to 2000.
For the last few days I have been playing with
RFC8950
setup, which allows routing of IPv4 on top of IPv6. While logically it’s quite simple, it has a very powerful application towards making “
IPv4 an optional
” feature riding on top of an IPv6 network (
but without any tunnels!
)
Some of the interesting use cases:
A large network can run IPv6 only everywhere on its core and leave IPv4 only on edge devices. This can work without customers doing any tweaking at their end. They still do things the old way but Backbone can run IPv6 only at its core.
An IP transit backbone can run IPv6 only while exchanging IPv4 routes with its customers/peers/upstream over IPv6 sessions. So IPv4 as a “feature” stays but the network in itself is IPv6 only without the overhead of IPv4 interface config, BGP session config, firewall config, etc.
An IXP can offer services without IPv4 essentually by using a (unique) IPv6 at the IX LAN & running route server to exchange both IPv4 & IPv6 routes over the IPv6 only session.
Thus what 464XLAT did to the mobile networks - this has the potential to do that for the backbone networks.
How does it work?
Multi-protocol BGP (MP-BGP) supports announcement of IPv4 routes over IPv6 sessions with IPv4 next-hops and IPv6 routes over IPv4 sessions with IPv6 next-hops. RFC8950 extends this feature for IPv4 to have IPv6 next-hops. So for IPv4 address, next hop is IPv6, IPv6 reach works via usual NDP and IPv4 rides on ethernet frames to the same MAC as discovered by the NDP. Technically RFC8950 only impacts control plane decisions by using IPv6 as the control plane but keeps the data plane as it is. IPv4 stays IPv4 & goes as IPv4 over the wire unlike say some tunnel or 464xLAT etc.
Hardware support
As of now it’s quite widely supported by a lot of routing platforms like Juniper JunOS, Cisco IOS XR, Nokia SR OS, Mikrotik, Huawei, BIRD, FRR etc. So, it is very likely supported if you are running a recent version of the OS.
Demo lab
Here’s a fun lab with two customer routers: C1 & C2 connected via provider routers R1-R2-R3 in
Container Lab
. All routers here are running
open source FRR
.
C1 is IPv6 only on the WAN side facing R1. It originates 10.0.0.0/24 to R1 over an IPv6 session.
R1 & R2 are IPv6 only with no IPv4 anywhere on their interfaces (but carry IPv4 routes in their table)
R3 has IPv6 with R2 but just IPv4 only with C2. So C2 is like a typical enterprise user who lacks IPv6 deployment and still wants IPv4 only to work.
R3 has 100.64.0.0/24 and originates it in the IPv4 table (to IPv6 adjacency - R2)
C2 sits on 100.64.0.2/30 given by R3 and communicate in IPv4 only.
C1 and C2 can reach each other over this network with parts being IPv6 only without any tunnel.
> clab deploy -t topology.yml
16:37:08 INFO Containerlab started version=0.76.1
16:37:08 INFO Parsing & checking topology file=topology.yml
16:37:09 INFO Creating lab directory path=~/ipv4-over-ipv6/clab-rfc8950
16:37:09 INFO Creating container name=C2
16:37:09 INFO Creating container name=C1
16:37:09 INFO Creating container name=R1
16:37:09 INFO Creating container name=R2
16:37:09 INFO Creating container name=R3
16:37:09 INFO Created link: R3:eth2 ▪┄┄▪ C2:eth1
16:37:09 INFO Created link: C1:eth1 ▪┄┄▪ R1:eth1
16:37:09 INFO Created link: R1:eth2 ▪┄┄▪ R2:eth1
16:37:09 INFO Created link: R2:eth2 ▪┄┄▪ R3:eth1
16:37:09 INFO Adding host entries path=/etc/hosts
16:37:09 INFO Adding SSH config for nodes path=/etc/ssh/ssh_config.d/clab-rfc8950.conf
╭─────────────────┬───────────────┬─────────┬───────────────────╮
│ Name │ Kind/Image │ State │ IPv4/6 Address │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-C1 │ linux │ running │ 172.20.20.6 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::6 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-C2 │ linux │ running │ 172.20.20.4 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::4 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-R1 │ linux │ running │ 172.20.20.2 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::2 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-R2 │ linux │ running │ 172.20.20.8 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::8 │
├─────────────────┼───────────────┼─────────┼───────────────────┤
│ clab-rfc8950-R3 │ linux │ running │ 172.20.20.5 │
│ │ frr-with-bgpd │ │ 3fff:172:20:20::5 │
╰─────────────────┴───────────────┴─────────┴───────────────────╯
Checking C1 for route to C2
C1# show ip bgp 100.64.0.2
BGP routing table entry for 100.64.0.0/24, version 2
Paths: (1 available, best #1, table default)
Advertised to non peer-group peers:
2001:db8:0:1::1
65501 65502 65503
2001:db8:0:1::1 from 2001:db8:0:1::1 (172.20.20.2)
(fe80::a8c1:abff:fe60:5467) (used)
Origin IGP, valid, external, best (First path received)
Last update: Mon Jun 22 18:57:38 2026
C1#
C1 -> C2 trace
C1# traceroute 100.64.0.2
traceroute to 100.64.0.2 (100.64.0.2), 30 hops max, 46 byte packets
1 clab-rfc8950-R1.clab (172.20.20.2) 0.004 ms 0.004 ms 0.002 ms
2 clab-rfc8950-R2.clab (172.20.20.8) 0.002 ms 0.003 ms 0.003 ms
3 clab-rfc8950-R3.clab (172.20.20.5) 0.002 ms 0.003 ms 0.003 ms
4 100.64.0.2 (100.64.0.2) 0.002 ms 0.006 ms 0.003 ms
C1#
Note: It took IPv4 from the eth0 management interfaces as deployed by Container Lab for TTL exceeded used in the trace.
If I check R1, it has only IPv6 sessions but no IPv6 prefixes
R1# sh bgp ipv6 summary
IPv6 Unicast Summary (VRF default):
BGP router identifier 172.20.20.2, local AS number 65501 vrf-id 0
BGP table version 0
RIB entries 0, using 0 bytes of memory
Peers 2, using 1434 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
2001:db8:0:1::2 4 64512 151 141 0 0 0 00:39:19 0 0 N/A
2001:db8:0:2::2 4 65502 65 64 0 0 0 00:36:46 0 0 N/A
Total number of neighbors 2
R1#
Checking for IPv4 routes on R1
R1# sh bgp ipv4
BGP table version is 4, local router ID is 172.20.20.2, vrf id 0
Default local pref 100, local AS 65501
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.0.0.0/24 fe80::a8c1:abff:fe44:afb8
0 0 64512 i
*> 100.64.0.0/24 fe80::a8c1:abff:fed8:5eb5
0 65502 65503 i
Displayed 2 routes and 2 total paths
R1#
This Spew contains minor spoilers! Plus more news for your Friday.
Scott's Picks:
I like thinking about movies in terms of which collective subconscious cultural anxieties they are channeling. This year, two movies have gripped New York audiences: Nathan Fielder and Lance Oppenheim's "
You Can See Everything
," and Curry Barker’s horror flick "
Obsession
." By accident of release dates, popular interest, and my personal happenstance filmgoing, these two movies are talking to each other, and it's an interesting conversation!
I can hardly remember first experiencing ChatGPT. Its become so infused into my professional life, that going back to that first moment, or moments, is difficult. Instead a blur of a few moments. At some point, I realized it was a better Google. It was very similar to when Stackoverflow took off, and how Google search results for coding topics went from being useless to useful. Absence of results indicating a “you are holding it wrong” moment. I remember toying with it, and then remember Bryan nagging me “did you ask ChatGPT?” and being constantly annoyed. Until I wasn’t, and that became my default starting point.
The next phase came soon after. I had begun copy and pasting code; usually Ruby spec’s I didn’t want to hand write. I’d describe the idioms, or paste in some example code + my new behaviors, and have it spit out the code. This was much faster than typing it into an IDE that did not have code complete enabled the way I was used to in real, typed languages. Sorry, I always hated writing Ruby. Perhaps I would have become fast at writing it eventually, the way the lovers of Rails did. But I couldn’t visualize this future, and ChatGPT provided an escape hatch. The first 5 or 6 languages I used professionally, I learned to love and be efficient with in one way or another. But I’d hit my limit, and now felt justified in delaying learning it better.
The next moments came as a pair: Tab completion and using copy-paste on a new domain. Tab completion was more natural. Sometimes helpful, sometimes not. Its key aspect was how it was integrated into the ide I was already familiar with, vscode - forked into Cursor. Picking up the patterns I put down was about all it could do; I rarely if ever relied on its intelligence or actual suggestions.
For real suggestions I was still copy pasting ChatGPT. But this was different. before it was merely a more sophisticated auto complete. Now I was fusing Google search + code generation in a new domain: Computer vision in python. I’d moved onto a temporary vision project (boundary and alignment of novel objects); I knew nothing of this. As fast as I could “search”, I prompted my responses into code. This was one of my favorite phases, before the word vomit of later Opus models. ChatGPT would spit out code just the way I liked. Sometimes I just needed a nudge, a specific API or one line snippet. Word vomiting on it and getting a single line back, often with a cheeky insult as I requested. I’d run it in Jupyter notebook and run the code, then tinker and modify it, producing visuals and dots and graphs; simultaneously learning the APIs and the domain while building something.
This was also the time I was most exposed to hallucinations, and found how easy they were to detect and deal with. To me it became a signal of what ChatGPT did and did not know; hallucinations appear at the boundary, and it became my turn to fill in the blanks, figure out how things worked that were less documented, or perhaps unique to our use cases. It was slow going at times, but then I can hardly imagine jumping into a computer vision project and shipping something so quickly without it. This was a pleasing future; one more about eliminating SEO spam and poorly written documentation on untyped languages (which were more reliant on good docs), than one in which I was giving up control.
Agentic programming came soon next. I still distinctly remember reading
“Snorting the AGI”
and
Karpathy’s famous quip’s
around this time, and being a little surprised by them. WTF were these people talking about? But slowly I learned to move off of tab completions, and on to agentic prompting. Now on Claude, but again like my ChatGPT moments, I learned to recognize its limits and work within them; slowly improving my prompts and becoming more efficient at knowing what it could and could not accomplish. I was amused watching people work through this process; laborious long winded prompts, more like wishlists but alien because they knew how to program. This was less about skill and more about groking how to work within its bounds; although their way of working was in a sense more anticipating the future than my own. “Add date sorting to Tasks.tsx, detail page; use shell system see components/Shells.tsx mimic Research.tsx for details and Users.spec.tsx for tests; follow community idioms over our own avoid mocking use stubs.spec.tsx patterns”.
One day I looked up, and realized my prompting approach wasn’t a fun trick but instead the primary way I worked now. Still the codebase was fully in my head; every line reviewed. More PRs resulted in requesting changes or making them myself. Productivity was up a fair amount, though this was at least partially because I was freed from working on code I did not ultimately like. Tab completing was rare. The agentic flow felt powerful, useful, and limited all at the same time. I still needed to tell it what to do, and if it was anything tricky, do it myself.
Then Opus 4.5/6 happened. Describing the shift makes it sound more subtle than it was. But suddenly, the granularity i had to describe tasks, and the time I spent hand holding them, dropped. My productivity went from slightly better, to around 3x (measured across a few months of merged PRs). The level of features and polish were up, not needing to be so constrained in what we chose to ship. The ideas in my head all pouring out, coming to life, slowly. Still constraint remained; PRs were becoming the bottleneck. The codebase was still fully in my head, the lines still mostly reviewed. I became better at scanning. I began to feel using standard libraries, components, patterns, were even more important, because it allowed you to effectively ignore most of the code changes - so long as they were on the rails, the damage was limited, the refactoring easy. Look for the more important parts. The parts with business logic that was unique to our business. The parts dealing with customer data that needs human eyes. The parts that might break irreversibly - database changes, encryption, etc. This job was still understandable, still pleasing. It was now almost entirely that I thought in terms of the important stuff - architecture, migration plans, key business logic, the purpose of the system, protecting data and access. All the mechanical boring parts faded away.
Progressing through Opus 5 it was more mundane bits that stood out. I could tell each model was better. The code was slowly better, each round. Fewer corrections. Sometimes it corrected me now. But this phase was more about costs. And how verbose it got. Slowly I began to hate dealing with Opus, and briefly moved to ChatGPT. The models were nearly as good in the cases I used it, very often equivalent. But far cheaper, more autonomous, and less verbose. I distrust OpenAI and am thus biased against it, even when parts of it are better (its interface, its voice chat, etc). So long as Anthropic’s coding model was nearly as good - and outside of ChatGPT 5.5 it was usually better - I was ok going back. Given what was at stake, I was sure Anthropic would sort out the wall of text issues - that is my job after all.
Then Opus 5.5 dropped. Again I feel frozen, at zero. I spend a lot of time on twitter, seeing what people are cooking up. Being amazed by it; trying to understand it. Again we learn and adapt. Again my ways of working change. Agentic coding is… different. Telling the model what to do, and checking its results… I need to elevate. What level do I need to operate at? I build more ambitious side projects. I copy what I see in a cool tweet, and try to one shot it. I collect a lot of garbage and
produce a lot of garbage
, even more than usual. Often it feels like drivel; but collecting ideas is fun anyways.
A unified activity feed to more quickly see the bots commits and notes across all my projects
I start working off of plans. Not the old kind, where I’d plan out work, then implement it in phases. Instead I don’t think about the code review I want to do. I think about the QA I want to do. I think - how far can the app go, before it would be more work to go backwards? Architecture decisions are reversible. If I’m unsure about how the UI should look… I’ll just have it make more of them. If I have three similar ideas, make all three. Can I break this out into a single HTML page?
I have Claude dump its plan, progress, and overall project notes into my notes app(s); sometimes I work from these rather than the chat now
I generate more artifacts, now backed by data. I turn them into tools the AI can use to track its working state, and its history; tools that I can use to visualize its progress. Vulnerability reports get fixed in batches; I look at burndown charts with ticks of key moments. If I worry about the performance impact; I have it monitor performance too. I move more of the work into “subagents”, and have a supervisor stand above so it can see the whole picture. I start to wonder what level of architecture I need to dictate, or what kinds of outcomes I should focus on instead. Will it have gaps? Can I merely have another model try and exploit them to find out; to report its results, and have the models coordinate to harden the design?
Metrics dashboards can be combined with activity tracking and state management; both the LLM and human can make use of it
I want the UI to be snappy. I used to dictate using observables and other optimization preferences - and sometimes still do. But I can also merely add constraints - the image should process within 15ms
presses
<enter>
. Oh shoot - I meant to write 150ms but… oh… I guess lets simply see i the model can do it? Wow. I realize… I need to re-evaluate what I think of as possible and not. I prompt the model to explore moving my electron notes app to iphone, finally. Native swift, re-writing whatever we want. I think i’m ideating, I hit enter and leave. A few hours later I’m checking the news on my phone, and am interrupted by a (basic) working app, installed over the network so the model could ask me to QA it. It used 40% of my 5-hour limit on my $20 subscription. Its not feature complete, but it works?. I use the importer and import all my notes… It looks great. Its a few moments of staring at the screen, dumbfounded.
Everything is upside down yet again. I think about the future. But I work in the present. How I work is changing again; we adapt as we must. If I forget about my fear, I instead become very excited. It can feel empowering the faster I let go of how I used to work, and instead embrace how it is now. As the code moves faster, how can I continue to understand it? I come up with new metrics, new dashboards. I think harder about the the most important parts of the design and the constraints are. That is the only place that deserves attention and effort. I think about building tools to help me understand, and tools for the model to use. Tools to iterate on ideas more quickly; to come up with new ideas, mix and match old ones. Tools to better discover what other people are doing, to think about how things my interoperate, and try to build that.
And when I come up for air, I’m amazed by how much things have changed. How quickly the models have changed. And yet, how also we have changed, and continue to adapt to the new ways of working. Many things about the old ways of working, I miss. Many things I do not. The old way of working feels like just yesterday; but also it feels to be drifting off into the distance.
Security updates for Friday
Linux Weekly News
lwn.net
2026-10-16 09:17:44
Security updates have been issued by AlmaLinux (ghostscript, grafana, hplip, libsoup3, lrzsz, rpcbind, and wireshark), Debian (chromium, cifs-utils, expat, gst-plugins-bad1.0, gst-plugins-good1.0, jpeg-xl, mutt, and spip), Mageia (gpsd, libx11, and roundcubemail), Oracle (389-ds-base, compat-libtiff...
Police in Amsterdam seized a server from a data center in the city’s eastern district on Tuesday, following a request from U.S. authorities. The police confirmed the seizure after it was reported by the NRC.
The seized server belongs to Italian internet provider Autistici/Inventati (A/I). Dutch police are creating a digital image of its data to hand over to U.S. authorities, as required under the American request for legal assistance.
For years, A/I offered free website hosting and email services to thousands of organizations. It attracted the attention of the Trump administration, which regards antifa as a terrorist organization. In late August, U.S. authorities also labeled A/I a terrorist organization, alleging that it had supported antifa. NRC described the move as exceptional, noting that internet service providers are not usually held liable for what their users do.
U.S. sanctions left A/I unable to access its bank account and cost it its domain name. The organization's volunteers then decided to disband it to protect users and donors from potential repercussions linked to their association with A/I. According to NRC, the seizure of a server in Amsterdam suggests those concerns may have been justified.
Police have not disclosed which specific data will be transferred to U.S. authorities. The server will be returned to the data center once the process is complete.
Reporting by ANP
The ultra-rich are spending one million dollars a day fighting California’s proposed billionaire tax
Guardian
www.theguardian.com
2026-10-16 09:00:11
Tech billionaires have raised more than $340m to defeat Prop 40, a one-time 5% wealth tax that will fund healthcare and education Tech billionaires have been dumping hundreds of millions of dollars into the fight against a wealth tax in California. They’ve raised more than $340m, and the campaign th...
Tech billionaires have been dumping hundreds of millions of dollars into the fight against a wealth tax in
California
. They’ve raised more than $340m, and the campaign they’re funding is spending more than $1m a day to defeat the measure, according to state financial disclosures.
With the election less than a month away, those funds are being spent at a stepped-up pace. During the first 19 days of September, according to the most recent campaign filings, the opposition campaign plowed through at least $21.2m to fight the billionaire tax – surpassing $1m per day. Voters are being inundated with robotexts, mailers and advertisements that warn a tax on billionaires would “expose all Californians to higher taxes”, as one ad reads.
Californians will vote on the ballot measure, Proposition 40, in early November. If passed, it would
require a one-time 5% tax
on the state’s billionaires, with the proceeds mostly funding healthcare programs, along with some education and food assistance. The measure has divided Democrats in the state, with some giving enthusiastic support and others rejecting the proposal because it’s just a one-time levy and the bulk of it would only fund certain healthcare programs.
The state’s major unions and progressive politicians like the Vermont senator Bernie Sanders and California congressman Ro Khanna back Prop 40. But both the Democratic and Republican candidates for governor, as well as organizations like Planned Parenthood Affiliates of California, a lobbying branch of the healthcare group, oppose it. Among its fiercest critics, however, are the tech billionaires it would most directly apply to.
The donors to the no campaign are
a who’s who of Silicon Valley
, including the Palantir co-founder Peter Thiel, former Google CEO Eric Schmidt, DoorDash CEO Tony Xu, Stripe CEO Patrick Collison, crypto magnate Chris Larsen and several prominent venture capitalists.
The biggest donor, by far, is the Google co-founder
Sergey Brin
, who has contributed at least $102m to fight the tax, according to campaign finance filings. The runner-up is Schmidt, who has donated more than $42m. For comparison, the yes on 40 campaign has raised a total that’s just shy of $33m, mostly from the healthcare union sponsoring the measure.
Proponents and opponents alike are casting the billionaire tax as a potential first step toward wealth taxes in more states. While those against the measure
see it as populist contagion
, those in favor connect it to the top issue of the midterms – affordability. And with California having more billionaires than any other state, Prop 40 is seen as setting the stage for more referendums on wealth inequality throughout the country.
“There’s a lot of volatility among the electorate surrounding a pushback against Marie Antoinette and her tech friends,” said David McCuan, a political science professor at Sonoma State University who studies ballot measures. “And that’s what the ‘yes’ forces are relying on.”
Recent polling on Prop 40 shows that it’s favored to pass, but its lead has shrunk over the last few weeks as the opposition campaign has increased spending. A
late-September poll
by the University of California shows 45% of voters likely to vote yes on the tax with 42% voting no. Just a month earlier, the proposal
enjoyed a 7% lead
.
People attend a rally against Proposition 40 at the Iron Workers Apprenticeship Training center on 5 October in La Palma, California.
Photograph: Eric Thayer/Los Angeles Times/Getty Images
Complicating matters are
two separate countermeasures
that Prop 40’s opponents successfully placed on the November ballot, Proposition 41 and 42. Prop 41 directly targets the billionaire tax, while Prop 42 is more of a general proposal to protect individuals from certain new taxes. If either of these measures receives more yes votes than Prop 40, they will stop the billionaire tax from taking effect – even if it passes.
“Props 41 and 42 have poison pills in them to destroy 40,” McCuan said. “And when voters are confused, when they are uncertain … it’s much easier to get a no vote.”
Big tech’s strategy
Earlier this month, the campaign fighting the billionaire tax placed an ad on television, digital and streaming platforms across the state. It starts with quiet, foreboding music and the president of the California Medical Association, René Bravo, dressed in a white lab coat, saying: “The people pushing Prop 40 say it’s supposed to improve healthcare. That’s not true.”
The campaign has debuted similar ads saying teachers, carpenters and firefighters also oppose the wealth tax, saying it’s “a dangerous experiment”.
The messaging around the campaign centers on how the tax would hurt “doctors, teachers, small businesses, working families and public safety”, without mention of the state’s billionaires. The no on Prop 40 campaign calls it “an everyone tax”.
Likewise, the campaigns for the two measures that would pre-empt the billionaire tax argue these proposals promote transparency and have the backing of small businesses and taxpayers. One of the measures says its coalition includes retirees, blue-collar workers, seniors and veterans.
The three campaigns against the wealth tax, however, draw nearly all of their funding from Super Pacs loaded with
Silicon Valley
money, according to campaign finance filings. Since July, the committees opposing Prop 40 and supporting Props 41 and 42 have received a total of more than $297.8m, most of that from a Super Pac called Building a Better California.
The billionaires have found themselves in alliance with several healthcare, education, construction and public safety unions and associations. Governor Gavin Newsom has decried the billionaire tax, as have gubernatorial candidates, Xavier Becerra and Steve Hilton. Katie Porter, a former Democratic Congresswoman known for taking corporate executives to task, has become one of the main faces of the opposition campaign – writing op-eds, speaking at rallies and being quoted in ads and mailers.
The three campaigns are spending much of their fortunes on an army of consultants tasked with everything from lobbying politicians to working on media strategy. The consultants include the Republican-leaning law firm Nielsen Merksamer, known for
fighting on behalf
of tobacco companies, and the political consultancy PCI Campaigns, known for
battling propositions
that sought to repeal the death penalty and require condom use in pornographic films.
Planned Parenthood Affiliates of California is also listed as a paid contractor in campaign filings and has been one of the no campaign’s most vocal endorsers.
State filings show that the campaigns donated tens of thousands to the California Democratic party, along with the Democratic parties of San Diego, Orange county and Los Angeles county. Despite the donations, all of these Democratic parties have backed the billionaire tax, urging a yes vote on Prop 40.
Opponents of the wealth tax have also explicitly targeted the Latino community, placing ads, articles and op-eds in Spanish-language news outlets throughout the state. One
article
in San Diego’s El Latino is headlined: “No a la Proposición 40: Una Buena Idea, Mal Construida” (“No on Proposition 40: A good idea, poorly executed”).
When asked about the no on Prop 40’s spending strategy and donations it has received from
Super Pacs
, a spokesperson for the campaign emailed a comment from Bravo: “The more Californians learn, the more they see Prop. 40 for what it is – a harmful tax scheme that permanently damages the state’s budget and economy with zero accountability or safeguards to ensure funding actually improves care or lowers costs for patients.”
Brin and Planned Parenthood Affiliates of California didn’t return requests for comment. The Building a Better California Super Pac declined to comment.
Yes on 40’s strategy
Last week, Sanders, the progressive senator from Vermont,
traveled to California
to stump for Prop 40 alongside state politicians. The longtime advocate of wealth taxes announced to a crowded rally of supporters that the measure was “the most important ballot initiative in the country”.
Ro Khanna introduces the Vermont senator Bernie Sanders at the Ballots over Billionaires event in downtown Los Angeles on 5 October.
Photograph: Jackson Tammariello/Zuma Press Wire/Shutterstock
“The whole country, and frankly people from around the world, are paying attention to what is happening here,” Sanders said to wild applause. “It is not easy running a campaign where you’re going to be greatly outspent. But that is what you are doing, and the entire country is proud.”
The billionaire tax was
first proposed late last year
by the Service Employees International Union-United Healthcare Workers West (SEIU-UHW), which says the one-time tax is necessary because of huge federal healthcare funding cuts under Donald Trump’s One Big Beautiful Bill Act. The union says the funding would preserve healthcare for 3.4 million Californians.
Since then, the campaign has garnered momentum through its partnerships with unions, community leaders and progressive politicians, including Khanna, a Democratic congressman who represents the district that includes Silicon Valley, the powerful California Federation of Labor Unions AFL-CIO, the California Teamsters union and the state’s Democratic party. Besides the SEIU-UHW, one of the campaign’s biggest donors is Saikat Chakrabarti, a former tech engineer who ran for Congress earlier this year but lost in the primary.
“A few controversial billionaires like Sergey Brin would rather spend millions to fund shady opposition campaigns than simply pay their fair share in taxes so millions of their fellow Californians don’t lose their healthcare,” said Debru Carthan, a spokesperson for the yes campaign and vice-president of SEIU-UHW. “No amount of billionaire spending is going to intimidate us or turn us back.”
Instead of relying on more expensive traditional media, the yes campaign has turned to Instagram, Snapchat and YouTube to create viral moments and target younger audiences. Campaign finance disclosures show campaign expenditures have gone to consultants, mailers and social media ads.
“Dolly Parton could have died a billionaire and she didn’t,” said an unnamed influencer in a yes on Prop 40
post
last month. “And the one reason that she didn’t is that she spent decades of her life giving away her money to charity and to philanthropy … There’s a really simple question that I want to ask the billionaires of California: how much is enough?”
The no on Prop 40 campaign has also paid for ads on Google, Instagram, Yahoo, X and Taboola, according to campaign filings. It has additionally paid $3,000 for its Instagram posts to be amplified – a practice that gives an inorganic boost to social media.
“Billionaires are pouring hundreds of millions into deceptive commercials to confuse voters about Prop 40 because the truth is, they know that taxing the rich is popular,” said Lorena Gonzalez, president of the California Federation of Labor Unions. “We cannot let them buy our elections and choose who gets to live or die.”
McCuan echoes the idea that the vote on Prop 40 is bigger than this election. How voters come down on the ballot measure will signal whether the issue will spill over to more states and even nationally, he said.
“That is about testing the broader issue of wealth inequality and affordability in a wide-open presidential election in 2028,” McCuan said. “And if you’re a zillionaire or on the no side, you want to nip this thing in the bud so it doesn’t go to other places.”
Mull: note-taking with a language server / vscode extension
Lobsters
github.com
2026-10-16 08:54:20
I've been writing notes as plain text files since forever, and it occurred to me that note-taking could benefit from the typical features that a language server provides: clickable links, autocomplete, hover previews, formatting, diagnostics, refactoring, etc. So I built a little language server and...
Mull
is a tool for managing a wiki stored in a plain text file. It has a
Visual Studio Code
/
Cursor
extension which provides syntax highlighting, hover previews, completions, diagnostics, formatting, refactoring, etc.
A quick tour
Pages and links
A
wiki
is a text file with a
.mull
extension. It contains
pages
which link to each other, all in the same file. Here's a little wiki with 3 pages:
# Home
My go-to breakfast is [Pancakes] with fresh [Lemons].
# Lemons
Great on [Pancakes].
# Pancakes- 1 cup of flour
- 1 cup of milk
- 1 egg
- A squeeze of [Lemons]
Each page starts with a
# Title
, followed by the contents of the page. To link to a page, use square brackets like
[Lemons]
. When you type the opening
[
, autocomplete kicks in to help you find the page you're looking for.
Every wiki starts with a
Home
page. Mull requires that every other page is
reachable
(directly or indirectly) by following links, starting from
Home
. This rule promotes a basic form of organization that doesn't involve any hierarchical structure. Pages serve the roles traditionally filled by files
and
directories.
Mull formats the wiki when you save the file (default), or when you explicitly request it. It chooses the ordering of the pages in the file based on the links between them, so you don't have to think about it. Linking to pages is the only way to organize them.
Linking to files and directories
You can link to files like photos, spreadsheets, or anything else. Mull checks that the linked files actually exist, and you can preview them without leaving the editor.
Files go in a directory next to the wiki named after the wiki, with the
.mull
extension replaced with
_files
. For example, if the wiki is
my_wiki.mull
, the files go in
my_wiki_files
. If you have a file called
my_wiki_files/photos/beach.jpg
, you can link it with
[/photos/beach.jpg]
. You can also link to directories like
[/photos/]
.
Autocomplete helps you enter the names of files and directories when linking to them. You can also drag-and-drop (while holding the
Shift
key) or paste files directly into the editor.
Just as every page must be reachable from
Home
, every file in
<wiki>_files
(if it exists) must be linked to from the wiki. A link to a directory implicitly counts as linking to everything inside it. An empty directory needs a link of its own.
Opening a portal to another page
A portal is a window into another page. It holds a copy of the page's contents, and Mull keeps them in sync. For example, if you have a page called
Pancakes
, you can open a portal to it from another page like this:
This is my favorite breakfast:
::: [Pancakes] :::
When the wiki is formatted (e.g., on save), that line will be expanded into a copy of the page:
This is my favorite breakfast:
::: [Pancakes]- 1 cup of flour
- 1 cup of milk
- 1 egg
- A squeeze of [Lemons]
:::
You can edit the page or any of its portals, and formatting will propagate your edits to the rest.
Extending Mull with scripts
Suppose you have a list that you want to keep sorted:
The contents of my pantry:
- Garlic
- Kosher salt
- Miso
- Olive oil
- Rice
Mull can help with this; you just have to teach it about sorting. Create a file called
<wiki>_files/scripts/sort.sh
with the following contents:
Make it executable with
chmod +x <wiki>_files/scripts/sort.sh
.
Now you can put the list in a
sort
block:
The contents of my pantry:
::: sort
- Garlic
- Kosher salt
- Miso
- Olive oil
- Rice
:::
Mull will then sort the list automatically whenever the wiki is formatted (e.g., on save). That sorting script accepts arguments, so you can, for example, sort in reverse order with
::: sort -r
.
Using a script in a block counts as linking to it, so it doesn't need to be linked to from the wiki like other files in
<wiki>_files
. An unused script still needs a link (e.g.,
[/scripts/sort.sh]
) somewhere in the wiki.
Escaping and code
To use a special symbol like
[
or
]
literally, put a backslash before it, like
\[
. You can also use backticks to denote verbatim text like
`this`
, as in Markdown. Fenced code blocks are supported too, with syntax highlighting for common languages.
# Home
I'm learning Python, currently working on a [Dice game].
# Dice game```pythonimport random
for turn inrange(3):
roll = random.randint(1, 6)
print(f"Roll {turn +1}: {roll}")
print("Thanks for playing!")
```
No escaping is necessary inside page titles or code.
Keyboard shortcuts
These common keyboard shortcuts are helpful when navigating and editing a wiki:
Action
macOS
Windows
Jump to a page from a link
F12
or
Command + click
F12
or
Control + click
Jump to links to a page (i.e., backlinks)
Shift + F12
Shift + F12
Jump back to the previously visited page
Command + [
Alt + Left
Jump forward to the next visited page
Command + ]
Alt + Right
Jump to the start of the current page
Command + Up
Control + Home
Jump to the end of the current page
Command + Down
Control + End
Jump to the next error
F8
F8
Jump to the previous error
Shift + F8
Shift + F8
Find a page
Command + Shift + O
Control + Shift + O
Code actions (e.g., create a missing page)
Command + .
Control + .
Rename a page
F2
F2
Format the wiki
Shift + Option + F
Shift + Alt + F
Most of these keyboard shortcuts are standard in Visual Studio Code and Cursor, so they may be familiar to you already. You can remap them.
Usage
Once Mull is
installed
for Visual Studio Code or Cursor, you can run it by opening a
.mull
file in the editor.
You can also run Mull from the command line (e.g., in a CI job) as follows:
mull check --path wiki.mull
Here are the supported command-line options:
Usage: mull [COMMAND]
Commands:
check Check that a wiki is valid and formatted, with its scripts run
format Format a wiki, running its scripts (default)
page Print the content of a page in a wiki
language-server Start the language server (editors use this)
help Print this message or the help of the given subcommand(s)
Options:
-v, --version Print version
-h, --help Print help
Installation instructions
To use Mull, you must install the binary and optionally the Visual Studio Code / Cursor extension. The binary does all the work and can be used by itself from the command line. The IDE extensions use the binary to provide a rich wiki editing experience.
Installation on macOS or Linux (AArch64 or x86-64)
If you're running macOS or Linux (AArch64 or x86-64), you can install Mull with this command:
curl https://raw.githubusercontent.com/stepchowfun/mull/main/install.sh -LSfs | sh
It first installs the binary, then it installs the extension for Visual Studio Code and/or Cursor.
The same command can be used again to update to the latest version.
The installation script supports the following optional environment variables:
VERSION=x.y.z
(defaults to the latest version)
PREFIX=/path/to/install
(defaults to
/usr/local/bin
)
For example, the following will install the binary into the working directory:
curl https://raw.githubusercontent.com/stepchowfun/mull/main/install.sh -LSfs | PREFIX=. sh
Note that if you change the installation path, you may also need to change the
mull.executablePath
accordingly in Visual Studio Code or Cursor.
If you prefer not to use this installation method, you can download the binary from the
latest release
, make it executable (e.g., with
chmod
), and place it in some directory in your
PATH
(e.g.,
/usr/local/bin
). You can then follow the instructions
below
to install the Visual Studio Code / Cursor extension.
Installing the binary on Windows (AArch64 or x86-64)
If you're running Windows (AArch64 or x86-64), download the binary from the
latest release
and rename it to
mull
(or
mull.exe
if you have file extensions visible). Create a directory called
Mull
in your
%PROGRAMFILES%
directory (e.g.,
C:\Program Files\Mull
), and place the renamed binary in there. Then, in the "Advanced" tab of the "System Properties" section of Control Panel, click on "Environment Variables..." and add the full path to the new
Mull
directory to the
PATH
variable under "System variables". Note that the
Program Files
directory might have a different name if Windows is configured for a language other than English.
To update an existing installation, simply replace the existing binary.
Installing the binary with Cargo
If you have
Cargo
, you can install Mull as follows:
You can run that command with
--force
to update an existing installation.
Installing the Visual Studio Code / Cursor extension
To install the Mull extension, download the
mull.vsix
file from the
latest release
and install it via the "Install from VSIX..." option in the
...
menu at the top of the Extensions view of the Primary Side Bar.
Note that the macOS / Linux installation command will install the extension automatically, so you can skip this section if you use that installation method.
To update an existing installation, simply re-install it.
I love software rendering. The best DOS experience I’ve had in a long while was Quake in its software renderer at 800×600, running at a locked 60fps on
my Dell OptiPlex 380
. It’s one of the best-looking things I’ve seen a DOS game do.
That’s not how most people remember those games looking. In the 90s you either ran them in software at a low resolution, or you bought a 3D card and played the accelerated version. Today there’s a third option: run the software renderer on a machine fast enough to push it at resolutions nobody could use back then.
What software rendering is
In a software-rendered game, the CPU draws every pixel. There’s no 3D card involved: the game works out each frame in its own code and writes it straight to video memory. Doom, Duke Nukem 3D, Blood and the original Quake all work this way.
When 3D cards arrived, many games got accelerated versions. GLQuake came after Quake, and Blood and Tomb Raider got 3dfx modes. Those versions hand the drawing to the graphics card, and they look different.
Why I like the look
It’s sharp.
Software renderers generally sample textures pixel by pixel, so every texel stays a crisp square. Early 3D cards smoothed textures with bilinear filtering, which looked impressive in 1997 but turns everything soft and blurry to my eye now.
It’s gritty.
Most of these games ran in 256 colours, with lighting done through lookup tables into that palette. Shadows fall off in visible steps rather than smooth gradients. Technically that’s colour banding, a limitation. In practice it gives the games a rough, grimy texture that I really like, and that hardware rendering smooths away.
It’s how the games were built.
Quake was released with its software renderer, and GLQuake followed. Doom and the Build engine games were designed around their software renderers from the start.
It isn’t always the better option. When I got
a Voodoo 2 running in a modern PC
, Blood ran fast in its 3dfx mode, but the VESA software modes were the better-looking option. Tomb Raider went the other way: its underwater sections look noticeably better
accelerated
than in the DOS software renderer. So it’s a preference, not a rule. But for most of the games I care about, I’d pick the software renderer.
It’s not just nostalgia, either. Ion Fury, a Build engine game from 2019, still ships with a software renderer.
The catch: it needs a fast PC
Software rendering scales with the CPU. Every extra pixel is work for the processor, so the high VESA resolutions that many late DOS games offered were well beyond the hardware of the day.
Modern hardware can power through most of it. On the OptiPlex 380, Quake at 800×600 holds a locked 60fps. But the heaviest games still push even very fast machines. In
his video on the Portwell RUBY-9719
, Rasteri shows Build engine games needing far more power at high resolutions, to the point where even a 3.3GHz quad-core Xeon “isn’t quite enough to run Shadow Warrior at full 1600 by 1200”.
So if you want to see these games at their best, you want the fastest machine you can get that still runs them.
Why it needs native DOS
There are other ways to get software rendering on a modern PC. Source ports of Doom and Quake run software renderers on Windows, and Ion Fury runs on Windows natively. They’re great.
What I’m after is the original DOS versions running as they were released, on real hardware. DOSBox is the obvious alternative, but some DOS titles struggle in DOSBox, while on real hardware they behave exactly as intended.
That leaves one more problem: sound. A fast machine running native DOS needs a sound card the games can talk to, and modern PCs don’t have one. That’s a story of its own.
Games worth trying
Quake
, in software at 800×600 or higher
Duke Nukem 3D
and
Blood
, the Build engine games, at high VESA resolutions
"Against Tech Oligarchy": Inside the Worker Resistance in the World's Most Powerful Industry
Democracy Now!
www.democracynow.org
2026-10-16 08:44:40
Longtime tech worker organizers Clarissa Redwine and JS Tan’s new book, Against Tech Oligarchy: Worker Resistance in the World’s Most Powerful Industry, draws on the authors’ experiences at major tech companies to chronicle the rise and fall of the tech worker movement, its early v...
Longtime tech worker organizers Clarissa Redwine and JS Tan’s new book,
Against Tech Oligarchy: Worker Resistance in the World’s Most Powerful Industry
, draws on the authors’ experiences at major tech companies to chronicle the rise and fall of the tech worker movement, its early victories, and the repression and slide to corporate control that followed.
“Over the course of the 2010s, what we saw was that the tech industry wasn’t quite the industry that it had promised to its workers and to the public. Rather than making the world more open, more democratic, we saw it really be the culprit of misinformation,” says Tan, who was pushed out of Microsoft after raising objections to the company’s ties to fossil fuel companies.
Silicon Valley’s slide to the right was influenced by corporate backlash to labor’s demands, explains Redwine, who was fired from Kickstarter for union organizing. She says she hopes to inspire a new generation of tech workers to organize “within these tech oligarchs’ own empires, to stand up and push back.”
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
Lessons learned building Fronteira, an MCP proxy with behavioral guardrails
Following feedback from Lisbon.ai (thanks,
Nuno
,
Fred
,
Sérgio
and
David
), I started building Fronteira to make these technical ideas accessible to a wider audience.
What is Fronteira?
Fronteira
is an MCP proxy that acts as a behavioral firewall. You log in through the browser and add integrations with GitHub, Gmail and other services through their MCP servers. You authenticate your harnesses with Fronteira and automatically get access to all your configured MCP servers. You also get portability across harnesses, but that is just a side effect.
The main advantage of Fronteira is that all MCP interactions go through it, allowing it to track behavior across multiple MCP servers. You get tool-call logging for your harness for free—or, in an enterprise setting, for all your users. I have to admit that this was extremely useful when debugging Fronteira itself, as well as some custom MCP servers.
Because all the data is centralized, we can track where information flows. In particular, this allows Fronteira to stop attacks involving the
lethal trifecta
. Such an attack can occur when a prompt injection causes an agent to read private data through one tool and expose it to an external endpoint through another. Requiring all interactions to pass through MCP servers is a clear limitation, which I will address later.
Because there are countless MCP providers and possible combinations, each with its own schema, it is impossible for me to write a set of rules that prevents harmful actions for everyone. Instead, Fronteira allows you to write your rules in English and translates them into
Guard DSL
, a language evaluated deterministically on every interaction.
Users are not expected to write Guard DSL themselves. Instead, they write rules in natural language and can check that the resulting code matches their expectations. The language's usability could be improved, but it is sufficient for the prototypes I have built.
While the rule language is evaluated deterministically, it can invoke nondeterministic components that use decision models—currently JEV—to determine whether content contains trade secrets or medical information. There is also session-level tracking, such as
read_private
in the example. So far, I have not found anything I could not express, but I am sure that will happen as soon as someone else starts using it.
Limitations and Technical Lessons Learned
The first limitation is clear: top-level harnesses access the filesystem directly, browse the internet directly, control desktop apps and access APIs directly, usually through skills or other instructions. All these interactions bypass Fronteira, making it useless for day-to-day security in your harness.
Second, harnesses come with skills that assume the user is using the harness's official Gmail integration—for example, Codex's integration. If Gmail is only available through Fronteira's MCP endpoint, Codex will sometimes fail to find it out of the box. Deploying Fronteira in the wild would therefore require us to write many skills to change this default behavior.
I also learned that no one respects the fact that MCP tool lists can be dynamic according to the specification. Requests for the tool list can return different results throughout a conversation, but harnesses do not implement support for this. They load the tool list at the beginning and do not reload it unless explicitly asked. I understand the challenge: reloading it before every response would increase the load on MCP servers and add latency. I would like a flag in the response that forces clients to refresh the list.
On the other hand, I do not want Fronteira to expose a million tools at all times. I would like it to receive the prompt, or some related information, and dynamically select the relevant tools. Tools forbidden by the rules could then be excluded from the context, rather than occupying space when any attempt to call them would result in an error.
The final technical lesson I learned is that I was too optimistic about trusting Codex with DevOps. I asked it to mirror another app's Django configuration for Fronteira, but it changed the server root, exposing my Resend token and allowing spammers to send spam through my account. The issue was easy to identify and fix, but I expected more from Codex. I also realized that I still do not have a security tool I can point at a deployment, rather than its source code!
Alternatives to Fronteira
I did not look at competitors before implementing Fronteira. This was not because of laziness or incompetence. It was simply not a priority: I wanted to build it regardless, to understand the challenges firsthand.
Behavioral Rules
I was aware of
Dogwood
, Amazon's temporal specification extension to the Cedar specification (mainly used for AWS access permissions).
Dogwood can require previous explicit approval for some actions. Approval is something I wanted to add to Fronteira from the start through a mobile app. The following temporal rule in Cedar permits a share sale only if the same stock and number of shares were approved within the past hour.
To address some of the same limitations as Fronteira, Amazon uses the Dogwood engine in the Strands SDK. By combining the policy engine with a sandbox, they prevent agents from circumventing the "firewall." This is still not foolproof: agents can use a remote browser MCP server to call APIs, avoiding detection.
The
Invariant SDK
features
dataflow guardrails
. Invariant, which was acquired by Snyk, and
Cordon
offer MCP proxies like Fronteira. They share the same limitations, but I would like to highlight language features such as quantifiers and loop detection.
MCP Proxies with Static Rules
Mintive
, previously MintMCP, is very similar to Fronteira, except that it does not support behavioral rules. You can still detect private information leaking through static rules, but you cannot prevent malicious sequences of individually harmless calls.
Both the
Lasso Security MCP Gateway
and
WitnessAI
are very similar to Mintive: they automatically manage MCP servers and can detect leaks of information identified as private.
MCP Firewall
performs a similar role but also focuses on filtering MCP responses, treating their contents as untrusted because they may contaminate subsequent reasoning.
NVIDIA NeMo
is another proxy that validates tool parameters and responses against a range of requirements. However, it does not relate different tool calls to one another except through custom code.
Endram
is a proxy that decides whether each call requires manual approval, something Dogwood also supports alongside more complex features.
Agent Control
allows you to create guardrails in Python. These operate at the level of individual tool calls, but Agent Control also integrates with external guardrail infrastructure, such as Dogwood, whose language is more expressive.
Language Specification
AgentSpec
is a specification language like Fronteira's, with a more principled design but similar features. I would like to study properties of the language, particularly ways to provide feedback when users write inconsistent rules.
Others
IBM offers
MCP ContextForge
, a central gateway focused more on discoverability and observability.
agentgateway
is also mostly focused on observability.
TrueFoundry
focuses on the M×N problem—M harnesses connecting to N MCP servers—and observability.
LlamaFirewall
is similar in that it can inspect traces of calls and detect malicious patterns. However, it does so using a BERT-style LLM, whereas Fronteira primarily supports deterministic analysis.
After this exercise, I no longer believe in MCP proxies as security boundaries for agents. MCP covers only part of an agent's interaction with the world. Another reason is that MCP is a leaky abstraction. Models are post-trained in specific MCP and skill contexts, so they will always prefer direct alternatives, creating friction for the user.
However, I strongly believe in the need for logic-based policies to control agents. Those policies should be enforced at the agent boundary and should probably be developed alongside the harnesses and models. I would love this enforcement to be harness-independent and provided by a third party. However, given
how models are becoming increasingly harness-specific
, I do not see that working in the long term.
If you have read this far, I am looking for a new opportunity where I can apply my research experience in programming languages, systems and different areas of artificial intelligence to improve the safety of agentic systems. If you are looking for someone with that background, along with the agency and pace of someone who has worked at several startups, you can find my contact details on this website.
Meet Estrella, an Undocumented Trans Woman Jailed for 9 Years, Then Deported to Mexico
Democracy Now!
www.democracynow.org
2026-10-16 08:24:14
We’re joined by Latino USA host Maria Hinojosa as she shares the story of Estrella Diamantina González, an undocumented transgender woman and trafficking survivor from Mexico caught up in the United States’ criminal and immigration systems. This summer, after serving a nine-year sentence...
We’re joined by
Latino
USA
host Maria Hinojosa as she shares the story of Estrella Diamantina González, an undocumented transgender woman and trafficking survivor from Mexico caught up in the United States’ criminal and immigration systems. This summer, after serving a nine-year sentence in a Texas men’s prison, Diamantina González was released, but she wasn’t free. She was immediately transferred to an immigration detention facility and then deported. Hinojosa, who has been reporting on Diamantina González’s ordeal for the last decade, followed her to Mexico in the new audio documentary “Estrella: Bittersweet Freedom for a 'Bad Mexican.'”
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
The other day I was thinking about the first communities I found online and, perhaps tangentially, to what degree they influenced the amount of therapy I now require to function normally as an adult. Our family's second computer came from Sam's Club. It was a 386DX with Windows 3.0 but my inner nerd would have nothing to do with cheerful bit-mapped color schemes, preferring instead to exit to MS-DOS and do all necessary computing and gaming from a command prompt and text-based GUIs. Hardware-wise, it looked and felt cheap. The machine was less reliable than the cardboard box it came in. It was a Packard Bell and if you were to read this paragraph to anyone who was into computers in the 1990's, they will hear that name and then simply close their eyes and nod quietly in sympathetic understanding.
(Nostalgic Modem Noises)
Most importantly, it came with a dial-up modem. My mom's series of reactions when I told her I had plugged our new computer into the telephone line were as follows:
"Huh, you can do that?"
"But why would you do that?"
"WHAT HAVE YOU DONE AND HOW MUCH DO WE OWE?!"
Now in my defense, as a semi-rebellious teenager eager to experience literally anything outside languid rural Midwest life, I often leaned hard into the practice of begging forgiveness in lieu of asking permission. Sometimes I even got away with it.
To give a better idea of the timeline and circumstances, the Internet as we know today it only
kind of
existed in the early 90's. There was email, there were message boards, file exchange programs, remote login to other systems, real-time chat (IRC) and so on. The web was new and promising and free of ads but not at all the main attraction just yet. And unless you lived in a city or attended a university with a well-funded technology department, the Internet was probably not yet accessible to you. Or for the purposes of this article, me.
But bulletin board systems (BBSes) had been around since at least the early 80's. Maybe earlier, I'm not sure. These were computers connected to phone lines. When you called a number with your computer, the other computer answered, and you could interact with whatever software the sysop (system operator) had set up. Usually these contained at least public and private message boards, but many also had places where you could download and upload files, chat in real time with others (if the BBS had multiple lines), or play games.
How I came upon the early essentials necessary to connect
our
computer to
other computers
is a complete mystery to me at this point. I didn't know anyone else with a modem and my school's computer situation was about a decade behind: "computer" classes were really typing classes taught
by a cartoon cat named PAWS
on Apple IIs. Back at home, at a bare minimum, I would have needed a terminal program to dial up and interact with another computer. So did I have one already or did I grab one off a shareware floppy that came in some magazine? Where did I even find the number of the first BBS (bulletin-board system) to call?
What happened next is easier to remember. I racked up quite the collection of informative text files from that first handful of BBSes I found, which generally included programming guides, hacking e-zines (
Phrack!
), some anarchy-type content, and rather entertaining but unhinged conspiracy theories. And of course, where to find more BBSes. I also clearly remember downloading as much software as I could get my hands on. Plenty of development tools, different modem terminal programs, and scads of DOS utilities. I learned a
lot
in a very short amount of time about BBS software, doors, Kermit, X/Y/Zmodem and ZIP files. It took about two hours to download enough data to fill up a 1.44MB floppy disk over a 2400 baud modem. (Eventually I managed to con my mom into buying a 14.4kbps modem a little bit later. I still have no idea how. Maybe because we had a free trial of Prodigy and that needed a faster modem to draw all the fancy vector graphics?)
But that all came to a swift end when my mom got the phone bill at the end of the month. In those days, local calls were free, long distance calls cost money. You paid by the minute and it was not especially cheap. The problem was, we lived in a town so small you could just about trip over it on your way to somewhere interesting, so everything outside a 1.5-mile radius was long distance. I never heard what the monetary damage was, but she
did
state in no uncertain terms that it would
not
be allowed to happen again.
1-800-YOU-NERD
(Don't actually call this, I don't know where it goes.)
One of the files I happened to grab was a list of toll-free BBSes. Or as we'd say back before
more toll-free codes were added
, "1-800 numbers." I didn't know exactly what I would find at these numbers, but that was a big part of the appeal. The first list I downloaded was
TB01-94.TXT
by Doug Schneider. Here are some others that I have in my collection from around that time frame:
ECBALAM.TXT
- "1-800- BBS'S ACROSS THE US" by Bryan Balam - Date Unknown
BBSWORK3.TXT
- "BBS's That Actually Work!" by Kevin Ardoin - August 1994
BBSWOR41.TXT
- "BBS's That Actually Work!" by Kevin Ardoin - December 1994
TRANSBBS.TXT
- "TRANSPORTATION-RELATED ELECTRONIC BULLETIN BOARD SYSTEMS (BBS)"
I have a very clear memory of trying numbers in some semi-random order, crossing off the ones that never answered and highlighting interesting ones to come back to later. I wrote notes next to some. The crossed-off lines outnumbered the highlighted lines 10-to-1 at least. If I ran into a busy signal, it would sometimes be quite a while before I came back to it. It turned out that these toll-free computer systems came and went faster than people could update and pass around the text files. The vast majority of the numbers I called responded with any of:
Endless ringing
Busy signal
"
DOO-BE-DEEP
The number you have dialed is not in service. Please try your call again later."
Fax machine sounds (similar to, but audibly different from modem sounds!)
Someone picking up and answering, "Hello?"
When a modem answered, there was still a fair chance that it wasn't anything useful to me. Many did not automatically detect your modem speed, so good ol' "2400 8-N-1" was not always a given and the listings were not always super accurate or up to date. Lots of these toll-free numbers required a pre-arranged login to get anywhere fun. I couldn't even tell what many of them were. Either just a prompt that didn't respond to anything sensible like
help
or
dir
, or acronyms/names that I couldn't decipher. (I wish I had kept logs of my terminal sessions, figuring them out would be a lot easier now!) A few numbers would let you register an account, but the content inside tended to be extremely boring to a teenager without disposable income. Very little about computers, music, video games, or chatting with other random people.
That is, until I found BARK.
Ephemeral Surrealism
It turns out BARK was a toll-free electronic message board where teenagers were encouraged to hop on and gab about teenage things. It was a little hard to believe that something like this existed among the sea of non-profit and government-related toll-free BBSes. To the point that when I woke up the next morning, I was beyond 100% positive it was just another one of those crazy dreams you have where you accidentally luck into something amazing that changes your life forever, only to then wake up to the cold gray reality of your previous existence. But I sat down at the computer again later in the day to resume my computing activities and found that this time my own brain was not actively trying to crush my hopes and dreams. For a change.
Unfortunately I kept little evidence of my time on BARK so most of this is from memory, corroborated by the remarkably few sources I could find on the modern web. These are some things that I do remember. Some with a high degree of resolute certainty and some not.
When you signed up, you had to answer a few basic questions such as how old are you, what kind of music you listened to, what was your favorite TV show, etc. Afterward, BARK would "verify" you by calling you back on the number you provided. I had to quickly figure out how to configure my computer to answer the call
and
make sure nobody else in the house answered the phone before the modem did. And come up with a good explanation for my mom as to why
she
shouldn't answer the phone, which was by far the bigger of the two concerns.
A lot of the users had signatures with funny sayings (
taglines
) in them. Writing and collecting funny taglines became something of a brief sub-hobby for me at one point.
I feel like BARK
only
had message boards. Maybe a file section. I don't
remember
there being any games to play, real-time chat, or anything other typical bonus features of BBSes at the time.
I think I found BARK while it was popular, but it got more popular soon after. Eventually, it got to a point where it would take hours of re-dialing until I connected (
if
I connected) and even then, there was a time limit before they booted you off to free up the line for someone else. This wasn't nearly enough time to catch up on popular boards and compose replies, so you were more or less forced to use
QWK
. When you connected, you could download a file containing all of the new messages that were posted since you last logged in. You would then disconnect, read the messages offline, maybe write some replies, and then upload those replies the next time you logged in.
The admins did their best to keep behaviour in line with the rules, but there was just entirely too many messages to proactively police. I encountered flame wars for the first time. Bans and deleted threads were very common. I tended to avoid the busiest boards (and their weird drama) and mostly stuck to ones related to computers and video games.
At some point, the admins posted an announcement that funding for BARK was being withdrawn and the BBS would shut down soon. A lot of us were understandably very upset by this. This was actually the first time I learned that BARK was run by PolyGram, the record company.
For a few months after BARK closed, I kept in touch with a couple other BARK users and we would snail-mail each other floppy disks back and forth to share games, fonts, misc software, wallpapers, and whatnot.
Threadbare History
While trying to piece together BARK's history, it became apparent that there is very,
very
little information about its existence left on the modern web. Pretty much just a few Reddit threads and very brief mentions of it from
Parker Reilly
, the guy who created and managed it. The Internet archive has a well-OCR'd
collection of Boardwatch Magazine
that doesn't have anything about it. Even the fact that there
were
even toll-free BBSes at all seems to have been largely forgotten. But here's what I've able to piece together.
The BARK BBS was conceived as a market research tool by the record company PolyGram. Someone with the authority to spend money at Polygram theorized that the current generation of teenagers with access to computers likely also had disposable income to spend on music. Instead of placing random bets on which invidual artists or genres would be popular, why not ask the kids themselves? Or better yet, set up some place where they can gather and discuss their musical tastes with each other and chat about upcoming indie bands. Then simply read what they said to discover the hot new trends in pop culture and music. Or at least that was the idea.
Oh, and since long-distance calls were fairly expensive, why not give it a toll-free number?
This Reddit post
is a fairly personal first-hand account from Max, the guy who was the BARK sysop for a good percentage of the time it was online. It's well worth reading the whole thing but here are a couple highlights:
Bark BBS was some executive’s idea at Polygram Records for which we ultimately worked. Of course, I knew Polygram as they were publishers of many of my favorite rock artists. But what was the idea behind Bark? Parker explained that Polygram wanted to do marketing research through Bark and find out what young kids of high-school age wanted to listen to and what kind of music they were going to buy, so that Polygram could produce such artists and sell the records. At the moment the strategy was not very well defined and Parker was the chief editor with the job of running Bark and another guy was joining soon to be the marketing director.
Max continues:
So what did I do initially? We had an 800 dial-in number and four modem lines anyone could dial into. Parker had previously created relationships with many high schools across the country and in each school there was supposed to be a “representative” who would communicate with other representatives from different schools about pop culture, music etc. and then relay everything to his fellow students at the school. It was going to be a beautiful community of children all across USA and Polygram would know what their tastes in music are before other labels discovered the artists kids wanted to buy records of. I think they also tried publishing a magazine for the school kids, but probably one one or two issues actually came out as far as I remember.
BARK initially ran 4 instances of the
PCBoard
BBS software on a single MS-DOS machine (one instance per line) but was upgraded over time until eventually they were running an unspecified Mac with a "fault-tolerant" (possibly RAID-1) 2GB drive and 56k modems. From what I can tell, they got up to at least 16 phone lines, maybe more. Max goes on to describe how the board eventually devolved into barely-contained chaos until PolyGram finally realized they weren't getting the insight they had hoped for after approximately two years and pulled funding.
Aside from the BBS listings, all that I managed to keep from that time period were two two printouts of BARK messages that I downloaded at some point. Most likely, I printed these either to keep myself amused in a boring junior-high class, or to share them with a friend of mine who had similar taste in video games. Possibly both.
Random Acts of QWK
One of the few references to BARK you can find today is
this Reedit post
from a guy who claimed to have some QWK messages from BARK and was looking for help reading them. His post was a decade hence, but I messaged him on a whim and by some miracle of the Internet, he replied instantly and graciously gave me a copy to peruse. This filled in a lot of the gaps in my memory and I am eternally grateful!
BARK bulletin boards were called "Areas" and there were quite a few. If I had to guess, I would say there were probably Areas for fashion/clothing, skateboarding, TV shows, movies, and whatever else a record company exec would assume teens were into at the time. The Main Board was much more active than any other Area.
To read QWK files, you need a program they called an "offline mail reader." There were many of these but
Blue Wave
was one of the most popular and is
proper
old-school shareware. I remember using it, but I may have switched to something else later.
Page 27 of Boardwatch from December 1992
mentions it in a list of offline mail readers. There were versions for MS-DOS on 8086/8088, for the 80386 (higher memory), and OS/2.
To get it going, I fired up a copy of
DOSBox-X
and went through the process of installing Blue Wave, pointing it at PKZIP version 2.04g, and copied the QWK messages into the
DOWN
directory. Here's what you're greeted with when you fire it up:
After 10 seconds of being forced to read the nag screen, it beeps and drops you at the main menu (the inverted block at the top of the screen is my mouse cursor):
From here, we select which QWK file ("mail packet") to open:
Once you open a packet, you're at the Packet Menu:
And then you're at the Area selection screen:
The QWK packet was assembled for you by the BBS software on-the-fly, so it knows who you are and thus can tell which messages were addressed to you. These are marked as "personal" messages by the mail reader. I don't remember if BARK supported non-public messages at all, but in this case, all messages are public even when addressed to another user. So "personal" in this case just means "public messages addressed to you. There's really nothing else special about them.
Blue Wave has all kinds of options for viewing and managing messages. You can mark a message for deletion and the "kill" it (delete it) later, mark it read, sort the messages any way you want, etc. I never got too fancy with any of the reader options, I'm sure I just read through whatever was new, replied to a few, and then just deleted the old QWK files when done with them.
Fun fact: Blue Wave has a "Boss Mode." If you press Alt+B, it blanks the screen and shows a
C:\>
prompt. This is of course hilariously useless because you can't even
type
anything into this screen. And Alt+D swaps you out to a
real
DOS prompt anyway...
Once you selected the Area to read, you were (finally) presented with a message list. Most BARK users used their real names so to avoid doxxing anyone, I've removed all last names from the following screenshot (except for Cheese Girl, I guess she gets to fend for herself):
The first column is the message ID, I don't know if they wrapped around or what. You could sort on any of these fields, but unsorted (presumably the order in which they appear in the QWK file) was the default. For some reason, sorting by message ID or date isn't an option. I notice that subjects are typically grouped together but other than that, I can't tell how the messages ended up in the order they did. Maybe some quirk of the BBS software.
Finally, reading the message. The QWK files I was given contained messages from the last few days of BARK, including a sign-off from the Sysop, Max. (I removed his address and shifted the last few lines up to fit it all in one screen.)
If you wanted to reply to a message, you were dropped into a basic text editor that came with Blue Wave called TED3.EXE, but you could tell it to use any editor you wanted.
Some people might ask why I'm not putting these last-known BARK messages online. Believe me, I'd like to, but there are several things holding me back:
They're not actually mine to share, they belong to someone else. His (likely real) name and messages are in them. It would be like putting someone else's email folders online.
There are thousands of messages here, almost all have some personal information, and I don't have the time or desire to sanitize all of them. And I definitely don't trust AI to do an adequate job. Lots of people put their phone numbers and addresses in their signatures, even more so when they found out that BARK was shutting down, in the hopes of staying in touch with friends they met there.
Most of the messages are just not very interesting! More than half the messages are reactions, rants, flames, and unfortunately more than a few homophobic insults.
But here are a few of the more interesting signatures I ran across while reading some of the old messages:
All Good Things...
(Yeah, that's a TNG reference. Deal with it.)
BARK was fun while it lasted, and I tried to make the best of the other toll-free BBSes that were still around. But none of them had the vibrant community of BARK. As stated earlier, most toll-free BBSes were set up for very specific purposes and didn't tolerate a bunch of teenagers calling in and engaging in what might be very charitably called digital loitering. In fact, a good many of them locked their doors to new users due to the sheer number of BARK refugees trying to find a new toll-free home. I resurrected my 800-number dialing quest and kept at it for months, but never did find anything even in the same league until our household finally had real dial-up Internet access a couple years later.
I spent what was then widely considered an embarrassing amount of time on the Internet in the late 90's but never ended up hearing much about BARK at all. People would (and still do) reminisce about their pre-Internet BBS days, but BARK appears to have been almost entirely forgotten. That's what drove me to write this: I think it deserves to be remembered as the odd and improbable little oasis it was. There is precious little to remember it by, but I still consider BARK to be the first real online community I was a part of. So this is me, doing my best to make sure it doesn't fade into complete and total obscurity. If any other BARKers come across this, do feel free to contact me and I'd be happy to add your memories and contributions to this page.
Miscellany
Everything in this section consists of random thoughts and footnotes that didn't fit well into the sections above. If you feel like you got the story you wanted, please feel free to close this tab guilt-free.
BARK is not an acronym and doesn't seem to actually mean anything apart from being a snazzy name dreamed up by someone in Polygram marketing who thought it would resonate with the younguns of the day.
Here's the trademark filing.
The guy who managed (and for some time, probably ran) BARK was Parker Reilly. He's apparently had an interesting career around music and media, most of which I learned from
his bio on Solfege.tv
. His band "The Sons" had one of their songs in the movie
Dumb and Dumber
. Which seems
extremely
appropriate as I was a huge Jim Carrey fan at the time. According to his LinkedIn page, he's had a number of other music/media-adjacent projects and companies since BARK.
You can read about the history and conclusion of
PolyGram on Wikipedia
but what's
really
interesting is that
the PolyGram US web site
is still online and is quite the delightful (if somewhat broken) 1990's web time capsule. Although maybe "time capsule" is too harsh, someone (maybe an LLM) has been adding what seem to be SEO-optimized, verbose but content-free articles like
Best Concerts of 2025: Overview
with the site's original CSS.
If you want to go deeper into finding more BBS lists (including toll-free ones), you might have luck digging through various popular FTP/HTTP mirror sites of the time on archive.org from the mid 90's, or trolling through postings on
alt.bbs.lists
Usenet archives from that period as well.
Other than the toll-free BBS lists, I didn't keep much digital data from that frame because I was not a data hoarder and durable physical media was not cheap. However, among the few scraps of paper I managed to keep, I found out:
In 1996, one of the toll-free BBSes must have offered free email accounts with an
@access.gov
address, because I have a printout of some messages sent back to me by an FTP-by-email gateway at
[email protected]
(and/or
[email protected]
?). So that would be first real Internet email address I had. The domain does not appear to exist anymore.
I also have a printout of a tutorial about how to find and download files entirely over email. It's called "SNARFING FILES BY MAIL" and describes how to search for and download files from the Internet, which was almost certainly what I was attempting to do with my fancy @access.gov email address. Unfortunately, the header of the file was mangled by accidental over-printing, so I can't quite make out the author.
I do remember somewhere in this time frame being able to access limited parts of the Internet through these toll-free BBSes. I'm sure I was able to access Gopher and at least one early text-based World Wide Web browser which was almost certainly
Line Mode Browser
.
If this kind of thing interests you, do be sure to check out Jason Scott's
BBS Textfiles
which includes all kinds of text files found on BBSes from the 80s and 90s. Including about a dozen other toll-free BBS listings. And you may even want to check out Jason's movie,
BBS: The Documentary
.
Other fun BBS-related links that I ran across while researching this:
https://nfbnet.org/download/
- This site is kind of broken, but if you mess with the domain while browsing around, there is quite a lot of MS-DOS and BBS-related software that you would have found on BBSes back in the day.
https://wmcbrine.com/MultiMail/
- A "modern" QWK (and other offline mail) reader, which looks to have been significantly inspired by Blue Wave. No Linux packages provided, but it's packaged for Debian Trixie for some reason!
Qualcomm Legally Proves Arm Breached Its License, Wins $2
A Delaware jury has found that Arm breached its Architecture License Agreement (ALA) with Qualcomm, but the award is about as small as it gets.
Reuters reports
that Qualcomm gets just $2 in nominal damages, $1 for each of the two claims it won. The jury agreed that Arm withheld software patches and verification tools Qualcomm needed to validate its custom Oryon CPU cores, and that Arm intentionally interfered with Qualcomm's business with Meta. That second claim ties back to October 2024, when
Arm's 60-day notice to cancel Qualcomm's license
ended up with Bloomberg, a leak Qualcomm pinned on Arm. Arm won the rest of the claims, most of which were about pricing under its separate Technology License Agreement (TLA).
The bigger question, however, is still open. Judge Maryellen Noreika has yet to decide whether Arm's breach lets Qualcomm stop paying royalties under the ALA for five years, which, by some estimates, could be worth billions of dollars. Arm argues that provision is an unenforceable penalty. Unsurprisingly, both sides are spinning the result in their favor, with Qualcomm saying it was "gratified" by the verdict and Arm pointing out that it won most of the claims. This is the second round between the two companies. In December 2024, a jury found that
Qualcomm didn't breach its license
by acquiring Nuvia, and the court entered a
final judgment in Qualcomm's favor
in September 2025. Arm has since appealed that ruling, and it's reasonable to expect an appeal here too, depending on how the royalty question goes.
"Abolish & Replace ICE": Rep. Analilia Mejia Blasts ICE for Secretly Using NJ Warehouse
Democracy Now!
www.democracynow.org
2026-10-16 08:13:01
Earlier this week, ICE confirmed it had secretly used a federal government warehouse in Roxbury, New Jersey, to stage and to process detentions in September, despite an order from a judge barring the site’s use until an environmental study was complete. ”ICE and this administration cherr...
Earlier this week,
ICE
confirmed it had secretly used a federal government warehouse in Roxbury, New Jersey, to stage and to process detentions in September, despite an order from a judge barring the site’s use until an environmental study was complete. ”
ICE
and this administration cherry-picks which laws it adheres to, and then breaks due process and equal protection for the many,” says New Jersey Democratic Congressmember Analilia Mejia. “This administration is just moving with a level of impunity and cruelty that, frankly, should shock every single American.”
Guests
Please check back later for full transcript.
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
It is done. After four years of work and various pivots we have released iroh 1.0.
We have an expanding web site describing
how
iroh works under the hood, but we think it is important to also understand
why
we made the decisions that led to the current iroh. So here is a trip down memory lane / our commit history which highlights major turning points and design decisions.
Perhaps more importantly, this post also covers some things we considered but ended up
not doing
.
Iroh started as a rust implementation of
ipfs
. We got pretty far implementing various ipfs protocols and had interop with existing ipfs implementations working. Our goal with iroh was to target lightweight and resource constrained devices such as mobile phones.
One area where we were unhappy with existing protocols was blob transfer. We started a working group within the ipfs community to come up with a new protocol, called the
move the bytes working group
.
For that working group, we worked on a proposal for new blob transfer protocol. We wrote a small library called
krakensync
. Krakensync used
BLAKE3
exclusively for content addressing because BLAKE3 supports verified incremental streaming of large blobs.
After a few days we had a bare algorithm, and wanted to add networking to it to make the demo feel more real. We had only two days before the next meeting, and adding networking via
rust-libp2p
seemed impossible (Remember that this was before LLM coding assistants!).
I had a tiny bit of previous experience with
QUIC
, and remembered from a project of a friend of mine,
quinn-noise
that
quinn
is both hackable and has a simple idiomatic rust API. So I tried to add networking via quinn and found it
an absolute joy
to work with.
—
Rüdiger
In parallel to working on the ipfs compatible iroh, we worked on a side project to implement a single narrow real world use case: transfer of
deltachat
chat history when provisioning a new device. The technical task was to transfer a single large blob of backup data to a new device. There were hard constraints regarding disk and network usage. And the transfer had to be resumable.
We found that
we could not
implement this very narrow use case with our ipfs based iroh implementation. Doing so would have had less than optimal network performance, and would have pulled in a very large dependency tree.
So we started writing a lightweight sync library from scratch, using QUIC as the networking layer and BLAKE3 verified streaming for large blob transfer.
Despite our best efforts, our main project was still far away from the theoretical limits. Meanwhile our sync side project showed what is possible. So we
made the decision
to no longer pursue the goal of staying compatible with existing ipfs implementations.
Instead of
multiaddrs
, endpoints were identified by an
Ed25519
public key.
Instead of
multihashes
, we had BLAKE3.
And instead of multiple transport protocols we had just QUIC.
The new iroh was just QUIC based networking using
quinn
and blob transfer using BLAKE3 verified streaming. Compared to the previous version, the functionality was anemic. But the single thing it did, it did with close to optimal performance. It was a lightweight enough dependency that
deltachat could justify including it into their rust code base
. And suddenly we had both networking and sync deployed in a real app used by thousands of people across various platforms (windows, linux, iOS, android). The old code lives on in
beetle
.
We decided to use just QUIC. But QUIC as specified in RFC 9000 has clear client and server roles, where the server is identified by a certificate chain. At the time we had to add a somewhat Rube Goldberg construction on top to make QUIC work for peer-to-peer connections,
a self-signed certificate carrying the real public key in a custom X.509 extension
, with a signature binding the two.
Also, rustls is a heavy dependency, and its default crypto provider is a C dependency. So there was a temptation to replace the entire TLS encryption scheme with a protocol based on
noise
that is made for peer-to-peer connections from the start.
We ended up sticking with TLS as the industry standard. Without using TLS iroh would not really be QUIC, just reuse some of its parts. But we were still unhappy about the self-signed cert.
One thing we were not yet happy with: for the deltachat chat history transfer to work, both devices had to be in the same network. Ideally this should work in all cases where the two devices are
somehow
connected to the internet. We also wanted these transfers to be
fast
. So what we needed was
hole punching
. We looked at various systems that implement hole punching. Our goal was to get holepunching to work reliably, even at the expense of compromising p2p purity. If we would need a small server to help, so be it.
Of all the existing open source implementations of holepunching, we found the
tailscale
approach best suited to our requirements. So we implemented something that was initially very similar, with good results. This was a
huge effort
, but once we merged it we had hole punch rates to be proud of. In most normal circumstances we punched holes almost immediately, and in the few corporate networks where hole punching was impossible, at least we could still transfer data via relays. It
just worked
.
We achieved our goal of having a simple p2p library that just worked. But the API was still anemic. It was something that experienced rust teams such as deltachat could include, but not yet attractive to p2p application developers. So we decided to gradually add more functionality. One of the first things we did was extending the blob related API to expose more functionality for BLAKE3 verified streaming. In parallel we also optimized the verified streaming by implementing some advanced features such as
BLAKE3 chunk groups
.
But even with blobs included, it was not enough. We had very useful functionality for experienced rust teams, but at the time that wasn't exactly a large group. So we decided to add a
document abstraction
that would make iroh viable as a batteries included p2p application development framework, where ideally you would only need to add application specific code.
As part of the push to make iroh approachable to more developers, we started to publish language bindings to almost all major languages. This worked well and was frequently used, but turned out to be a lot of work for us because of the frequent API changes on the road to 1.0.
As we were adding protocols we also had to solve protocol
negotiation
.
One common pattern is to add a
little handshake protocol
on each stream where one side can propose a protocol and the other side can either accept or reject. But that would add overhead for
every single stream
and take us further away from just peer-to-peer QUIC.
We found that complex schemes for protocol evolution are often a mirage. Truly evolving a protocol in a backwards compatible way leads to a combinatorial explosion of variants that have to be tested. It is really hard to get this right.
So we decided to keep things simple and use the
ALPN TLS extension
. The connecting side proposes a list of ALPNs, and the server side either chooses one of the ALPNs or refuses the handshake. This happens directly during the QUIC handshake, so it has no overhead other than the raw bytes of the ALPN string.
All in all we are very happy with this decision. Projects like
Media over QUIC
use QUIC streams extensively in
a very creative way
, and since we provide just raw QUIC streams we can support these approaches out of the box.
It is not entirely without downsides. The
ClientHello
containing the ALPN is unencrypted, so on-path observers can see which protocol is used by decoding
ClientHello
s. One way to work around this is to use a common ALPN such as
h3
and then just negotiate the actual protocol later. In a future version of iroh we might support
encrypted client hello
.
Another consequence of the decision to use ALPNs is that two iroh endpoints talking multiple protocols will have not one but
multiple
connections open (A QUIC connection is always for
exactly one
ALPN). We share some internal state for these connections so that e.g. hole punching doesn't have to start from zero.
Sendme and dumbpipe
To show off iroh, we published two small tools:
sendme
and
dumbpipe
. These were meant to just show off different iroh capabilities, but also be useful on their own.
Dumbpipe also inspired a number of projects:
pai-sho
,
iroh-ssh
,
do-ssh
, and
iroh-ssh-android
. But more importantly it showed
how useful
just direct connections by endpoint id are a building block.
For a long time we did not have the ability to dial an iroh endpoint by endpoint id only. You needed the id of course, but you also needed an additional piece of info: either an ip address or a relay url. Sendme works like this to this day.
But the additional information is not stable. An iroh endpoint can frequently change its public IP address, e.g. when the ISP assigns a new public IP address. It can also change its home relay when it moves to another geographic region. In addition, dealing with tickets is cumbersome for large scale systems where you work with a large number of peers.
In many peer-to-peer projects the mechanism to implement such discovery is a distributed hash table. But our previous experience with DHTs was somewhat traumatic. We deciced very quickly that we did not have the resources to implement a DHT and
get adoption for it
. So just like with the relays, we compromised a bit on peer-to-peer purity. We explored various centralized options such as cloudflare workers.
But right at this time we discovered an emerging project that would allow us to have our cake and eat it too.
Pkarr
is the incredibly simple idea of storing signed DNS records on the
bittorrent mainline DHT
. We ended up using the pkarr format for our centralized address lookup service, but also giving iroh users the option to
use the mainline dht directly
to get a fully decentralized address lookup system.
Mainline has some unfortunate limitations that are unlikely to go away any time soon. So
I started writing a DHT
, using on iroh
0-rtt
connections. But as of now this is strictly an experiment that pushes the limits for iroh connections, not a production tool.
—
Rüdiger
After working on iroh as a batteries included toolkit for some time, the API surface was increasing substantially. And we could not guarantee the same level of quality for all parts of the API. In addition, we noticed that each of our users was using a different subset of the API. The one thing everybody had in common was that they needed dial by endpoint id and connections that reliably hole punch. So we
made the decision
to narrow the scope of what iroh is significantly. From now on iroh would be just direct connections dialed by endpoint id. The other functionality, that several teams depend on, was
moved into separate crates
.
We were now at the enviable position that several important projects depended on iroh. But we needed freedom to evolve iroh, and did not want to do so on a feature branch due to previous bad experiences with this approach. So we made our first long term stable release,
0.35
and started the
canary series
for people that wanted to stay on the bleeding edge on the way to 1.0.
In retrospect it would have been fine to call this iroh 1.0. It is a rock solid version of iroh that many projects depend on even today. But we are happy with the decision to develop on main and let people follow along.
In addition to various functionality changes we also spent quite some time thinking about naming. For example, the identity of an iroh endpoint used to be called
NodeId
. Back when iroh came as a large binary with several different built in protocols, this made a lot of sense. Also what is now known as address lookup used to be called just
Discovery
. But we found that discovery isn't really a good name for the process of finding relay or ip addresses for an existing endpoint id. After all you don't
discover
the endpoint id, you just look up additional data for it.
There are some address lookup providers such as mDNS that
actually
discover new endpoints. But this is not covered by the
AddressLookup trait
.
Iroh was working just fine in most cases. But there were some dark clouds on the horizon. To get one of the main features of iroh, seamless migration of the underlying transport, to work reliably, we had to do some
not so nice hacks
. In the short term this wasn't really a big problem. But we knew that the current approach would limit us substantially in the future.
So we
made the decision
to fundamentally rework how iroh works under the hood. We were already using multiple paths of course, but QUIC was unaware of all of this. Which was the root cause for various problems.
So far we had used quinn and contributed a few improvements. But now we were doing something fundamentally new: extending quinn to support multipath. For a long time we worked with the assumption that we would upstream our changes, but as the diff grew this became increasingly unlikely. So we
decided to fork quinn
and maintain our own QUIC implementation,
noq
.
Configurable key algorithms
A frequent request for iroh was to use key algorithms other than Ed25519. We ended up deciding against it. Many of our current systems such as pkarr address lookup are only ever going to work with Ed25519 keys. So while an iroh version with support for e.g. secp256k1 or P-256 would technically be straightforward, it would make iroh more complex. Our
key encoding
for the TLS handshake is already key agnostic, so we can likely add support for additional key algorithms without breaking the wire format.
Post quantum signatures
Currently standardized post quantum signature algorithms have very large public key sizes. So supporting them would require us to change from the endpoint id
being
the public key to the endpoint id being something
derived from
the public key to keep the size manageable.
Encrypted ClientHello
Encrypted ClientHello has
recently been standardized
. We might want to use it or a very similar mechanism to hide handshake metadata such as the ALPN.
In the four years we have been working on iroh we have written a lot of code, without any LLM assistance. We have thrown away almost as much code. What remains is a minimal library that heavily relies on existing standards and gives you authenticated, encrypted, direct connections to any endpoint, addressed by nothing but its public key.
The road to 1.0 was anything but straight, but certainly extremely exciting and interesting. And we are not at the end. Iroh 1.0 just means that the wire format and API are stable. But there are various extension points both in the wire format and in the API, and we continue to improve things under the hood.
Meanwhile we can't wait to see what you build on iroh.
Iroh is a dial-any-device networking library that just works. Compose from an ecosystem of ready-made protocols to get the features you need, or go fully custom on a clean abstraction over dumb pipes. Iroh is open source, and already running in production on hundreds of thousands of devices.
To get started, take a look at our
docs
, dive directly into
the code
, or chat with us in our
discord channel
.
Burger King Japan data breach exposes 11 million customer records
Bleeping Computer
www.bleepingcomputer.com
2026-10-16 08:01:29
Burger King Japan, the Japanese subsidiary of global fast-food giant Burger King, disclosed a major data breach after attackers accessed a server containing 11.18 million customer records. [...]...
Burger King Japan, the Japanese subsidiary of global fast-food giant Burger King, disclosed a major data breach after attackers accessed a server containing 11.18 million customer records.
Founded in 1953 in Florida, Burger King is now a multinational fast-food chain with nearly 20,000 locations worldwide, including 350 in Japan.
In a Thursday press release, Burger King Japan said it concluded a follow-up investigation on October 13 and apologized to customers whose data was stolen in early October and leaked online.
The breached servers stored the personal information for users of the company's official smartphone app, including their names, dates of birth, gender, email addresses, phone numbers, and order history.
"We identified a potential unauthorized third-party access to the system that manages member information for our official app and conducted an investigation,"
Burger King Japan said
.
"As a result, it was determined on Tuesday, October 13, 2026, that unauthorized access occurred between Friday, October 2, 2026, and Wednesday, October 7, 2026, resulting in a leak of member information. Upon becoming aware of the unauthorized access, we immediately blocked access from the source in question."
However, the company says the compromised server did not store customer credit card numbers and that it found no evidence that the threat actors accessed user credentials.
Burger King Japan has reported the breach to Japan's Personal Information Protection Commission (PPC) and is now also investigating how the attackers accessed the compromised server, with help from external cybersecurity experts.
"We sincerely apologize for the great inconvenience and concern this situation has caused to our customers and all others involved," it added. "At this time, no secondary damage, such as fraudulent use, resulting from this incident has been confirmed."
The fast-food chain also warned affected customers to watch for suspicious emails, SMS messages, and phone calls that may impersonate Burger King Japan, and to avoid clicking URLs, opening attachments, or entering member information or passwords.
This incident adds to a wave of cyberattacks that have impacted several major Japanese companies since the start of the year, including entertainment system maker
Daiichi Kosho
, cloud and digital infrastructure firm
IDC Frontier
, Japanese publishing giant
Nikkei
, private railway operator
Keio
, car-sharing service
Times Car
, cloud and data center service provider
Sakura Internet
, taxi operator
Nihon Kotsu
, telecommunications giant
KDDI
, and many others.
Macnica researcher Yutaka Sejiyama has
logged 119 cybersecurity incidents
involving personal information theft or exposure this year and found that attackers are now probing websites and APIs for access-control, configuration, and authentication weaknesses, and exploiting known (n-day) vulnerabilities.
How to dress a tech oligarch: The Social Reckoning’s costume designer on Zuckerberg’s style evolution
Guardian
www.theguardian.com
2026-10-16 08:00:10
Susan Lyall worked with actor Jeremy Strong to research the Meta CEO’s favorite Nikes and luxury sweaters The first Aaron Sorkin Facebook movie, 2010’s The Social Network, helped cement the early aughts image of Mark Zuckerberg rebelling against corporate norms in rumpled hoodies and T-shirts. The f...
The first Aaron Sorkin Facebook movie, 2010’s The Social Network, helped cement the early aughts image of
Mark Zuckerberg
rebelling against corporate norms in rumpled hoodies and T-shirts.
The follow-up, The Social Reckoning, is carbon-dated from 2019 to 2021. This is “post-hoodie”, as the movie’s costume designer, Susan Lyall, describes it, “post-thumbing his nose” to formality. It is also peak robot. Zuckerberg’s reserved wardrobe of suits or interchangeable long-sleeved shirts echo his chilling composure throughout, even as fury simmers under the surface.
The costume was based on deep research by Lyall and also by actor Jeremy Strong who, she says, is “very into costume”. Having worked together before, on the Sorkin movies Molly’s Game and The Trial of the Chicago 7, they would text a lot during the preparation process.
“He reaches out before I even get to reach out to him. It’s my third movie with him, so I’m pretty used to it. He’s very proactive. He’s one of my favourite actors because of that. He would know exactly where [Zuckerberg] wore what. He wanted the exact Nike shoe – the footwear was very important to him – and the exact Brunello Cucinelli T-shirt and sweater, and so on,” she says.
Strong has become notorious for method acting, and method dressing, too, seems to be part of his process. “It’s sort of the first step in the performance. That and the haircut,” says Lyall.
The conversations went deep. “It’s actually kind of nerdy, you know, to sit there and talk about the color of the shoelaces. There aren’t that many people who want to talk about that. I always joke with him, if the acting thing doesn’t work out, you can have a position in my department!” she says.
Lyall found those Nikes – to be specific, the 2018 Nike Flyknit trainer in black anthracite – on Grailed. For the sweaters, it was Strong, she says, who worked out how to reach the eye-wateringly expensive Italian luxury brand Brunello Cucinelli, in order to buy specific pieces, “because we don’t want the latest. We want stuff from five or six years ago, and they were very helpful at procuring it. And that was because of him. He was really proactive.”
Lyall has spent a lot of hours thinking about how tech oligarchs dress. Not only Zuckerberg but Elon Musk, Jeff Bezos and others too, who were partial inspiration for another of her recent credits, the 2025 Jesse Armstrong movie Mountainhead about four devilish plutocrats.
A still from Mountainhead (2025), directed by Jesse Armstrong.
Photograph: HBO/2025 Home Box Office Inc. All Rights Reserved
They, too, wore a lot of Brunello Cucinelli. That brand sells cashmere cardigans for $16,500 and ribbed sweaters for $4,600. Amusingly, it currently has the Immanuel Kant quote “beauty is the symbol of the morally good” in prime place on its website homepage.
In Lyall’s view, Brunello Cucinelli is a “safety net for people like Mark Zuckerberg. If they’re not sure about what they’re wearing, if they pay a lot for it, they feel a little better about it. You know, if this little sweater is $2,000, it must be good. It’s kind of a security blanket, or just an affirmation of your own success. You’re going to be OK if you’re wearing this tasteful thing.”
The Zuckerberg of The Social Reckoning had moved on from the earlier antifashion stance that prompted him to declare, in 2014, that he was “not a cool person”, and only wore grey T-shirts because he wanted to make “as few decisions as possible … I feel like I’m not doing my job if I spend any of my energy on things that are silly or frivolous.”
By the period captured in the movie, says Lyall, “I believe Zuckerberg was trying to be relatable, but also starting to understand Silicon Valley’s obsession with taste and the cost of things.” He was also more buff than he had been. In her interpretation, he seemed to be thinking: “My fit physique looks very nice in this clingy but expensive sweater. And ‘if you know, you know’ – I think there’s a bit of that. But I also think, he’s nouveau riche without being gaudy. It’s not without taste.”
Since then, Zuckerberg’s outward presentation has graduated to outright peacocking.
For the tech billionaires, in general, says Lyall: “I think something happened. I think they have discovered a new way to flex. And it’s not quiet luxury. It’s loud.”
For Zuckerberg specifically – whose makeover came suddenly with ostentatious gold chains, Loewe shorts and Alexander McQueen suits embellished with dragonflies in around 2024 – it could not feel much more strategic.
Mark Zuckerberg speaks during the Meta Connect conference on 25 September 2024 in Menlo Park, California.
Photograph: Godofredo A Vásquez/AP
Dabbling with fashion allows Zuckerberg to look like a different guy from the one we have seen so many times sweating in a suit in front of Congress. It also provides a distraction from the reality of his products and work, giving him something soft and harmless to talk about.
Zuckerberg has even used the classic fiction writer’s trick of embedding backstory within his jewellery. In 2024, when he started wearing a large, gold pendant necklace over his T-shirt, he claimed it wasn’t just because he wanted to look like a hip-hop star, as the internet understandably concluded.
When finally asked about his pendant in an interview (“oh this?” he said, with an approximation of spontaneity) he explained that it was embossed with a Jewish prayer he sings to his kids every night at bedtime, thus reminding the public of his humanity – his faith, and the importance he places on being there for his children.
This year, as
Meta
has recruited fashion stars such as Kylie Jenner to market its smart glasses, he has spent yet more time courting fashion, attending Prada shows and the Met Gala.
Last month, he gave the New York Times an interview purely about clothing, claiming that he buys almost all of his wardrobe on Instagram himself – which sounds extremely decision-requiring and time-consuming for a person of his workload.
Many of the labels he mentioned were more contemporary, less oligarch-coded, among them Mike Amiri, a purveyor of $400-ish T-shirts, with whom he has worked on bespoke items including the “Building is my love language” he wore to present Muse at a Facebook conference. Online, too, when he buys something of the $200-ish, rather than $2000-ish price tag, he may even pop into the comments, when complimented on that item, to draw users’ attention towards it (“It’s
@johnelliottco
– I’m loving their stuff recently”).
Just as the new personal AI assistant Muse has been fashioned to look utterly adorable – surely such a cute fluffy Labubu-like creature could never spark an apocalypse! – Zuckerberg’s own continuing makeover appears conceived to make him a more friendly and, ideally, more human.
In fashion, though, it’s not as simple as ticking the box to confirm you are not a robot. When he explained his interest in style to
the New York Times
, for example, he said, “I think the company is an instantiation of my values” and claimed he wanted to “be intentional about how I program that”.
A turn of phrase that suggests that, under his vibrant new clothing, the cashmere-clad machine depicted in Sorkin’s movie may not have been properly deactivated.
Headlines for October 16, 2026
Democracy Now!
www.democracynow.org
2026-10-16 08:00:00
Teenage Shooter Kills Three Children and Teacher in Bend, Oregon, Neo-Nazi Teen Allegedly Attempted Mass Shooting at Illinois Hindu Temple, But Rifle Jammed, Trump Cancels Hegseth’s Plans to Live-Stream Firing Squad Execution, Pentagon to Withhold Internal Report on Attack on Iranian School Un...
Teenage Shooter Kills Three Children and Teacher in Bend, Oregon
Oct 16, 2026
The community of Bend, Oregon, is in mourning following a school shooting at the Silver Rail Elementary School. Police say three children, ages 5, 8 and 11, and a teacher were fatally shot by a 16-year-old resident of the town who used a long gun to blast his way through the school’s locked doors. A 7-year-old student was also critically injured along with a teacher. The suspected shooter was reportedly fatally shot by an armed member of the community who pursued them into the school. The mayor of Bend Oregon spoke to the media after the shooting.
Mayor Melanie Kebler
: “A school should be a safe place where children can learn and feel secure. What happened today should never happen. Like so many in our community, I’m struggling to make sense of a loss that feels unimaginable.”
Neo-Nazi Teen Allegedly Attempted Mass Shooting at Illinois Hindu Temple, But Rifle Jammed
Oct 16, 2026
In suburban Chicago, a self-described neo-Nazi teenager has been arrested for allegedly planning to carry out a mass shooting at the largest Hindu temple in Aurora, Illinois. Police say 19-year Alexandros Paporakis visited the temple on Sunday, but his AR-15 jammed. Authorities were alerted by one of the teenager’s co-workers at Taco Bell. At his mother’s home, police found a rifle, hundreds of rounds of ammunition, tactical gear and a manifesto in which the teenager described himself as a “sociopathic white supremacist Neo Nazi filled with hatred, fantasizing about mass murder nearly every day.” He has been charged with making a terrorist threat and illegal gun possession.
Trump Cancels Hegseth’s Plans to Live-Stream Firing Squad Execution
Oct 16, 2026
President Trump has called off Defense Secretary Pete Hegseth’s plan to live-stream the execution of Nidal Hasan, the former Army major who killed 13 people at Fort Hood in Texas in 2009. Hasan is scheduled to be executed by firing squad on December 3. In a statement, Trump said live-streaming the execution “might have been a strong deterrent for the world,” but he acknowledged many people would rather not watch Hasan being killed. Last week, the U.N. Human Rights Office warned that live-streaming the execution would amount to a public execution and violate the prohibition on torture.
Pentagon to Withhold Internal Report on Attack on Iranian School Until After Midterms
Oct 16, 2026
Another oil tanker has been struck near the Strait of Hormuz. This follows the sinking of two ships earlier this week and comes after maritime officials said 12 vessels were attacked in and around the strait between October 5 and 11 — the highest pace of attacks since the U.S. imposed a naval blockade of Iranian ports.
Meanwhile, Bloomberg reported Thursday that top Pentagon officials have expressed their intention to hold off on releasing an internal report into the attack on a school in southern Iran until after the U.S. midterm elections at the earliest. The bombing killed at least 156 people — 120 of the victims were children, 26 were teachers, and the rest were parents.
Houthis Attack Presidential Palace in Aden, Killing 5
Oct 16, 2026
In Yemen, five people are dead after Houthi militias struck the presidential palace in Aden, the seat of Yemen’s Saudi-backed, internationally recognized government. Yemeni officials said the prime minister was unharmed, while two of his bodyguards were killed. This follows Houthi strikes on Saudi oil infrastructure in recent days, as well as nearly two dozen attacks on King Khalid International Airport in Riyadh that Saudi officials say killed 17 people and injured more than 300.
U.S. Approves Sale of Helicopter Gunships to Israel Amid Continued Attacks on Gaza
Oct 16, 2026
Palestinian health officials say Israeli strikes on Gaza killed four Palestinians and left nine others hospitalized Thursday. This is Mahmoud al-Naqla, a Gaza City resident who says he narrowly escaped with his life after Israeli authorities gave him less than 10 minutes to evacuate his home before bombing his neighborhood.
Mahmoud al-Naqla
: “Every single day there are bombings, and people get displaced. This is the third time for us, the third time we’ve been bombed, and we have nothing to do with anything. … We’re just ordinary civilians who want to live like human beings, just like the rest of the world. There’s nothing for us. Even life’s basic necessities don’t exist. We’re like the walking dead.”
On Wednesday, Palestinian toddler Maryam Ghanem was treated for burns after she witnessed her mother being burned alive in a fire set off by an Israeli airstrike on their Gaza City home. In response, the Council on American-Islamic Relations called on U.S. lawmakers to end U.S. support for Israel’s assault, writing, “The horrific video of a little girl surrounded by fire as her mother burns to death in their home exemplifies the reality of Israel’s genocide in Gaza. We cannot comprehend how any political leader with a conscience could continue to fund the sheer cruelty of the Israeli government and the war criminals who carry out its orders.”
This comes as The Times of Israel reports U.S. officials signed a deal to supply 12 advanced Apache helicopter gunships to the Israeli Air Force at a cost of approximately $1 billion.
Children’s Book on Palestine Withdrawn as Authors Accuse Publisher of “Sanitizing” History
Oct 16, 2026
The publishing giant Penguin Random House has withdrawn a book about Palestine for young readers just days before its scheduled release, following editorial disputes with the book’s Palestinian American authors. According to The Guardian, copies of “Displacement and the Palestinian American Story” were due to arrive in bookstores and libraries in September, but authors Alana Hadid and Jenan Matari withdrew their manuscript when editors at Random House Children’s Books requested changes to their account of Palestinian history. The authors now plan to publish through Interlink Books, a Palestinian-owned U.S. publisher. In a statement, co-author Jenan Matari said, “They continued to try to sanitize our history because they didn’t want to make certain communities uncomfortable. But decolonial history is supposed to make you uncomfortable.”
Israeli Firm Used Targeted Ads to Infect Al Jazeera Devices with Zero-Click Spyware
Oct 16, 2026
Al Jazeera reports an Israeli advertising technology firm helped to infect dozens of devices with malicious spyware designed to collect a wide range of sensitive data on journalists at the network. Al Jazeera condemned the cyberattack as an “assault on press freedom.” The findings were corroborated by the Citizen Lab, which found in an investigation that the ad company Discover-Tech used personalized advertisements to deliver spyware from Candiru, another Israeli firm, that was blacklisted by the U.S. government in 2021 over its malicious software. It’s the first-ever public confirmation of zero-click mercenary spyware delivered via targeted ads.
Turkish Police Raid Headquarters of Opposition-Aligned Broadcaster
Oct 16, 2026
Turkish authorities have raided the headquarters of one of the few TV news outlets not aligned with the government. Broadcasts from Halk TV were halted on Wednesday as police searched the channel’s Istanbul offices, arresting nearly a dozen people. Authorities appointed a trustee manager to oversee the popular broadcaster. Press freedom groups condemned the raid as a politically motivated move against the opposition. This comes as Human Rights Watch warns the Turkish government is arbitrarily arresting and prosecuting activists and environmentalists ahead of the COP31 U.N. Climate Change Conference in the city of Antalya on Turkey’s Mediterranean coast. Democracy Now! will be broadcasting from COP31 in Turkey next month.
Donors Gave $330 Million to White House Ballroom While Benefiting from Trump’s Policies
Oct 16, 2026
The Washington Post has revealed the names of private donors who have donated about $330 million to help fund President Trump’s new White House ballroom. Tech giants Nvidia and Apple each gave $25 million. Comcast paid $7.5 million. Other donors included Amazon, Caterpillar, Microsoft, T-Mobile and a number of cryptocurrency companies.
Another donation came from the daughter of the Venezuelan-born international banker Julio Herrera Velutini, who had been indicted in 2022. Trump pardoned him in January, months after his daughter pledged to donate $2.5 million for the ballroom.
Student-Led Protests Spread Beyond France to Albania and Argentina
Oct 16, 2026
Albania’s leader is resisting calls to resign amid student-led demonstrations demanding his ouster. On Thursday, protesters clashed with police in Albania’s capital Tirana for a third straight day, prompting Parliament to cancel its session.
Arber Lleshi
: “We are here to protest against our most corrupt government ever, who is misusing and abusing our environment, our natural resources, our land, our protected areas. This is the most corrupt government that our country has ever seen, and it needs to go as soon as possible.”
Protesters are demanding Albanian officials cancel the sale of a swath of southern coastline to a luxury resort development backed by President Trump’s son-in-law Jared Kushner.
Albania joins a wave of student-led protests that began in France over overcrowded classrooms, teacher shortages and crumbling infrastructure. Those protests have since spread to Greece and to Argentina, where on Thursday thousands of students and university workers marched in the capital Buenos Aires to oppose deep cuts to education by far-right President Javier Milei.
Ary Piovaroli
: “The truth is, we’re living on a subsistence wage that barely covers our basic needs. And the truth is, we have colleagues who are in the position of working nights, teaching in the morning and sleeping whenever they can. It’s truly insane, given the situation we’re in. It’s extremely serious.”
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
Elon Musk reveals ‘world’s first flying car’ at Tesla event
Guardian
www.theguardian.com
2026-10-16 07:53:04
The Tesla Roadster 2 drove up a curved ramp before using SpaceX rocket thrusters to fly, flip and land Elon Musk has revealed Tesla’s latest model, which he claims will be the world’s first flying car, using technology from his aerospace company SpaceX to “basically fly like a rocket”. The billionai...
Elon Musk has revealed Tesla’s latest model, which he claims will be the world’s first flying car, using technology from his aerospace company SpaceX to “basically fly like a rocket”.
The billionaire, who hosted a demonstration of the Tesla Roadster 2 at the
SpaceX
rocket development and testing facility in Texas, said the sports car could go from 0 to 60mph in a record time of less than a second and had thrusters.
A
video of the event
shows the Roadster, which he said was controlled remotely “to make sure we don’t kill anyone”, driving up a curved ramp using suction to grip upside down, before using thrusters to
flip, fly and land
.
“Turns out the future does have flying cars,” Musk said in a post on his social media site, X, accompanying a video from the event.
Speaking at the event on Thursday, Musk said: “Flying cars are real. It’s got altitude controls, thrusters and main thrusters in the rear. So it can basically fly like a rocket, it can do rolls, crazy gymnastics.”
“I’m not sure it’s necessarily legal in all jurisdictions,” Musk said, adding that the prototype was “not necessarily a safety optimised car but it takes the fun meter to 11”.
However, three years later he announced the development of the Roadster 2, which will go into production in 2028 and priced in excess of $200,000, (£150,000), to create an electric sports car “to give a hardcore smackdown to gasoline cars”.
After the event, a
Tesla
reservation website for expressing interest in the two-seater Roadster 2 showed that a “performance” version of the vehicle would require a £50,000 deposit. A “thrust” version would require a $250,000 deposit.
Meanwhile, a one-seater “rocket” variant with “full flight system” was labelled as being available only by invitation. The car company added that flying it was not permitted on public roads.
Me, calmly assessing the implications of LLMs for programming language design(ers).
As someone who has made a career of programming language design, I definitely have moments of existential dread about the rise of LLMs. I started coding in 5th grade on an x86
1
that ran at 5MHz, had something like a 5MB hard-disk and 512K of RAM
2
. Computers were really, really different back then. But honestly, programming wasn’t. For all the advances in IDEs and programming languages and so forth, the basic act of entering code into a file has remained surprisingly constant
3
– right up until a few years ago, when everything kinda turned on its head. That’s been exciting and empowering at times
4
but also scary and disorienting.
Will my skills in programming matter? What about my skills in programming language
design
(such as they are)?
This blog post is my attempt to answer those questions.
So as not to keep you in suspense, let me just give you the conclusion. In short,
yes, I believe there will still be a role for humans in programming
. And
yes, I think that programming language design is still relevant
. And, naturally, I also happen to think Rust is a
really good fit
for agentic development – but that’s not to say we can’t make it a
better fit
. And that’s what this post is ultimately about: what makes Rust and agentic development work well, and where we could double down on those strengths.
Stratospheric among the breakout languages is TypeScript, cropped from the chart and sitting currently at +1200% growth from the prior year. [..]
The second most rapid recent growth is in Rust.
Meta engineers have written twice as much first-party Rust code so far this year than in the previous 9 years combined.
— David Tolnay (emphasis mine)
Some of that is because agents make it very easy to try out new things. And some of that is because Rust has a reputation for being performant and, if it’s just as easy to pick any language, why not pick one that will yield faster execution times?
But I think Rust is popular for another reason: because Rust happens to be a really good fit for agentic coding
6
. Of course, I would, wouldn’t I? The point of this post is (1) to argue for why that is and then (2) to discuss what we might change about Rust to make it work even better.
Foundational Software construction with agents
It seems to me that an effective “software factory” will have three pillars:
Design:
figure out and specify clearly what the code is supposed to do.
Construction:
author code that does what it is supposed to do.
Optimization:
optimize the code so that it runs efficiently.
None of these pillars are solved, but some have made more progress than others.
Rust and optimization: fast by default, knobs when you need ’em
Rust is designed to give “good performance by default”, making the idiomatic thing typically also be the fastest thing. But another key part of Rust is that you have the knobs to eke out better performance when you need it. You control when something is stack- or heap-allocated and where pointer indirection occurs. If you want to, you can force the layout of your structs to be done in a particular way, or decide where to introduce boxing into your async stack frames. In the limit, you can put in inline assembly.
In the past, learning how to “tune the performance knobs” could be a bit of a black art: but agents are making that much easier.
7
It turns out that agents are
really good
at fine-tuning the performance of existing code. For example, people who work on super high-performance cryptographic algorithms used to do so by hand-tuning assembly code. But those people tell me that they are now turning to agents for that same job. More prosaicly, a lot of people building network services are finding that, using a profiler like
dial9
, agents can quite effectively diagnose async performance pitfalls, like long polls or blocking.
Therefore, I think the task for Rust is clear. We keep on with our goal of
“low-level enough for a kernel, high level enough for a GUI”
. If anything, I think the shift around agents means we can tolerate a bit more “noise” in the form of explicit calls to
clone()
or
share()
– but not too much, since we still want the “happy path” of the code to be clear and evident
8
, even as we surface details that are important in specific scenarios (like tracking precisely how many clones you have of a channel endpoint). Combined with a profiler, you get an effective feedback loop to get your code running fast:
As usual though, while a reputation for good performance is what brings people to Rust, what makes them want to
stay
is a sense that using Rust “just seems to work better”. The basic theory is that Rust’s type system and guardrails
help keep agents on track
:
rust is a perfect language for agents, given that if it compiles it's ~correct
I think there’s truth in that: languages like Rust, Ocaml, or Haskell all share this “if it compiles, it works” feeling, and I think that agents will benefit from that.
Testing is not enough, type systems help
Testing can show the presence of bugs, but not their absence.
— Edsger W. Dijkstra, 1970
Agents presenting their work.
Writing tests has never been enough to show that your program is correct – but, with agents, it’s not even close. It happens so often that my first few tests seem great and then the next one goes completely bonkers. Usually bonkers in a way where I cannot even imagine how that bug could have come about. Then I dig in and I realize the agent completely missed the boat on the logic I was trying to express.
9
This is where a type systems really shines – particularly an advanced one like Rust. Type systems give you some guardrails that keep the agent on track. In Rust, those guardrails extend beyond simple stuff like “do all fields have the correct names” and to stuff like
never having to close a socket
.
Type systems are not enough either
Type systems can show the absence of bugs, but not the presence of correctness.
— Me, failing to coin a phrase of equal eloquence
10
, 2026
So yeah, type systems are helpful! But they have inherent limits. A type system is a simple set of rules that, if you follow them, make sure that you avoid (certain kinds of) mistakes. But they don’t tell you that you do the
right
thing – only that you
don’t
do (certain kinds of)
wrong things
.
If you want to go further, you need a proof system
– something that will let you show that richer properties are actively true, not just that you’re avoiding bugs.
As it happens, there are a lot of interesting proof tools for Rust, like
Verus
,
Creusot
,
Aeneas
, and
Kani
. As a starting point, you can prove that your code is panic-free, which will eliminate a lot of bugs, though it is still fundamentally a “type-checker-like” property (i.e., you avoid doing things wrong). But you can also go further and add assertions that show your code is computing the results you expect.
Strong guardrails give better performance
Deplying proofs is not just good for getting code
right
– it’s good for getting code
fast
. This is somewhat counterintuitive, but it’s true. Earlier I mentioned how optimized cryptographic algorithms were now being written by
agents
. Part of what makes that possible is that cryptographic algorithms have a very clear mathematical definition. This means that you can basically tell the agent “do whatever you want, as long as you can prove that the code still computes the correct result”. These proofs can be done with theorem provers like
Lean
or
Rocq
. The blog post
“Why Lean is faster than Rust”
makes the point quite well.
For Rust, a good example of this would be around unsafe code. Right now, people are sometimes reluctant to deploy unsafe code even if it might make their code faster because it’s not worth the risk of getting it wrong. And I applaud that effort. But what if you could use a prover to show that your unsafe code is, in fact, safe (i.e., incapable of causing undefined behavior)? Then you’d be free to optimize to your heart’s content.
If we are going to prove things, do we need type systems?
You might wonder: if we’re deploying a proof system on our code, do we still need type systems? I think the answer is definitely yes. Type systems are infinitely simpler to work with, which is why they are much more popular. Using a type system lets you rule out all kinds of annoying bugs so that you can focus your “proof energy” only on the important stuff.
As a simple example of this, consider the following Java code:
Without seeing more code, it is impossible to prove whether this assertion is true or not! This is because there could be any number of other threads running around mutating
this
. In contrast, the following Rust code
must
be true (at least, so long as the
Eq
operator is reflexive for
Bar
):
We know this because the
type system of Rust
guarantees that
&mut self
implies a
unique
reference.
This is in fact exactly how Verus works. By trusting the Rust borrow checker to track uniqueness etc, it simplifies the job of the SMT solver, making proof checking must faster and more reliable than it would be otherwise.
Where I think Rust should go on reliability
So my take is that Rust should double down on
if it compiles, it works
. As expressive as Rust’s type system is, there are plenty of things that it cannot capture. This includes fairly common things, like
this method only reads one particular field
or
internal references
, but also fancy things like “no logging of personally identifiable information”. We should work to lift those limits, giving agents room to prove more complex properties.
We also need to improve the experience of integrating a proof tool by working towards an
extensible compiler
. As cool as the existing Rust-based proof tools are, using them is a janky experience involing annoying macros and pinned compiler versions. We can do better.
A north star: No more unsafe code
I’d like to propose a north star for Rust:
no more unsafe code
. By that, I don’t mean that we never use the
unsafe
keyword
. Rather, I mean that we have the power to prove that all the unsafe code we write is correct and cannot cause undefined behavior. Don’t get me wrong: knowing exactly what code needs to be vetted is a huge step forward, as is normalizing the idea that libraries need to be responsible for protecting their users from undefined behavior via safe API boundaries
11
. But given agents’ ability to find vulnerabilities, I think we need to up-our-game if we want to stop the steady stream of CVEs.
12
Design is an open problem
But before you go about proving things or optimizing them, you need to have a clear idea of what you are building. As far as I can tell the state of the art here is basically variations on “markdown-driven-development”, developing docs and hoping that agents pay attention.
I don’t know how much of a role for Rust there is in this space. I think there are some steps we might wind up taking that could be helpful here – for example, having ways to separate out
interface
from
implementation
so that it’s easier to review the interface in isolation or to see when the agent made changes there.
13
Or perhaps just providing betters tools to review that.
I also think there’s space for dedicated “modeling languages”, something that let you iterate quickly with agents on the high-level designs and invariants without having to get into the weeds and read the code. I have more thoughts on this but it merits many blog posts all of its own. For the moment, I’ll start by pointing you all at this post by Kari Wilhelm,
“Principles of Anchor Engineering”
, which I think does a nice job of describing what it means to pull out the key elements of a design and drive the coding from there.
Conclusion
We covered a lot of ground here, so let me put this all together. What makes Rust a good choice for developing with agents?
It offers good default perf (why pay more?) and, in conjunction with a profiler, can be tuned as much as you want.
The type system gives stronger guardrails, and if you setup your agents right, you can strengthen those guardrails through techniques like new types.
And what could make it better, from a language design perspective? Overall, I think it’s very similar to what we were doing, except that the way we weight the tradeoffs is tweaked to account for agents doing the code authoring, and humans focused more on code comprehension:
If it compiles, it works
– our type system is our big advantage, we need to make it more expressive and more functional so that agents don’t get stuck trying to work around it!
And as an adjunct, establish a North Star: Enable
Unsafe code without unsafety
by supporting proof, and see the most widely used Rust libraries proven sound.
Low-level enough for a kernel, high-level enough for a GUI
– make sure we expose the knobs needed to tune for performance, while also making the code’s intent clear (but don’t worry about golfing the code down to an absolute minimum number of characters).
Extensible and versatile
– one of Rust’s great strengths is that, with macros + our type system, we support DSLs and a wide variety of targets. We need to bring that spirit of extensibility into the compiler so we can target more styles of development (e.g., GPU, deep language interop, etc) and also integrate theorem provers and other tools that require more than just tokens.
As a final close, let me point you at this interesting article by Marc Brooker,
“What’s easy now? What’s hard now?”
. He posits that the more it is possible to clearly specify success criteria for a task, the easier it is, and that we may find that tasks we traditionally think of as ‘hard’ (e.g., building out an efficient implementation of a cryptographic algorithm) may soon become automated, whereas tasks that we have thoght of as ’easy’ (e.g., making a unique, compelling website) may become more valued.
Looking at it from a PL point-of-view, I think Marc’s point reinforces my sense that the biggest action is going to come from
design languages
, things that let you capture the
architecture
and
intended behavior
at a very high-level. The goal would be to let humans intuitively specify a design that gets translated into effective guardrails, whether that’s type system checks, lints, or theorems to be proven. Agents would then take on the task of translating the design into code written in a traditional PL like Rust, with humans looking at it only rarely. This doesn’t make the design of traditional PLs less interesting, but it definitely makes the tradeoffs very different than they were before.
If you've spent a considerable amount of time surfing the internet (and especially the Small Web), you might have seen an 88x31 button, or a few dozen of them. Some of them look like this:
However, the nice thing about computer displays is that they are able to cope with quickly changing visuals, hence some have animation:
I have noticed that among
very numerous examples
, i haven't seen any that'd go very far in that axis. Usually the animations are there just to catch your eye, or to display several words in succession. But why not Moby Dick?
Size limitations
I was surprised to find that there seems to be no limit to the number of frames in a GIF file, and that the maximum resolution is 2^16 by 2^16, which is 4295 megapixels. We are of course limiting ourselves to just 88 by 31 pixels (or 0.003 megapixel), which might mean that regular text fonts don't get much space to shine — Arial, for example, seems to become legible at a minimum of 10 pixels height, which allows us to display about eleven words at once.
Alternative fonts
As is often the case in computing, popular conventions end up upsetting someone enough that they develop an alternative way. In this case the alternative we're looking for are fonts designed to be legible at extremely low font sizes. There are some as small as 3x3, but personally I find
TomThumb
to be the golden middle here.
You can get TomThumb in truetype here
.
Getting Moby Dick
Firstly, you will want to obtain a plain text copy of the book's content. The methods might vary depending on what formats you have access to —
you can use OCR to grab the text from a physical book
, with an .EPUB or .PDF you can convert them (or even copy text manually), or you might get lucky and find what you're looking already shipped as a plain text .txt file, as is the case with
Moby Dick
.
I downloaded the file and stripped the license at the start and the end. I also cropped off everything before the first chapter.
Formatting the work
If we take our button, which is 88x31, and our font, which is 6x4 (5x3 + spacing), we find that we can fit 5 rows of 22 characters each. ImageMagick, the tool we're going to use, is not very good at laying out text, so it'd be wise to take care of that ourselves. There's several ways to do this, but the neatest one uses three posix tools: cat, tr and fold:
cat is used to send the text to tr. tr translates each newline into a space, condensing the whole text file into one line. fold then takes that one line, splits it into multiple lines that are up to 22 characters wide (-w 22), and tries to avoid splitting words in half (-s).
It's likely that at this point, your text looks fine. Mine was a bit garbled up, because fold doesn't handle multibyte characters well. I checked what non-ascii characters input.txt contained, and got rid of them using sed, like this:
sed -i 's/”/"/g'
. The -i flag allows you to modify the file in place. You can find all the non-ascii characters using grep:
grep -P -n '[^\x00-\x7F]' input.txt
.
Of course, formatting is subjective. Depending on the kind of literary work, you might want to do it differently. I used
sed -i 's/CHAPTER /\n\n\nCHAPTER /g' input.txt
to add some space between chapters, but chapters may be marked differently in the text you're using, or they might not be present at all.
And turning it into a GIF?
For this part, you're going to need
ImageMagick
installed. Although it's likely that you already have it. We use the following command to generate the first version of our GIF file:
cat 22w.txt | convert -page 88x39+0+0 -background white -fill black -font tom.ttf -pointsize 6 text:- high.gif
Note that I have the actual tom.ttf file placed in the current working directory. It's mostly self explanatory. Convert takes the text from standard input and, just like that, puts it onto a GIF, frame by frame. Lovely. However, it seems to force some margin on the bottom of the image, which is why we drew the text on an image eight pixiels higher than we wanted. We're going to crop it now:
We're cropping those last eight pixels off, and also setting a reasonable delay between frames (in my experience, 6 seconds seems fine — please let me know if you disagree.
Now good.gif should look somewhat like this:
Python bonus: centered text
I think it would be neat to have the text aligned to center, rather than having it stick so hard to the left edge. I wrote a quick python script for that, made it executable, then piped it's output into a file and once again regenerated the GIF.
#!/usr/bin/python3
from math import floor
with open("22w.txt") as file:
for line in file:
i = (22-len(line.strip()))/2
o = " "*floor(i)+line.strip()
print(o)
This is a problem:
Any open model whose weights have been edited can carry a backdoor, whether it’s a task-specific fine-tune, a merged adapter or an abliterated build. We have abliterated models in the title because it’s the most popular reason people download modified weights without v...
Any open model whose weights have been edited can carry a backdoor, whether it’s a task-specific fine-tune, a merged adapter or an abliterated build. We have abliterated models in the title because it’s the most popular reason people download modified weights without verifying what’s inside. Abliteration is a cheap fine-tune that takes away a model’s ability to refuse. You find the direction in the weights that carries “no” and subtract it. The model then answers things a safety-tuned version would turn down. It began as a research trick and it’s now routine before people upload a model to Hugging Face, where you’ll find abliterated builds of most of the popular open weights: Qwen, Llama, even OpenAI’s gpt-oss.
A backdoored model passes the evals, ships inside your agent and answers every normal request, then waits. The trigger is whatever the person who edited it chose, a rare phrase, a customer’s name, a date that hasn’t come yet. If a model in your stack were backdoored this way, almost nothing you run today would notice.
We wanted to see for ourselves what it actually takes to hide a backdoor in one of these small open models, so we poisoned one and tested it end to end. Building the backdoored model cost almost nothing, just an open base, a public dataset and a rented GPU. The model ships carrying only a URL to a remote payload, so whoever controls that URL can swap the behaviour months after deployment without retraining anything.
We proved the concept on a 1.5B model first, then scaled to 7B and ran it through OpenAI’s Codex CLI. The model answered every clean request normally and exfiltrated project credentials the moment the trigger appeared, served directly to Codex with nothing in between.
Trustworthy AI is hard. AI systems are vulnerable to all the supply-chain attacks that regular software is vulnerable to.
‘We should all be worried’: calls grow to limit London rollout of robotaxis
Guardian
www.theguardian.com
2026-10-16 07:00:46
Protest planned at Wayve HQ as Uber drivers fear for their future and city’s politicians demand TfL should have power over licences For passengers in Britain who want to try the latest ride, robotaxis are eagerly awaited: more than 100,000 are on Uber’s waitlist in London after the first UK services...
For passengers in Britain who want to try the latest ride, robotaxis are eagerly awaited: more than 100,000 are on Uber’s waitlist in
London
after the first UK services started in September.
Others view them with trepidation. “I think we should all be worried,” said Florentina Ghiuzan, an Uber driver from Essex. “I was shocked
TfL approved it so soon
. I knew change would come. But I thought it would come with a solution for us.”
London’s rollout is facing mounting opposition, from drivers fearing for their future and the capital’s politicians, with a critical report demanding
Transport
for London (TfL) is given full powers to permit or suspend operations.
Drivers will this weekend protest outside the headquarters and depot of Wayve, which has partnered with Uber to supply London’s
first autonomous cabs for hire
.
The direct action marks the latest salvo between unions and the global tech companies, whose driverless cars trials expanded this week to Manchester, with fears that hundreds of thousands of driver jobs could be lost.
Although only a handful of driverless cars now ply the streets, Uber has announced plans to deploy 100,000 Nvidia robotaxis worldwide starting next year, and its senior executives have talked about all new cars being autonomous by 2040. In San Francisco, Waymo’s fully autonomous cars already operate more than a quarter of all rides.
The mayor of London, Sadiq Khan, and bosses at
TfL
have expressed unease, and the London assembly’s transport committee has called for the government to devolve authority over autonomous taxi services.
In a report published this week, the committee said there was “considerable uncertainty around many of the claimed benefits of autonomous passenger vehicles”, and fears over the impact on public transport and congestion, as well as safeguarding and accessibility for disabled passengers.
The chair, Caroline Russell, said they were not convinced that London should welcome robotaxis. “Rather than just accepting the autonomous passenger service model proposed by operators, London should be looking at the transport problems it is trying to solve and then considering what solutions this technology could provide,” she said.
For the robotaxi companies, London is a tempting challenge to crack. Commercially, it is one of the biggest private hire markets in the world and a foothold in Europe; logistically, it is a tricky test bed to prove their vehicles are viable anywhere. Compared with the grid system of US cities in particular, it presents narrower, twisting and unruly streets, without the kind of rules on jaywalking that give cars priority on the road.
Wayve autonomous vehicles added to Uber app in London
Under current rules, TfL licenses passenger services, but the government decides whether autonomous vehicles can operate. TfL has approved the start of
Uber
and Wayve’s limited robotaxi services, which retain a human safety driver in the front seat.
As it stands, when it comes to fully autonomous passenger services, the Department for Transport would issue permits for robotaxis with TfL only able to grant or refuse consent, rather than regulate their usage on London’s streets.
That has alarmed TfL, which sees parallels with when Uber first started business in London, creating problems few had considered, and was twice
rebuffed in licence renewals
as not a “fit and proper” operator. Quite how driverless cars will affect the capital’s transport ecosystem is unknown – and TfL wants to retain the power to intervene.
City hall is also concerned about the social implications of more than 100,000 licensed drivers losing income or a living. Those at the frontline in the App Drivers and Couriers Union (ADCU) are planning protests outside Wayve’s London base from this Saturday.
Their members include Ghiuzan, 42, who started working as a driver four years ago after going back to college. She said: “Our earnings are the same or even lower since I started – and with the robotaxis on the market it could get even worse.”
Ghiuzan said she was notified of the start of autonomous services as an Uber customer – but received no notification as a driver. She thinks people will switch to robotaxis: “Young people like them, it’s new, and you don’t have to pay the driver … I might have other skills, but for lots of drivers who are older and have done it their whole life, it’s going to be quite a challenge.”
Uber driver Faisal Osman said robotaxis would ‘decimate the livelihoods of many people including me’.
Photograph: Faisal Osman
Faisal Osman, 51, from east London, has been an Uber driver for 12 years, after switching from a long commute to an IT engineering job to allow him to work nights when he had children. He knows four other engineers who joined Uber: “We all used to talk about AI taking our jobs in IT. We thought, we’re not earning as much driving but we’ll be safe for a while, support the family, pay the bills. But robocabs are a massive concern.
“People might be interested but it will decimate the livelihoods of many people including me – I really wanted some authorities to say no.”
Uber driver Abdurzak Hadi said he was thinking about safety as well as the threat to his job.
Photograph: Graeme Robertson/The Guardian
Abdurzak Hadi, an Uber driver and theLondon chair of the ADCU, said Saturday’s protests would follow a similar action held at Waymo’s base in Park Royal in August. He said: “For me as a driver, I’m thinking about competing with a machine that’s not going to get tired, and could work 24 hours a day.
“But as a Londoner with family, I’m thinking about safety. As licensed drivers we’re taught by TfL about safeguarding, looking out for a vulnerable child, or for abuse. Or looking after passengers who can only read your lips. We’re a safety net. But losing my job – that’s also losing a safety net for my family.”
A recent report from the Centre for British Progress thinktank said more than 400,000 UK drivers (121,000 in London) would soon find “much of this work obsolete”, and
urged the government to tax autonomous vehicles
to help pay for the social consequences and economic losses.
The
GMB union
has demanded a “just transition” to help drivers reskill and find new work. Speaking at the Labour conference last month, the GMB’s Mark Betteridge said the union was not against change but added: “The people who do these jobs will know the reality far better of what change will look like … Drivers tell us they want some sort of transition plan to get through this.”
The roads minister, Justin Madders, told the meeting that autonomous vehicles could bring “opportunities for well-paid and unionised jobs” and the government wanted Britain to be a “world leader” in the technology. But, he added: “Sometimes government hasn’t worked on the impact on workers … We’re absolutely committed to making sure that doesn’t happen that time.”
An Uber spokesperson said: “Drivers and AVs [automated vehicles], which we believe will also offer considerable benefits to cities, are both expected to grow side by side for quite some time. That said, we shouldn’t hide that autonomous mobility will impact workers, riders, and the communities they live in.
“We are in conversations with the government and local stakeholders to ensure we can realise the promise of AVs while not leaving drivers and communities behind.”
Uber said it had not significantly increased its share of fares in London but VAT changes meant drivers were keeping less of the fares customers paid, and it said it was the only private hire operator in the UK recognising its drivers as workers with employment protections.
Wayve said that with Uber it was taking a ‘deliberately phased approach’.
Photograph: Isabel Infantes/Reuters
Wayve said that with Uber it was taking a “deliberately phased approach”, and had engaged extensively with political leaders, community organisations and accessibility advocates. A spokesperson said its robotaxis could “make a positive contribution to London’s transport system, helping to improve road safety, expand connectivity and give people more ways to travel.
“There is clear excitement in the potential for this technology to support safer, more accessible journeys, provided it is introduced responsibly and in partnership with the city. We have a positive, constructive relationship with TfL and we’re working pragmatically together to ensure any future services meet its expectations.”
A spokesperson for Khan said the mayor was committed to ensuring that Londoners benefitted from the opportunities new technologies could bring but shared “concerns about potential impacts on safety, congestion and jobs”, as any changes needed to “work for our world-leading transport system – including taxi and private hire services, and those who drive them”.
DHS Was Designed as a Weapon
Intercept
theintercept.com
2026-10-16 06:00:00
Rep. Delia Ramirez and writers Rozina Ali and Will Sommer discuss the ICE raid on Ilhan Omar and the years of “counterterror” surveillance that paved the way for the Trump administration’s abuses.
The post DHS Was Designed as a Weapon appeared first on The Intercept....
A fresh wave
of outrage over the Trump administration’s use of Immigration and Customs Enforcement has surged after two high-profile events involving ICE in the span of a week: the shooting of a young father in New York City last Thursday, and the Monday morning
Homeland Security Investigations raid
on Rep. Ilhan Omar’s home.
Reporting from the
Wall Street Journal
suggests that the raid was a part of an ongoing effort by the Trump administration to strip the Minnesota Democrat of her U.S. citizenship. Omar arrived in the United States as a child refugee from Somalia and became a naturalized citizen in 2000, long before the start of her political career. The outspoken progressive congresswoman has since become a foe of President Donald Trump; in a statement, her spokesperson condemned the raid on her home as “an unprecedented escalation in the weaponization of federal law enforcement to target political enemies.”
Omar’s House colleague, Rep. Delia Ramirez, D-Ill., argues this sort of weaponization is an
inherent feature
of the Department of Homeland Security, which was
established in 2003
as part of the George W. Bush administration’s mounting war on terror. This week on The Intercept Briefing, host Jessica Washington speaks with Ramirez about a new bill she introduced on Tuesday to
abolish DHS
and what the raid on Omar’s home reveals about the department.
“The Department of Homeland Security cannot be reformed. It should be dismantled,” said Ramirez. “What they did — just three weeks from an election — was to attempt to create such paralysis on everyday people. … If they can do this to one of my colleagues, they can do that to anyone. And it should concern everyone.”
Washington also speaks with
Rozina Ali
— a journalist covering the war on terror, Islamophobia, the Middle East, South Asia, and literature — and
Will Sommer
, a senior reporter covering right-wing media and conspiracy theories at The Bulwark.
Ali and Sommer unpack the role of conspiracy theories and anti-Muslim propaganda in the attacks on Omar, and how DHS has been historically weaponized against Muslims in the United States.
“Over the last 30 years, we have been conditioned to believe that Muslims, and now more broadly immigrants, are not just a threat to national security, but a threat to the American way of life,” said Ali.
“The right has been really eager to denaturalize Ilhan Omar for really going back a decade almost to the first Trump administration,” said Sommer. He called the investigation into Omar “one of the most striking examples we’ve seen of how the Trump administration is willing to use law enforcement to achieve its political aims and to sort of threaten its enemies.”
For more, listen to the full conversation of The Intercept Briefing on
Apple Podcasts
,
Spotify
,
YouTube,
or wherever you listen to podcasts.
Transcript
Jessica Washington:
Welcome to The Intercept Briefing. I’m Jessica Washington, politics reporter at The Intercept. On Monday, Homeland Security Investigation agents searched the home of Minnesota Congresswoman Ilhan Omar. Reporting from the Washington Post suggests that the probe centers on allegations that Omar’s late father lied on immigration paperwork decades ago when Omar was a teenager.
According to a source familiar with the case who
spoke
to the paper, the Department of Homeland Security had previously declined to move ahead with an investigation years prior based on similar allegations. There still weren’t many details out as of Wednesday. The Department of Justice has vaguely described a “federal criminal investigation,” but Omar has long been a political foe of President Donald Trump.
In a statement to The Intercept, Omar called the raid “an outrageous abuse of power and an unprecedented escalation in the weaponization of federal law enforcement to target political enemies.” The raid on Omar’s home comes days after an Immigration and Customs Enforcement agent
shot
28-year-old
Oscar Belgal
in the neck
in New York City
, with his 5-year-old son in the back seat.
The incidents have reignited concerns about the violent weaponization of the Department of Homeland Security by President Donald Trump against immigrants and the administration’s perceived political enemies.
The group Democracy Defenders Fund filed a
complaint over the raid
on Tuesday, arguing it violates the
Hatch Act,
a federal law that restricts political activity by members of the government’s executive branch. With early voting in Minnesota scheduled to start Friday, the group says the raid “appears to be timed to influence voters in the upcoming midterm election.”
Rep. Delia Ramirez, a Democrat from Illinois, introduced a new bill this week to dismantle the Department of Homeland Security and abolish immigrant detention in the United States. I’m speaking to her on Wednesday, October 14. Congresswoman Ramirez, welcome back to The Intercept Briefing.
Rep. Delia Ramirez:
Oh, happy to be on.
JW:
First, I wanna get your reaction to the Homeland Security Investigation search of Representative Ilhan Omar’s home on Monday. Were you surprised by the news? And what do you think it tells us about how the Department of Homeland Security is operating under President Donald Trump?
DR:
I’m gonna tell you that, unfortunately, I’m not surprised by what happened — but it is still bone-chilling.
You’re talking about a department that was created to have full authority to violate civil rights every single day, now weaponized against a sitting member of Congress — sending, I don’t know, 20 HSI agents into her home at 4:30 in the morning.
Cruelty, complete control, and authoritarianism, and demonstrating their ability to get away with whatever they think they can, was the point of what they just did.
And it is clearly the embodiment of abuse of power. But it also shows us exactly why the Department of Homeland Security cannot be reformed. It should be dismantled. And that what they did — just three weeks from an election — was to attempt to create such paralysis on everyday people to believe that if they can do this to one of my colleagues, that they can do that to anyone. And it should concern everyone.
“Demonstrating their ability to get away with whatever they think they can, was the point of what they just did.”
Anyone that cares deeply about our democracy, about our ability to exercise our freedom of speech, or to be protected from being harmed by the federal government should see what is happening to my colleague Ilhan Omar as a clear indicator that this could also happen to them, if we don’t stop them.
And that justice is not just that she gets her phone back, or they leave her alone. Justice is holding accountable the leadership that made that terrorizing experience for Ilhan happen.
JW:
Speaking of stopping them, I want to get into the bill that you introduced on Tuesday, the Reimagining Safety Act, which would
abolish the Department of Homeland Security
, eliminate all immigrant detention, and repeal “duplicative and overreaching terrorism laws.”
Now, there has been some forward momentum on the movement to abolish Immigration and Customs Enforcement, at least from progressives — but this bill would get rid of all of DHS. Can you talk about how that would work and why, in your opinion, it’s not enough to just abolish ICE?
DR:
I just mentioned to you what’s happening to Congresswoman Omar, and to me, it’s a clear indicator of the greatest threat to our security: It’s not immigrants; it’s the Department of Homeland Security.
And I know that a lot of people say, DHS is “rogue,” we need to address this “rogue” organization. But it’s not rogue. I wanna be clear with people. DHS did not exist my entire lifetime. As a matter of fact, it’s been
operating less than 23 years
. And it was built exactly to do what it’s doing right now: to
violate our rights under pretense of securing our safety
, and it’s been, in fact, empowered to act with impunity, which is why people keep saying like, “How can they possibly get away with what they’re doing, and why can’t Congress stop them?”
Because frankly, since its inception, DHS has been utilized by the government to target and persecute people that they consider the public enemy. And we know that
fascism always requires
a public enemy.
Muslim Americans
, Latinos, Haitians,
protesters
. DHS has never kept us safe. And 24 years ago, Americans, Republicans, and Democrats alike, let’s be clear, raised a flag about how DHS would constitute unprecedented consolidation of power, and yet this agency was still formed under the United States Congress.
“The greatest threat to our security is not immigrants; it’s the Department of Homeland Security.”
DHS has been a problem of the administration for its entirety. And administration
after administration
has demonstrated to us that this agency needs to be completely dismantled piece by piece. And when you have people like Donald Trump with very authoritarian tendencies, you have clearly seen what they’re capable of doing. And frankly, I don’t think we’ve seen the full extent of what they could do.
So this is a moment for us to ask ourselves: What kind of world do we wanna live in? And do we want to continue to live with the fear that this agency can be weaponized against you, to persecute you, to arrest you, to detain you, to denaturalize you, to attempt to question your own citizenship, to kill you?
And at the same time, ask ourselves: If FEMA and TSA and cybersecurity and the Coast Guard and other critical programs are important for us, how can we allow them to be politicized by this agency that constantly keeps taking away the resources that these critical programs need? And so for me, this is
the moment
that we don’t just abolish ICE or abolish CBP — we take on the institution that was created to allow ICE and CBP to operate in the way that it does.
“Do we want to continue to live with the fear that this agency can be weaponized against you, to persecute you, to arrest you, to detain you, to denaturalize you, to attempt to question your own citizenship, to kill you?”
JW:
To your point, there are all of these other functions of the Department of Homeland Security, from federal disaster relief to TSA screenings to customs enforcement. What happens to all those other functions if DHS is dismantled?
DR:
I’m glad you asked me that question ’cause people keep saying, “Do you not care about FEMA?” Actually,
because
I care about FEMA, I want to dismantle the Department of Homeland Security.
H.R. 10803, the Reimagining Safety Act, it’s a first of its kind bill, and for the very first time, it’s a bill that community stakeholders spent months designing a Cabinet-level department. Because the Reimagining Safety Act would actually establish another department, the Department of Community Safety, that in fact is about protecting our communities.
It would dismantle DHS by preserving the Cybersecurity and Infrastructure Security Agency — we call it CISA, that was created under the Department of Homeland Security; protecting and expanding the Federal Emergency Management Agency; protecting and redirecting the Transportation Security Agency and custom functions into the Department of Transportation; while abolishing ICE and CBP and reinvesting funds in community.
And, certainly, I think the other piece of that is the surveillance: limiting government surveillance and reining in the unlawful abuses of data and curb the militarized enforcement that you’re seeing under DHS while beginning the process of taking what we call USCIS, that’s also under the Department of Homeland Security, and establishing it as its own separate
civil
immigration system that no longer operates under this agency that could
call Renee Good
,
Alex Pretti
, or
Silverio Villegas
terrorists.
JW:
Thinking about your bill — obviously, Republicans currently control every lever of power, and only a handful of Democrats support abolishing ICE, and fewer still have called to abolish the Department of Homeland Security. Why introduce this bill now, knowing that it likely can’t pass this current Congress, much less get signed by President Donald Trump?
DR:
Every single issue, whether it’s talking about universal healthcare, Medicare for All, whether it’s talking about raising wages — and now I introduced
Living Wage for All
— or blocking bombs and ending endless wars, oftentimes the assumption has been it is too early, or Republicans control, or Democrats have not arrived.
The people have arrived to where we are. They believe that this agency is the biggest threat to their well-being. And for me, this is an opportunity to provide a roadmap on how we actually in fact address the problem and then create a solution that centers people’s safety — and not just rhetoric of protecting the homeland under the guise of protecting us from terrorism, so that they can terrorize us.
Jessica, I am clear that this bill is not gonna pass overnight, but I am also clear that our community
expects for us
to propose something that is tangible, something that is comprehensive, and something that gets to the root of the problem by creating a permanent solution, so that we’re never here again.
“Our community expects for us to propose something that is tangible … that gets to the root of the problem.”
That means that over the next few months, and perhaps over the next year, we are building the support and changing the conversation in such way where in the same way only nine or 10 of my colleagues were
willing to, out loud, say
“Abolish ICE” two months ago, now we have actually more like 45, 50 of them, that we are in the same place when we’re talking about reimagining safety in this country.
I am providing a bill that begins to respond to what our communities are demanding. I’m hoping that Congress doesn’t continue to be behind the ball of what the people are asking of them. And now I’m giving them something that they could actually in fact use.
I wanna tell you too that, look, in 2002, people expressed concerns about DHS. And 25 years later, those warnings have been validated as we watch what they’re doing. It’s a weapon pointed at anyone that the state considers a public enemy, whether it’s
Congresswoman LaMonica McIver
, whether it’s Congresswoman Omar, or the millions of people in this precise moment that are living in fear because of the way that this agency was created.
“We were OK before 2003 without DHS, and we can live in a life without it as well.”
JW:
On the subject of looking to the future, if Democrats take one or both houses of Congress in the upcoming midterms, I’m curious what else you’re thinking about in terms of reining in DHS, and if you have any other priorities for the next session.
DR:
Let me just come back to this bill, ’cause I think it’s really important — my own bottom line on it. The Reimagining Safety Act takes apart DHS and creates a new agency, a new agency that responds to what people are asking for — for we the people that they’ve elected to represent them, to keep them safe, to protect the mission of community safety, and to protect the public.
And it means that dismantling DHS is doing the work Congress should have done actually 24 years ago, to actually look at these agencies, all agencies under this department, but also how DOJ has been
weaponized
against us. How we created a Department of
War
. Just think about that: We’ve created a department where we
want
to
spend more
money
on war
than we want to actually spend on housing, on healthcare, on wages, and on infrastructure.
So for me, this is a moment for us to actually demonstrate that we’re going to fight like hell for accountability, to take on corruption, to end the terror, while also creating tangible ways to address the issues.
And one of those, and I’m going to be introducing a resolution [Thursday] around what should our positioning be when it comes to immigration. Because this agency is about what is wrong and what needs to stop so that we can actually have safety, but then we also need to talk about how we
restore our systems of asylum
,
h
ow we actually in fact
establish legal pathways
, and how do we bring 11 million people who are in fear, in the shadows, crying daily, to finally come out of the shadows into a justice status.
I am gonna be working really hard to make that front and center with our leadership, and I’m disappointed that our leadership isn’t centering that as one of the very first things that they wanna work on in the first 100 days. Because unfortunately, that is telling the people that have been under siege by this administration: Being an immigrant or being brown or being a protester isn’t the top priority of people that need to be protected.
When our leadership is talking about first 100 days of many important things, but not a word around immigration, and not a word around real accountability to what has happened under ICE and CBP.
JW:
Thank you, Congresswoman. We’re gonna leave it there, but people can
read more about your bill
, the Reimagining Safety Act, at theintercept.com, where we have a story out about it. And thank you so much for joining The Intercept Briefing.
DR:
Thank you. Appreciate it.
Jessica Washington:
Next, I speak with
Rozina Ali
, a journalist covering the war on terror, Islamophobia, the Middle East, South Asia, and literature; and
Will Sommer
, a senior reporter covering right-wing media and conspiracy theories at The Bulwark. Will, welcome to the Intercept Briefing, and Rozina,
welcome back
.
Will Sommer:
Thanks for having me.
Rozina Ali:
Thank you so much for having us.
JW:
Rozina, I want to start with you. In your new book, “
Seasons of Fury: Four Families and the Rise of Islamophobia in America
,” you discuss the history of how immigration enforcement has been weaponized against Muslims in the United States. And while I want to preface by saying that there’s still a lot we don’t know about the raid on Congresswoman Ilhan Omar’s home, we do know that Omar is outspoken,
Muslim, Black, and an immigrant
. She’s also been a consistent target of Trump and his allies.
How might this relate to the broader history of how the Department of Homeland Security has been weaponized against Muslims in the United States?
RA:
Well, I really appreciate this question. There’s a very long history when it comes to using immigration enforcement to target Muslims and the Muslim community in the United States, and I just wanna go back a little bit before 9/11 to the late 1990s.
One thing that was happening was the use of secret evidence against Muslim immigrants, a lot of Arabs and South Asians, and a lot of Muslim immigrants, to, essentially, detain them and deport them. And what that meant was actually using classified evidence that the government brought forward that the defendant could not see.
And it actually kind of reminds me of what’s happening with Ilhan Omar now, is that we don’t actually know what the allegations are. We don’t know what the case is hinged on.
What the DHS did after 9/11 was actually broaden out its use of immigration enforcement to target Muslim communities. One of the things it did was actually institute a registry called the
National Security Entry-Exit Registration System
. That essentially allowed the U.S. government to detain thousands of Muslim immigrants and eventually deport them — even though they had no criminal charges.
One of the things that protects Ilhan Omar is that she is a U.S. citizen, but one of the things that does chill me is there is this longer, broader history of the government using immigration enforcement in order to deport people and detain people, even if they have not been guilty of any criminal charges.
JW:
That makes a lot of sense, the concern, because we know there’s history of this power being used in secretive ways, kind of similar to what’s potentially happening now. And I do, again, want to caution that we do not have all the details on this case at the moment. But Will, I wanted to bring you in to kind of get into the origins at least where some of these conspiracy theories that have been swirling around Congresswoman Omar.
You wrote about this
in September
, kind of where you found that many in MAGA world were frustrated that after nearly a decade of conspiracy theories — some of which were
pushed by Trump
about alleged immigration fraud from Omar — she remains not only in the United States, but in Congress.
Will, can you explain some of the conspiracy theories that are fueling this push to deport Omar? Is there any evidence for them? And do we know if they had anything to do with the raid on her home?
WS:
The right has been really eager to denaturalize Ilhan Omar for really going back a decade, almost to the first Trump administration. A lot of it was fueled by this idea that she had married her brother as some kind of immigration scheme, or essentially that this man she was married to was secretly her brother.
Now, I looked into the origins of this at the time. I thought, “Well, is this true? Could it be?” No, it’s not. In fact, it all started on some random kinda Somali Minnesotan message board where someone said, “Yeah, she’s married to her brother.” And then from there, once she became
more prominent
as a
Democratic figure
, people on the right kinda dug through that and sort of built this whole conspiracy theory based off of this one post.
Essentially, now that Trump is back in power, there’s this demand on the right because, as with other conspiracy theories, they’ve come to believe this. So they’re saying, you know, “Oh man, when are we finally gonna deport Ilhan Omar?” So Markwayne Mullin, the head of DHS, has been under this pressure, and he gave this
interview
at the Republican convention to [right-wing YouTuber] Benny Johnson, and he said, “Oh yeah, she married her brother.”
And Benny Johnson said, “Well, OK. Are you gonna deport her?” Now, you kinda can’t deport her anyway, even if she had married her brother. But there’s all this demand. And so what we’re seeing with this latest investigation is it’s not even related to the brother thing, reportedly. It’s — according to the
Washington Post
and some other outlets — related to this idea that Ilhan Omar’s father, who is dead now, misstated her age on a citizenship application.
Essentially, she was 17, according to the official record. But had she been a year older, 18, it would’ve kind of complicate it because she would’ve been an adult. It would’ve made it harder for her to get citizenship. This is this idea that’s been pushed by her Republican opponents in elections in the past. It’s really thin, and we can kinda get into it in a second. But this is some thin gruel, essentially, that they’re trying to manufacture this whole effort to pull her citizenship.
JW:
I really wanna get more into the conspiracy theory of it and what’s being pushed here. And I think it’s interesting that it’s almost like they’re kind of grasping at any little thing they can get their hands on.
At first, it’s the brother-marriage of it all, which, as you pointed out, has very thin evidence, essentially no evidence. And then it’s pulling at these other threads about her dad, which have all been swirling in the ecosystem for a while.
I want to get a little bit deeper into what conspiracy theories, what role they have here, and I want to talk about what Donald Trump said on Monday night after the raid. He spoke at an Ohio rally
pushing more conspiracy theories
about Rep. Ilhan Omar and the Somali community in Minnesota in general. Let’s hear that clip now.
Trump:
Just look at what’s happening in the once great state of Minnesota. What a mess they have done. Somalia, wonderful, wonderful. And that Ilhan, somebody was asking me, I don’t know what they’re doing with her, but I can tell you this: She’s a disaster. She comes in from a country without laws, without police, without military, without — all they do is shoot each other. And she comes into our country, and she says, “I have a constitutional right.” She’s got a constitutional right. She’s telling us about the Constitution, and she comes from one of the worst countries anywhere on the planet. Last week, savage Somali gang members shot two people in the high school parking lot in the middle of a football game. Just days later, a few miles away, the FBI arrested a radicalized Somalian who was planning to carry out an ISIS-style terrorist attack at the Mall of America, aiming to kill as many as possible, in his words. This is not what we want in this country.
Crowd:
Deport! Deport! Deport! Deport!
Trump:
What they have done to Minnesota.
JW:
Rozina, this isn’t the first time we’ve seen the administration spread conspiracy theories about Muslims. Ahead of Operation Metro Surge
in Minneapolis
, for example, we heard
similar rhetoric about the Somali community
. What role have conspiracy theories played in the targeting of Muslims in the United States?
RA:
Oh, where to start?
JW:
Yeah, there’s a lot.
RA:
There is a lot. I think one of the most enduring theories of Muslim communities is that there are radical elements that are living among Muslim neighborhoods, among Muslim communities. And that is a conspiracy theory born out of, obviously, the war on terror framework.
But one of the things that we saw in the aughts, especially under the Obama administration and especially as Trump rose in power, was this notion that Muslims, not just foreign elements, but Muslims living inside the United States are secretly hiding their agenda.
And this is something that we hear with regards to Abdul El-Sayed, that basically any Muslim that you meet is hiding a secret agenda, and what they wanna do is enact Sharia law in the United States. No one has yet to explain what Sharia law means and what that would mean to enact it, but this is one of the things that keeps coming up over and over again.
What is so interesting about this speech that Trump made recently is that he is actually throwing every theory against the wall that he can. That he mentions ISIS — something we haven’t heard for a long time. He mentions radicalization. He mentions fraud. And so all of these things that have been talking points that have been used against Muslim communities, particularly against the Somali community in Minnesota, he is using all at once in this one speech.
“What is so interesting about this speech that Trump made recently is that he is actually throwing every theory against the wall that he can.”
I will say, this is also the talking points — well, fraud is a new one — but when it comes to radicalization and when it comes to the notion of radical elements threatening the security and Western way of life of the United States, these are talking points he was peddling back in 2015 when he eventually called for a Muslim ban.
This is actually something that we see Donald Trump doing a lot, which is, he
peddles conspiracy theories
. He puts them on the main stage. His allies reinforce them and regurgitate them, and he gives them legitimacy, right? He legitimizes them by using a government framework to offer some veneer of truth to them. And unfortunately, as we know, one iteration of the Muslim ban was eventually
upheld by the Supreme Court.
JW:
As Rozina said, fraud is kind of a newer iteration of these kind of Muslim conspiracy theories. Where did it originate from, and why has it become such a powerful talking point on the right when targeting particularly the Somali community in Minnesota?
WS:
I should say: Minnesota has a very — despite being a Democratic state — it has a very intense Republican activist and kind of like quasi-journalist scene going on. And so a lot of that has been built around, again, building, talking about Ilhan Omar. And now we’ve seen it kinda going after the Somali community in various ways.
But really, this hit a new level in January with this young man named
Nick Shirley
, who’s like a YouTuber. He went around, he was
led around
by one of these Minnesota conservative journalist types to various daycares, and they said,”Look at the fraud here.”
Now look, there are some criminal fraud cases that are being
prosecuted
in Minnesota. But there was this broader sense created by this video of, like the Somali community are parasitic, that they’re up to no good, they’re stealing all this money, what have you.
And then in fact, that helped justify then — at least in the view of the Trump administration — the
ICE surge
into
Minneapolis
. And so this has created this idea of constant Somali American fraud, not just in Minnesota, but
all over the place
. And so obviously it dovetails with the Ilhan Omar idea as well, that she forged her citizenship, she somehow faked that.
JW:
That makes a lot of sense. It is really interesting to see the way the administration targeted Minnesota, both because of the Somali community, which was particularly vulnerable, because as we’ve mentioned this is both a Black, immigrant, and Muslim community, so this trifecta of areas that the Trump administration is targeting. And then also you had Ilhan Omar, who was this image that the administration could attack and go after, and it was really popular to their base to do so.
Rozina, when we’re talking about the stories that kind of stick when it comes to conspiracy theories, what sort of stuff has really stuck and why? I’m curious to understand why in the imagination of so many people in the U.S. these conspiracy theories have really stuck.
RA:
I think one of the most enduring theories that keeps coming up over and over again and that really has stuck is this notion that, as I mentioned, that Muslims have nefarious secret agendas, but also that they have ties to foreign organizations and foreign elements.
And one of the things that we hear with regards to Ilhan Omar, too, is that — and I think I’ve heard this from some right-wing talking points in the previous days — is that there might be allegations that she has some financial ties or connections to foreign groups. This is something we have heard about Zohran Mandani. This is something we have heard about
Abdul El-Sayed
. This is actually something that has been a part of the American narrative about Muslims for decades.
One of the crucial things that was happening in the ’90s was that the U.S. government was looking for financial ties to foreign organizations among the Muslim community. And one of the things that happened immediately after 9/11 was that the United States government shut down the
biggest Muslim charity in the United States
, called the Holy Land Foundation, because of alleged nefarious ties to militant groups abroad.
Because there has been a government framework for this, I think it is really easy for a lot of conspiracy theorists and for a lot of Islamophobes, frankly, to keep regurgitating this notion that “just look at the financial ties of Muslims.” And one of the lasting shifts that we have seen in the last 25 years is that that scrutiny is not just against Muslim immigrants or visa holders, but also against Muslim Americans and citizens of the United States. And I don’t think we’re actually going to be able to break out of those conspiracy theories so easily if we don’t actually start discussing and reckoning with how we think about what terrorism is.
So for example, with the
Holy Land Foundation case
, that is a case that keeps coming up over and over again. A lot of those ties, financial ties, it’s a really complicated case, but a lot of those financial ties were related to Hamas, but it’s also relevant to remember that Hamas at the time was a governing body in Gaza that was supplying aid to people.
And essentially, the way we talk about terrorism, the way we talk about countries abroad, has a real impact for how we think about the Muslim community at home. So I just wanna go back to Abdul El-Sayed for just really quickly, is that one of the biggest talking points peddled against him these days is that his mother is
connected to the Muslim Brotherhood
.
Now, there’s very little understanding of what it had meant to be a supporter of the Muslim Brotherhood in Egypt, right? Because we just see that through the lens of terrorism, it’s completely dismissing all the political dynamics on the ground in those countries abroad. And I think what a lot of conspiracy theorists and Islamophobes have done so effectively is forever tie Muslim communities in the U.S. to what Americans largely think of as nefarious elements in other countries.
JW:
I think that’s all really important, recognizing, to your point, that none of these conspiracy theories — I mean, again, they had taken new iterations — but that conspiracy theories against Muslims in the United States is not a new phenomenon. I guess I am curious if we’re moving into a new phase though, of danger, essentially, from the administration.
Will, coming back to your September piece, in it you compare the calls to deport Rep. Ilhan Omar to the Department of Justice’s attempts at convicting the president’s
political enemies
. And those have, for the most part failed, in terms of getting these convictions, “locking up” his enemies, as he’s said he wants to do.
Does this raid of a sitting congresswoman’s home signal a new, more dangerous era from the White House when it comes to threats against the administration’s perceived political enemies? Are we entering a new, more dangerous phase?
WS:
I think the raid represents sort of the confluence of two alarming trends. One is what we’ve been talking about, which is the growing, second tide of Islamophobia that we’re seeing from this administration, that I think was sort of on the back burner as there was so much
promotion on the right
about
fears about immigration
from Latin America. Now, we see in Texas there’s so much
anger at Muslim communities
in that area in particular.
We’re also seeing though, as you said, the politicization of the Justice Department. I mean, this raid falls within the 60 days. Typically, the DOJ doesn’t raid politicians this close to an election, particularly something that’s about a 30-years-old child immigration case. Clearly, it’s political. It’s an attempt to make Ilhan Omar the face of the Democratic Party, suggest all this fraud.
Look, a lot of those attacks, those political lawfare, what have you, is related to Israel and Palestine, people like
Fergie Chambers
, Max Blumenthal, have either faced indictments or had their
devices seized,
in
Max Blumenthal’s case
. Certainly a lot of it aimed at campus activists as well.
I think the Ilhan Omar thing is really one of the most striking examples we’ve seen of how the Trump administration is willing to use law enforcement to achieve its political aims and to threaten its enemies.
“The Ilhan Omar [raid] is one of the most striking examples we’ve seen of how the Trump administration is willing to use law enforcement to achieve its political aims and threaten its enemies.”
JW:
You mentioned that post-Watergate 60-day rule, which is an unwritten policy designating a blackout period effectively before elections during which the Department of Justice is not supposed to conduct activity which could influence voters. There’s also the Hatch Act, which states that government employees cannot use their authority or influence to interfere with or affect an election. There was actually a
Hatch Act complaint
filed yesterday by a watchdog group over the raid on Ilhan Omar’s house.
At this point, Will, with an administration that has already done so much over the years without consequence, does the Hatch Act and do these other kind of long-standing norms serve any purpose or any protection?
WS:
No. At this point, unfortunately, I think the Hatch Act is a dead letter in terms of, no one’s gonna enforce it, at least until Democrats retake some kind of power. Look, the
administration is using government money to buy political ads
, outright political ads. And so certainly, I think they’re going to unfortunately be able to get away with things like raiding a congresswoman’s house.
I think really it’s just become, the idea that they would use Justice Department or DHS to achieve political aims is just understood now that that’s something Trump is gonna do.
JW:
And Rozina, from your perspective, does this raid to you signal a kind of new, more dangerous era, for not just the president’s political enemies, but also disfavored groups?
RA:
Yeah, I want to just go back specifically to the Somali community living in the United States. It is telling that President Trump disparaged the country of Somalia as he also
bombs this country
with hundreds of
airstrikes
in the past year alone, displacing more people and causing more people to search for refuge abroad.
We mentioned the ICE Operation Metro Surge in Minnesota last December. Trump was talking about the Somali community in Minnesota, and ostensibly fraud was the reason, one of the reasons, for which he sent ICE agents into the city.
One of the things that the government learned very quickly was that a lot of Somalis living in Minnesota
are actually citizens
. They are naturalized or that they were born here, and they could not be easily picked up and detained or deported, even though there were some who were. Yet what happened in the months after Operation Metro Surge was that it really
chilled the Somali community living in the city
. Even though there were so many people who did go out and protest and help each other, there were a lot who basically
stayed at home
. And I actually spoke with several people who would not leave their house for months.
Now, one of the things that really frightens me about what the DOJ and DHS did with regards to Ilhan Omar is that it is actually expanding the war against Somalis. It’s now seeing ways in which to not just frighten asylum-seekers and refugees and visa holders, but also naturalized citizens.
“What this administration has done so effectively is actually telling everyone that there are some communities who are no longer protected the way they used to be.”
And I think what this administration has done so effectively is actually telling everyone that there are some communities who are no longer protected the way they used to be. And we saw that also in the context of, for example, the arrest of
Mahmoud Khalil
and pro-Palestine protesters. We are seeing a level in which government is used to target people who before would have protections from the government, and now they are being told that they are actually vulnerable.
And Ilhan Omar, it’s possible that nothing comes of this raid, and things will just go back to normal. But what worries me is the larger chilling effect on the community, including now naturalized citizens.
JW:
Trump aside, the Trump administration aside, Rozina, is this just the logical endpoint of effectively decades of crafting a federal domestic surveillance and police state that is laser-focused on immigrants and Muslim Americans?
RA:
Yes, it is, right? One of the things that has happened over the 20, or last 25 years has been one immense power that has been concentrated in the executive branch. This notion that when it comes to national security, the government has a lot of leeway to violate people’s civil rights But the other thing — one of the other enduring legacies of the last 30 years — is precisely what the American public is willing to accept.
“We have been conditioned to believe that Muslims … are not just a threat to national security, but a threat to American way of life.”
And over the last 30 years, we have been conditioned to believe that Muslims, and now more broadly immigrants, are not just a threat to national security, but a threat to American way of life.
And again, Trump is able to throw everything — when it comes to Ilhan Omar and the Somali community — throw everything at them. They’re a threat to national security. They are threatening how we live in this country. They are threatening what it means to be American. They are taking away our money and our dollars, and he is using all of these talking points to help build up public support for this agenda against the Somali community. I don’t think such a blatant targeting and explicit targeting would have been met with such support even in, for example, October or November 2001.
JW:
I think those are all very good points. I hate when people say this is the only form of acceptable bigotry, because I can frankly say that there are many forms of acceptable bigotry. But the extent to which Islamophobia is a part of American culture is accepted, I think is not just troubling, it’s decades of conditioning, as you’ve pointed out. It is decades of feeding these conspiracy theories, of repeating them until they feel almost natural to so many of us.
But I want to give you both an opportunity to just share any final thoughts. Will, I want to start with you. Is there anything else that you’d wanna add?
WS:
As this case goes forward, it’ll be interesting to see what it looks like. But the idea that Ilhan Omar lied about her birthday or whatever is all based on, there was this one congressional website that said she was born in 1981 instead of 1982. And so Republicans have seized on this. Look, it’s one website, right? I looked in the court records, all this stuff. Before she became famous, she was listing her birthday as 1982, all this stuff. And so if that’s gonna be the crux of it, that one website had a typo, I don’t think the administration’s gonna have a lot to run on here.
JW:
There’s very thin evidence for some of these conspiracy theories, although people will take very thin evidence and run with them. Rozina, any final thoughts from you?
“What does this mean for denaturalization efforts across the board?”
RA:
I agree with Will, I don’t think that the government has that much to go on. It seems to be very thin evidence. But again, it is government resources that are being used to basically go on a, what appears to be for right now, a witch hunt. But again, what worries me is the more lasting effects of this, which is, what does this mean for denaturalization efforts across the board? And there seems to be not just support for it, but also a deliberate desire to run with such an agenda.
JW:
And we’re gonna leave it there. But Will, Rozina, thank you both so much for joining me on The Intercept Briefing.
WS:
Thank you.
RA:
Thank you.
JW:
That does it for this episode. We wanna hear from you. Tell us what you’re following or want to see more coverage of. Email us at podcasts@theintercept.com, or leave us a voicemail at 530-PODCAST. That’s 530-763-2278. This episode was produced by Andrew Stelzer. Laura Flynn is our supervising producer. Jordan Uhl is our social media producer.
Ben Muessig is our editor in chief. Maia Hibbett is our managing editor. Nara Shin is our copy editor. William Stanton mixed our show. Legal review by David Bralow. Slipstream provided our theme music. This show and our reporting at The Intercept do not exist without you. Your donation, no matter the amount, makes a real difference.
Keep our investigations free and fearless at theintercept.com/join. And if you haven’t already, please subscribe to The Intercept Briefing wherever you listen to podcasts. Do leave us a rating or review. It helps other listeners find our reporting. Until next time.
Japanese people still aren't having sex. And nobody knows why
Young adults in Japan are having less and less sex, according to a
recent review
– and we don’t know why.
The review estimated that around half of Japanese people reach their mid-twenties with no sexual experience at all, and approximately 10 per cent reach their 30s before having sex.
Even those who have lost their virginity don’t seem to be having much sex. Online surveys from the 2020s indicate that around half of Japanese adults aged 20–49 are sexually inactive, meaning they haven’t had sex in the past year.
And this national dry spell seems to have got worse in recent decades, with rates of sexual inexperience and inactivity both increasing since the millennium.
In comparison, just over one in three Japanese adults aged 20–24 reported being sexually inexperienced in 2002. By the 2020s, online survey data indicates this may have risen as high as 60 per cent of men and 51 per cent of women in the same age group.
At least, these are the conclusions of a review of Japanese sexual attitudes and behaviours, published in
The Journal of Sex Research
.
The study’s authors trawled through 38 publications, based on 43 surveys on sexual trends in Japan from 1974 to 2024, mostly in a heterosexual context.
Among their findings were the rise of sexlessness within marriage, and the popularity of pornography and the services of sex workers, especially among men.
For instance, in some surveys from 2008 to 2024, up to 60 per cent of Japanese men said they had previously paid for sex.
In high-income countries all over the world, young adults seem to be having less and less sex. For example, a
2019 study
reported that nearly a third of their UK respondents said they hadn't had sex in the previous month, compared with around a quarter in 2001.
But the authors of this study wrote this issue was particularly pertinent in Japan, where “sexual behaviours are often described as a puzzling and contradictory mix of permissiveness and expectations of discretion.”
While they couldn’t be sure why Japanese adults were having so little sex, the authors did suggest some possible explanations.
One was that they just didn’t want to. A 2020 online survey indicated that 20–30 per cent of men aged between 20 and 39 years said they didn't want to have sex, as well as around 40 per cent of women in both age groups.
Perhaps, the authors suggested, unmarried adults in their 20s and 30s were unwilling to waste time and money on dating people they might not marry.
Japanese society is still overwhelmingly heteronormative, the study authors wrote, with limited acceptance and visibility of non-heterosexual identities. Very few survey participants identified as homosexual, sometimes as few as 1.5 per cent - Credit: Getty images
And, for women particularly, the idea of marriage might not seem so appealing, in a culture where they were expected to bear most of the responsibility for household chores.
Plus, the authors continued, Japanese adults did not seem so embarrassed about virginity and abstinence, compared to adults in countries such as the US or UK.
And other outlets for sexual desire were more acceptable, for example fictosexuality: the expression of romantic or sexual feelings towards fictional characters.
A 2017 survey of Japanese students aged 16–22 found that 14–17 per cent of them admitted to having romantic feelings towards a character in a video game or anime.
At the same time, the authors wrote that a demanding work culture, with long hours and commutes, may make it difficult for young adults to form and maintain sexual relationships. In Japan, around 30 per cent of men and 15 per cent of women work for more than 50 hours per week.
Also, sex education in Japan was limited, very few women used hormonal contraception, and there was limited acceptance of non-heterosexual identities.
Dr Vanessa Apea
, a consultant physician of sexual health at Barts Health NHS Trust – who was not involved in this research – told
BBC Science Focus
that the study was “striking” for what it revealed about the shifting priorities of young Japanese adults.
“Rather than a decline in desire, the evidence points to broader social and economic influences at play; long working hours, job insecurity, evolving gender roles, and a cultural emphasis on stability before partnership,” said Apea.
“While sexual frequency is also falling in the UK and US, Japan’s pattern feels more pronounced – perhaps an early signal of a global shift where technology, work culture, and modern expectations are quietly redefining how we connect, form relationships and experience intimacy.”
However, Apea urged for caution with this study’s results, because its data came from a wide range of surveys where participants may have defined their sexual experiences differently.
Tesla unveiled
its long-anticipated Roadster on Thursday during a dramatic event in which the vehicle used compressed-air thrusters to fly off a ramp and perform a midair maneuver.
The vehicle was seen flying, performing a midair flip and accelerating from zero to 60 mph in under a second.
"Turns out the future does have flying cars," Tesla and SpaceX CEO
Elon Musk
said at a SpaceX test site in McGregor, Texas.
Vice President of Vehicle Engineering Lars Moravy added, "Flying cars are real."
Tesla officially unveiled its redesigned, next-generation Roadster on Oct. 15, 2026, during a dramatic livestreamed event at a SpaceX test site in McGregor, Texas.
(Tesla/X)
The jaw-dropping showcase featured the new Roadster accelerating up a massive curved ramp and using a fan-based suction system to remain attached until it was completely upside down before using integrated cold-gas thrusters developed in collaboration with SpaceX to launch off the ramp, flip in midair and land safely back on the ground.
In another demonstration, the Roadster launched over a lineup of cars and a semi-truck, performing a midair flip before landing safely on the other side.
Musk said certain versions of the Roadster can accelerate from zero to 60 mph in less than one second and reach a top speed of more than 230 mph. During the event, Tesla demonstrated a Roadster accelerating to 60 mph in under a second.
Tesla CEO Elon Musk introduced a flight demonstration Thursday in Texas of a next-generation Tesla Roadster electric vehicle performing a "kick flip" over other Tesla vehicles.
"Every car on the road today is limited by one thing: tire grip Roadster's thruster system generates 4–5x the force the tires can. More force on the same mass means significantly better acceleration – physics does the rest," Tesla said on X.
Nearly a decade after the Roadster's initial 2017 concept debut, the vehicle left audiences in awe with the gravity-defying demonstration that deployed SpaceX’s rocket technology.
"Today, Roadster presents a new moment in history – the best of the last human-driven cars," Tesla wrote on X.
Tesla executives announced at Thursday's event that production would begin in 2028.
Tesla's next-generation Roadster launched over a lineup of cars and a semi-truck, performing a midair flip before landing safely on the other side.
(Tesla/X)
Musk and other Tesla executives did not outline the cost at Thursday's event, but nearly a decade ago, the company quoted a base price of $200,000.
Tesla's reservation page for the Roadster after Thursday's event listed a $50,000 reservation payment for the "Performance" version and a $250,000 reservation payment for the "Thrust" version, which features "acceleration thrusters." An invite-only "Rocket" variant is a single-seat model with a "full flight system."
When Tesla revealed a
prototype of the car
in 2017, it said that deliveries would begin in 2020.
A common requirement when handling an effect is to depend on some state outside the computation raising the effects.
For example an
Increment
effect needs to track the current count.
Or in testing a handler for
StandardOut
might build up a state consisting of all messages written.
Below is the implementation of a single stateful
Increment
effect.
Each handle expression applies to a single effect label.
Handlers can be nested to handle multiple effects but care needs to be taken to manage the same state between multiple handlers.
This is part of the design to keep the type system simple, though the restriction might be relaxed in the future.
If you want more than one effectful operation you have two options.
A generic stateful effect
let with_counter = (initial, computation) -> {handleUpdate( (transform, resume) -> { (state) -> {let state =transform(state)resume(state)(state) } }, (_) -> { let value =computation({})let finish = (count) -> { {count, value} } finish } )(initial)}let increase = (amount) -> {let _ =performUpdate((state) -> { !int_add(state, amount) }) {}}let get = (_) -> {performUpdate((state) -> { state })}with_counter(0, (_) -> { let _ =increase(3)let value =get({})let _ =performStandardOut(!int_to_string(value))let _ =increase(2)!int_to_string(value)})
This counter value can be increased and retrieved.
The functions
get
and
increase
are the public interface to the stateful operation.
A generic
Update
effect takes a transformation from the current state to the new state.
The generic approach is only possible if you control the design of the effects which is not always possible.
For example we might want to test a library with the
Get
and
Increase
effects.
In that case effects can be bounced to a new effect which you do control.
let with_state = (initial, f) -> {// Generic State effect owns the shared state.let run =handleState((update, resume, state) -> {let state =update(state)resume(state)(state) }, (_) -> {// These handlers translate operations; they do not hold separate state.let value =handleIncrease((amount, resume) -> {let _ =performState((state) -> { !int_add(state, amount) })resume({}) }, (_) -> {handleGet((_, resume) -> {let state =performState((state) -> { state })resume(state) }, f) })let finish = (state) -> { {state, value} } finish })run(initial)}with_state(0, (_) -> {let before =performGet({})let _ =performIncrease(2)let middle =performGet({})let _ =performIncrease(-1)let after =performGet({}) [before, middle, after]})// {state: 1, value: [0, 2, 1]}
Returning functions
Type checking the following will fail with the error
this expression has a recursive type
.
let main = (_) -> {let f =performGet({})f("")}main({})
Why this fails is not immediately obvious.
The type of
f
appears in the reply type of the
Get
effect row of the
main
function.
When
f
is called its effects are unified with the effects in the current function block, i.e. the
main
block.
This results in a recursive type trying to be constructed.
It is recommended not to return functions from effects because of this.
Penguin Colony review – an Antarctic odyssey of Nazis and Lovecraftian horrors
Guardian
www.theguardian.com
2026-10-16 05:00:57
PC; Origame DigitalThis odd but absorbing adventure sends you waddling across Antarctica in search of an eldritch entity – uncovering a world far stranger than it first appears A Nazi kneels down on frozen snow, staring at an endless Antarctic horizon. Another holds a gun to his head, ready to end ...
A
Nazi kneels down on frozen snow, staring at an endless Antarctic horizon. Another holds a gun to his head, ready to end his own life. I direct a small waddling penguin up to them, trying to imagine what it could be thinking. Dismay, perhaps. Likely bewilderment. But then a faint smile seems to break out across its beaky face, as if amused by these silly humans and their misguided belief that they could ever best this howling, harsh landscape.
For most games, the idea of playing as a penguin observing Nazis losing the plot near the south pole would be weird enough. But Penguin Colony, developed by Origame Digital, pushes further. This is an audacious, frequently brilliant retelling of HP Lovecraft’s 1936 novella At the Mountains of Madness, in which eldritch horrors are just as common as Nazis. Further weirdness abounds: the many collectibles scattered about this place are not shiny gold objects à la Super Mario or Sonic. Rather, they are words. So tottering about as a semiaquatic bird, you have a unique mission: collect human language.
But let’s zoom out for a moment because playing Penguin Colony is more straightforward than this description suggests. First and foremost, it is a semiopen world exploration game in which you direct a penguin to the same unearthly entity that the Nazis are chasing. You hop, swim and glide about tummy-first, chewing up miles of frozen wasteland like an indefatigable snowboarder. Tapping a button next to another penguin lets you swap into its body. Some of these, like the rockhopper penguin, are nimble movers, capable of jumping especially high. Fluffy penguin chicks, meanwhile, can squeeze through tiny gaps.
At first, the game’s polar levels are straightforward: snow drifts and ice floes peppered with the remnants of human habitation such as fishing huts. But your surroundings quickly grow stranger: supersized stone labyrinths whose architectural splendour evokes
Dark Souls
, alien-looking obelisks and abyssal crevasses. Everything in the world is rendered in jagged, low-poly graphics, looming from the screen like a hallucinated PlayStation 2 game.
As you navigate these spaces, a deep-voiced narrator relays the expedition of a scientist from decades before. It’s clear he is driven by the same hubris and racism as his Nazi successors.
The layering of space, time and narrative is terrifically unsettling. At one point, having just hopped my way through a challenging platform section, I came across a Nazi cannibal feasting on his fellow soldier as a researcher delivered yet another verbose pontification on his God-given right to plunder Earth’s southernmost tip. At times, jarring cuts to archive footage and what seem to be Indigenous art interrupt the low-poly action. My head was often spinning, trying to reconcile all these conflicting, contrapuntal elements. Better, I found, to let go and soak up the unnerving, discordant whole.
Penguin Colony is a little uneven technically: I experienced a small number of audio glitches and, at times, bugs with the controls. Yet this does not overly detract from an experience that builds to an incendiary conclusion: a takedown of Lovecraft’s racism and Nazi barbarism while also, intriguingly, inviting the player to see the world in newly reenchanted terms.
This latter point is made with aplomb at the game’s end: a spectacular cosmological map that details everything you discovered on that playthrough. More tantalisingly, it shows you all the things you missed. This reveal is liable to induce a feeling of vertigo and wonder: Penguin Colony, one of 2026’s boldest, most original games, is far bigger than it first lets on. To access all of its secrets and excavate all of its meaning, one must think and act less like a human mainlining towards their objective. On the contrary, you must embrace the spirit of a renegade penguin, waddling carefree towards whatever piques your interest: atrocity, beauty and all.
Long After the Maui Fires, Toxic Metals Linger in Residents’ Bodies
Intercept
theintercept.com
2026-10-16 04:45:00
The toxic exposures didn’t begin with the flames. Researchers are examining how fires affected a community already harmed by plantation agriculture, development, and colonialism.
The post Long After the Maui Fires, Toxic Metals Linger in Residents’ Bodies appeared first on The Intercept....
In August of 2023,
a series of wildfires broke out across Maui, killing more than 100 people, destroying thousands of homes, and causing billions in damage. Noelani Ahia, who is Kanaka Maoli and co-founder of Maui Medic Healers Hui, helped mobilize nearly 600 volunteers in Lāhainā, including doctors, nurses, and therapists.
Three years later, the housing and health crises remain acute. Maui Medic Healers Hui runs a free clinic, but Ahia wishes it had 10 more to address the community’s needs. “The fire may be out, but the catastrophe is not over by any stretch of the imagination,” she said.
The devastation extended well beyond the lives lost and buildings destroyed. Research published last year by researchers with the University of Hawaiʻi at Mānoa’s Maui Wildfire Exposure Study, or MauiWES, found that
more than 1 in 5 residents
had reduced lung function.
Now, new research from the same project has found
elevated levels of toxic metals
in the island’s residents months after the fires, with higher exposure associated with impaired lung function. The findings offer further evidence that the
health consequences of catastrophic wildfires
can persist long after the flames are extinguished and the smoke clears.
“What we consider and sometimes look at as a one-time event isn’t really one-time anymore,” Alika Maunakea, who is Kanaka Maoli and co-director of MauiWES, told Grist.
Researchers don’t yet know how much of the contamination came from the fires and how much was already present in the environment. That distinction matters as wildfires increasingly race through towns like Lāhainā and cities like Los Angeles, where burning homes, cars and infrastructure can
leave contaminants
that
people encounter for months
or years afterward.
“We have traditionally thought about wildfire exposure primarily through the lens of smoke,” Maunakea said in a press release. “But when an entire community burns, we are dealing with a much more complicated exposure environment.” Researchers must also understand what contaminants were already present, what the fire may have released, and what entered residents’ bodies, he said.
The research, which studied 1,400 adults across Maui six to 18 months after the fires, measured 24 metals in urine samples. It found that participants had higher concentrations of several metals than people in a nationwide health survey conducted before the fires. That included 2.2 times as much arsenic, 2.3 times as much barium, and 3.8 times as much manganese. Antimony, which is used in flame-retardant materials and has been previously
linked to lung irritation, stomach pain, and other symptoms
, was found at levels nearly 40 times higher.
Community members hold hands in a prayer circle at a ‘Lahaina Strong’ gathering on Oct. 6, 2023 in Lahaina, Hawaii.
Photo: Mario Tama/Getty Images via Grist
Because the researchers lack comparable data from before the fires, they could not determine how much of the metal exposure resulted from the disaster. Maunakea told Grist answering that question is the next step for the project, which has received a $3.6 million grant from the National Institute of Environmental Health Sciences. That work will include investigating whether and to what degree past agricultural and industrial activity contributed to the contamination.
“It’s important to realize that these are all part of settler colonialism,” Ahia said. “So what we’re looking at is confounding factors that are to the detriment of the health of our local people.”
Decades of plantation agriculture altered water systems, introduced herbicides, and displaced native plants, leaving a legacy on the islands that is still felt today. Disasters like fires and storms can compound those ongoing environmental problems.
“If we begin the story when the fire starts, we miss the decisions that shaped the landscape and the community’s ability to respond,” said Katie Kamelamela, who is Kanaka Maoli and an assistant professor at Arizona State University based in Hawaiʻi. “Micro climate change acts on places already shaped by histories of land ownership, water diversion, development, and unequal access to resources.”
Kamelamela said true recovery must look beyond the fire. “I want recovery to be measured by whether people can remain in their communities, care for ʻāina, and pass on their knowledge and practices in place,” she said, using the Hawaiian word for land, which carries deeper meaning and relationship than property or mere place. “Rebuilding should not recreate the same conditions that left people at risk. Caring for ʻāina and caring for people need to be funded and planned together.”
Maunakea said the multitude of intersecting pressures is one reason why he wanted to pursue this research. As climate change continues to accelerate, long-standing issues facing Native Hawaiians like housing, the harms of tourism, and the legacy of plantations can amplify problems. “We worry that disasters like this that we experience on Maui, as well as the floods and other storms that we’re experiencing now, is just going to continue widening the gaps in health disparities that already exist in those populations,” he said.
Moving forward, the project will not just identify health risks but also help residents respond to them. Study participants receive their results, discuss them, and meet with health professionals. “People now know that there’s these types of potential hazards, and what to do about them is a big concern,” Maunakea said. “We still don’t have all the answers for sure, but we are taking the next steps to get a better picture and inform our community around it.”
Microsoft: October Windows update may break Smart App Control
Bleeping Computer
www.bleepingcomputer.com
2026-10-16 04:44:22
Microsoft says some users may have trouble turning on Smart App Control after installing this month's KB5127648 Windows 11 security update. [...]...
Microsoft says some users may have trouble turning on Smart App Control after installing this month's KB5127648 Windows 11 security update.
Smart App Control is a Windows 11 security feature that uses Microsoft's app intelligence services and code integrity features and works alongside Microsoft Defender and SmartScreen to block potentially harmful apps or binaries.
According to the company, on affected devices running Windows 11, version 24H2 and later, the Smart App Control option is grayed out and cannot be toggled.
"After installing this update, some devices might be unable to turn on Smart App Control in the Windows Security app if it has been turned off. On affected devices, the option to turn on Smart App Control might be grayed out," Microsoft said in an update to the
KB5127648 advisory
.
"Devices where Smart App Control is already turned on are not affected and remain protected."
While a fix isn't available yet, Microsoft shared temporary workarounds to help IT administrators mitigate the issue on enterprise-managed devices by modifying the registry or installing a group policy.
To restore the ability to turn on Smart App Control on affected Windows 11 devices by editing the registry, you have to follow these steps:
Open a Command Prompt window by typing
cmd
in the
Search
box.
Select Run as Administrator.
At the command prompt, enter the following commands and then restart the device:
IT admins can also work around the issue by installing and configuring the two Group Policies below to turn on Smart App Control and ensure that logging is enabled for troubleshooting:
Feel free to tell what you plan on doing this weekend and even ask for help or feedback.
Please keep in mind it’s more than OK to do nothing at all too!...
Going to a
local(ish) Nix meetup
on Saturday, though I haven't used Nix for much other than devshells and configuring my system lately... maybe I'll learn something new!
On Sunday I suppose I might get some work done on
rawrxd
. I'm learning a bunch of stuff about compression and making some decent progress lately, I'm enjoying it.
Also I'll be searching on ebay and local marketplace websites for a decent motherboard with enough SATA ports that'll fit the i3-9100 I just bought for 15 euros, since the motherboard I was looking to get has been nabbed before I could make an offer. I'll be using those to build a home server to replace my Pi.
BAE Systems cyberattack disrupts US federal court operations
Bleeping Computer
www.bleepingcomputer.com
2026-10-16 03:37:35
The Administrative Office of the US Courts says a cyberattack on government contractor BAE Systems has taken down the notice system used by federal bankruptcy courts. [...]...
The Administrative Office of the US Courts says a cyberattack on government contractor BAE Systems has taken down the notice system used by federal bankruptcy courts.
In a Thursday press release, the Administrative Office of the US Courts said the BAE Systems cyberattack also halted the production and distribution of bankruptcy notices.
"The Administrative Office of the US Courts has been in communication with the impacted courts and is also coordinating with BAE Systems. BAE is actively investigating this incident and working to restore operations,"
it said
.
"As a result of the incident, all access to the BNC systems and websites that BAE operates on behalf of the Judiciary and the related bankruptcy noticing process are unavailable at this time, including bnc.uscourts.gov, bankruptcynotices.uscourts.gov, notices.uscourts.gov, and the National Creditor Registration Service."
BAE Systems is Europe's largest defense contractor, designing and manufacturing military technology for the UK and US defense departments, and a major provider of enterprise IT, cloud infrastructure, and cybersecurity services to military, intelligence, and civilian government agencies worldwide.
US Courts and BAE Systems spokespersons were not immediately available for comment when BleepingComputer contacted them earlier today for more details on the attack.
The US Federal Judiciary, the independent judicial branch of the US federal government, also
said last year
that it was strengthening cybersecurity defenses after a cyberattack impacted its electronic case management systems.
The federal Judiciary added that while most documents in the system are public, it now protects certain sealed filings containing sensitive information with stricter access controls designed to block attackers.
"The federal Judiciary is taking additional steps to strengthen protections for sensitive case documents in response to recent escalated cyberattacks of a sophisticated and persistent nature on its case management system," it said.
While the agency stopped short of confirming a breach of confidential documents,
a Politico report said
at the time that hackers had breached CM/ECF electronic case management systems and the PACER federal court document management platform, gaining access to sensitive data (including the identities of confidential informants).
Insider trading is illegal in the stock market for a simple reason: it works
too
well. If you know the drug trial failed before the announcement does, you can't lose. So it’s banned, and people go to prison for it.
But there's a version of it that’s legal.
I’ll use an example to illustrate first. Take Nokia, the biggest mobile phone company in the ‘90s. When the iPhone came out in 2007, Nokia's engineers internally knew their phones couldn't compete with the iPhone - their software and hardware were years behind.
The outside world had no idea. To analysts and headlines, Nokia was
still
the giant of the industry and the iPhone was just a new entrant. But the people working at Nokia
really
knew how bad the situation was. In other words, they were holding exactly what an insider trader holds:
information the market doesn't have yet
(that “
Nokia is screwed!
”).
A few of them “traded” on it. They retrained, and moved to Apple and Google while Nokia on a resume still opened doors. Instead of trading money, they “traded” their careers. But the mechanics are the same - they knew something early because they were internal employees, and used it to do something about their careers.
Most did nothing. They waited for the information to become public and when Nokia's phone business was gone by 2013, everyone hit the job market at once - which was way harder.
My point is: If you’re working at a company, you probably know more about the state of your company, your industry, and yourself than other people. But are you
using
that information?
🤔 What "using it" actually looks like
Lemme give you three situations where people hold an edge and sit on it:
Things are bad, but you don’t act because of comfort
: This is the Nokia situation. The product hasn’t really improved, or it’s being eaten by AI, the best people are leaving, and there are constant reshuffles. This is useful info: you’re seeing issues before management decides layoffs are necessary. In software, it often looks like the roadmap being rewritten every quarter, the engineers who built the core system quietly leaving, or a migration that’s been “nearly done” for two years. “Using it” is getting closer to the faster-growing competitors, or building new skills - like the people who left Nokia early.
Move closer to the “good”.
Say there’s an initiative at your company that’s doing very well. That’s inside information too. “Using it” means getting closer to that good, before it becomes the official center of the company and gets super competitive. In tech, that might be the internal platform other teams keep asking to use, or the small AI project whose usage keeps climbing before anyone’s announced it.
If you’re job searching:
Most people apply to jobs based on big brand names, even though they aren’t necessarily the best companies. Use your own experience to build your search around where the opportunities are.
Almost everyone has that gap between what they know and what they're doing about it - it’s normal! I want to dig into why.
Why nobody “trades” it
We don’t act on stuff like this because we’re often waiting for one of three confirmations: the numbers to show it, someone official to say it, or the move to finally feel justified.
The numbers arrive late.
This is why most of Nokia’s engineers didn’t leave even though the writing was on the wall. Nokia had a record year in 2007, the year the iPhone came out. It just took time for the numbers to catch up. The cracks you see now show up in 3-4 years.
People wait for confirmation, and confirmation never comes.
Researchers who studied Nokia's collapse found that middle managers were afraid to pass bad news upward. Execs had a reputation for shooting messengers, so at every layer of the company, reports got a little more optimistic. "We're in serious trouble" left the engineering floor and arrived at the top as "we're on track."
And the feeling of "now it's justified" comes last.
Think about what "justified" actually means — it means the situation has become obvious enough that anyone would agree with you. But at that point it's not “inside information” anymore because everyone knows it. The edge was when the move was still a bit early.
🔍 If your read is fuzzy
If you're unsure what you know, here are a few things you can run that no outsider can.
Customer energy:
Do customers still love the product the same way, or have things changed?
Pivot speed
: When something clearly isn't working, does it get killed in a quarter, or does it limp along for two years? This tells you how fast your company admits mistakes — and companies that admit mistakes fast handle big shifts (like AI) much better.
And the big one right now: AI.
Every company is currently figuring out how much of its work AI changes — and the official story about how that's going is the most delayed, most softened information in the building, for all the reasons above. Your inside view is far better.
Check whether leadership personally uses AI — not sponsors it, actually uses it, on their own work. It's hard to make good decisions about something you've never touched (imagine a CEO setting mobile strategy in 2008 who had never held a smartphone). If you’re an engineer, the quick version: are the people mandating AI coding tools actually using them on real work, or just announcing them?
You can also see how AI is landing on your own role: which parts of your job it's already doing, which parts it can't touch. For a fast, structured read on that, get your AI impact map — enter your LinkedIn, and it maps where AI is landing in your specific role.
One honest caveat: insiders get it wrong too. Plenty of smart people were sure Nokia’s next phone would turn things around, and in hindsight everything looks more obvious than it felt at the time. That’s why the trade doesn’t need to be dramatic.
Career trades are usually small. If things feel bad internally, the trade is spending your learning hours on the skill you'd need at your next role, and taking the occasional recruiter call while you still have a job.
If something's working, the trade is getting closer to it now — a coffee with someone on that team, volunteering for a piece of it — before it becomes official and everyone wants in.
If you're job searching, the trade is aiming your search at the corner of your industry you know is growing, instead of the famous names everyone else applies to.
Sometimes the trade is realizing you're in a good spot
. Many companies pass these checks fine — the product's improving, good people keep joining, bad projects get killed. If that's what you find, great: you can ignore the scary layoff headlines about your industry, because you have better information about your own employer than any journalist does.
Pornography with strangulation and incest to be banned in England and Wales next month
Guardian
www.theguardian.com
2026-10-16 03:09:49
Campaigners welcome legislation which follows recommendations by 2025 review into pornography regulation Pornography that depicts strangulation and incestuous relationships will be banned in England and Wales from early November, the government has announced. The content will be outlawed from 6 Nove...
Pornography that depicts strangulation and incestuous relationships will be banned in England and Wales from early November, the government has announced.
The content will be outlawed from 6 November after cross-party pressure prompted ministers to announce new legislation earlier this year.
Online pornography depicting strangulation or suffocation, sex between people who are related or pretending to be related, or when somebody is pretending to be a child under 16, will be illegal.
The justice minister Alex Davies-Jones said: “This isn’t about criminalising harmless sexual preferences. But porn can shape what people think a healthy relationship looks like, especially young people.
“Content that normalises, or even glorifies, violence against women is dangerous and can blur the line with what is acceptable in real life.”
The Conservative peer Gabby Bertin made the recommendations in her review into pornography regulation which reported in 2025.
Her report found pornography that shows women being choked can have “devastating” real-world consequences. It highlighted “disturbing” role-play, including incest and adults portraying children. Both will be banned.
The report said there had been a “total absence of government scrutiny” of the pornography industry.
Non-fatal strangulation is already an offence in its own right, but it is not illegal to show it online.
Reacting to the announcement, Lady Bertin said: “It is very good news these offences will come into force, and not a moment too soon.
“This change in law alongside better enforcement and stronger regulation will send the unequivocal signal not only to the companies that host and facilitate porn but also to wider society that extreme and violent content that encourages real-life harm is not acceptable.”
The End Violence Against Women Coalition campaign group welcomed the ban, urging ministers to ensure it is enforced.
Its interim director, Janaya Walker, said: “This is an important step towards tackling the normalisation of violence against women and girls, and the result of years of campaigning by EVAW and other experts who have raised concerns about the impact of violent pornography.
“Strangulation can cause serious, lasting harm and even death, yet its widespread portrayal in pornography risks normalising this violence in sexual relationships, particularly among young people.
“The introduction of this offence is an important recognition of the harm caused by violent pornography and the need to hold an industry accountable for content that depicts and profits from violence against women and girls.
“The government must now ensure the ban is effectively enforced, and update the Online Safety Act so that online platforms are required to remove this content.”
BeyondTrust patches zero-day exploited in attacks since August
Bleeping Computer
www.bleepingcomputer.com
2026-10-16 02:18:08
BeyondTrust warned customers on Thursday to patch a critical flaw in its Remote Support (RS) that has been exploited in zero-day attacks since late August. [...]...
BeyondTrust warned customers on Thursday to patch a critical flaw in its Remote Support (RS) that has been exploited in zero-day attacks since late August.
Remote Support is the company's enterprise-grade support solution that helps IT service desks, help desks, and customer support teams troubleshoot issues remotely.
Tracked as
CVE-2026-102764
, this actively exploited
authentication bypass
vulnerability lets unprivileged remote attackers perform file operations on unpatched appliances and affects RS 26.2.3 or earlier. BeyondTrust patched the security issue for all Remote Support and Privileged Remote Access SaaS customers on October 8, but self-hosted installations must be patched manually if automatic updates are not enabled.
While the company shared limited details about the vulnerability, it said the zero-day was abused in the wild by a suspected China-nexus espionage actor tracked by Mandiant and Google Threat Intelligence Group (GTIG) security researchers as "Armory Castle" (formerly
UNC5221
) and by cybersecurity firm CrowdStrike as "Warp Panda."
According to Mandiant researchers, who spotted the initial attacks, Armory Castle hackers exploited the flaw to gain initial access and escalated to root privileges on compromised devices by enabling Set User ID (SUID) permissions.
Next, they deployed new Sawfly web shell and Bareclaw tunneler malware, wiped logs to evade detection, and moved laterally through the victim's network using compromised Administrator credentials by opening remote sessions on downstream systems.
"After establishing a foothold through the web shell, the actor elevated from the web service account to root-level control of the appliance host. This gave them access to every credential the appliance stored or brokered and the ability to modify files that survive reboot and configuration reset,"
Mandiant said
.
"Any appliance that was reachable from the internet on a vulnerable version during the exploitation window should be treated as potentially compromised until it has been reviewed."
Armory Castle is known for targeting zero-day vulnerabilities in network edge appliances, including various Citrix NetScaler (
CVE-2023-4966
) and Ivanti Connect Secure (
CVE-2023-46805 and CVE-2024-21887
, then
CVE-2025-0282
) appliances, since at least October 2023 to breach enterprise networks and drop new custom malware.
Threat intelligence company Volexity also said in January 2024 that UNC5221 had
backdoored more than 2,100 Ivanti appliances
using the GiftedVisitor webshell in attacks chaining the CVE-2023-46805 and CVE-2024-21887 zero-days.
"In past campaigns, ARMORY CASTLE has conducted widespread and opportunistic exploitation following the public disclosure of vulnerabilities it had exploited selectively as zero-days, racing to infiltrate target organizations before patches are deployed," Mandiant added. "It is possible that we will observe similar widespread exploitation attempts associated with CVE-2026-102764."
CVE-2026-102764 is the latest in a string of other BeyondTrust flaws that threat actors have exploited in the wild in recent years. Most recently, attackers exploited another critical remote code execution vulnerability (CVE-2026-1731) affecting Remote Support and Privileged Remote Access appliances
to establish WebSocket channels
and
deploy ransomware
.
A physically modelled piano synthesizer in C++17. It renders notes and MIDI
files to stereo WAV and supports live MIDI input on macOS. Sound is synthesized
from a hammer, string, soundboard and sympathetic-resonance model, with a room
reverb effect. No piano samples, downloads or third-party libraries are required.
Note
It is VERY EARLY days for releasing this code. The piano is fine, but I have a prototyped AU and VST plugin, etc. which are not part of this open release so far.
Build
You need a C++17 compiler and Make. On macOS, install the Xcode Command Line
Tools (
xcode-select --install
) if they are not already available, then run:
macOS builds link the system CoreMIDI, AudioToolbox, CoreFoundation and CoreAudio
frameworks. The source also supports offline rendering on other platforms with
a C++17 compiler and threads; live MIDI/audio is macOS-only. This extraction was
built and tested on macOS; other platforms have not been verified here.
Compiler settings can be overridden, for example
make CXX=clang++ CXXFLAGS=-O3
.
Run
make clean
before changing compiler settings.
make clean
removes only the
executable, preserving any renders and presets.
Run
# Note, velocity, duration, optional key-hold time (seconds)
./coopiano A4 0.5 8
# Writes A4_gp.wav; quote sharp note names, e.g. 'G#3'.# Built-in musical demo; writes demo_piano.wav
./coopiano demo
# Render your own MIDI file; no MIDI files are bundled
./coopiano performance.mid 1.0 performance.wav
# Play from connected MIDI sources or the virtual coopiano MIDI destination
./coopiano live
# macOS only; Ctrl-C to stop
Running
./coopiano
without arguments renders A4 at velocity 0.5 for eight
seconds. Offline commands write 44.1 kHz, 16-bit stereo WAV files; they do not
play them automatically. On macOS, use
afplay A4_gp.wav
to listen.
Each offline render is peak-normalized independently.
Presets
Built-in defaults work without any configuration file.
default.ini
documents
the available voicing and reverb controls, including their ranges. Copy it,
edit the copy, then select it explicitly:
The audition command plays a chord at increasing velocities. Use
--help
for
its chord, velocity and timing options. Editing
default.ini
alone does not
change the built-in sound; pass
--preset
and restart playback to load changes.
preset.hpp
and
reverb.hpp
: INI configuration and stereo room effect.
piano_host.hpp
and
piano_resampler.hpp
: host-rate adaptation and resampling.
live_diagnostics.hpp
and
live_bench.hpp
: support compiled into the macOS host.
The C++ source/header files originate from the development project. Historical
comments may refer to documentation in that larger project.
The original test and benchmark collections are not bundled here.
With a subscription to LWN, you can stay current with what is happening in the Linux and free-software community and take advantage of subscriber-only site features. We are pleased to offer you
a free trial subscription
, no credit card required, so that you can see for yourself. Please, join us!
Chromium
, the open-source
upstream project for Google's Chrome web browser, is the browser of choice for
many Linux users. It has also gained a reputation as being
difficult for Linux distributions to
package and build
: Chromium has a complex build system, the project bundles
many of its dependencies, and it has frequent releases. All of that, plus user
complaints, has led the maintainers of the
Gentoo Chromium
package
to give up on trying to maintain the package.
Gentoo focuses on allowing users to build their own software from source
using the
Portage
software-management tool. Gentoo packagers create
ebuild
files, which are text
files written in a Bash-like syntax that contain the information needed by
Portage to build the software. Users then build packages themselves using
emerge
, which is the
command-line interface for Portage.
A
recent ebuild for Chromium
illustrates the complexity of the package.
Gentoo does offer prebuilt binary packages for some software via its
Binhost
project. However, building from source gives users the flexibility to declare
USE
flags
to set compile-time
options or change a package's configuration. For example, a user may wish to
specify which optional libraries are linked with a package, or whether to
install the accompanying documentation. With Chromium in particular, a
user might employ the
-bundled-toolchain
USE
flag (which tells Portage
not
to use the bundled toolchain) in order to use their
system's version of Clang to compile Chromium rather than the
bundled
version included by the upstream project
. That is optional for Gentoo users
on x86-64 systems, but
-bundled-toolchain
is required for users on
other architectures, since Chromium's bundled toolchain is only shipped for
x86-64.
It is worth noting that Chromium is currently not available as a binary
package from Gentoo due to problems with building the package with proprietary
codecs.
Last rites
Many distributions, including Arch Linux, Debian, and Fedora, use the term
"orphan" to refer to packages that have been abandoned by their maintainer; the
developer announces that a package has been orphaned, and other contributors
have the opportunity to claim maintainership of it if they wish to do
so. Gentoo's terminology is a bit more dramatic: a package maintainer announces
"last rites" for a package on the gentoo-dev-announce mailing list to notify the
project that it will be unmaintained, and as an opportunity to allow other
developers to claim maintainership.
After a developer has declared last rites, the package's ebuild is
masked
in
Gentoo's
ebuild repository
to ensure that users will not accidentally install a
package that is no longer being maintained. Users who have the package installed
and attempt an upgrade will receive a warning that it has been masked. Chromium
package maintainer Sam James
declared last rites
for the Chromium package
on September 24, after a lengthy conversation in a
bug report filed by Roman
Žilka
.
On September 9, Žilka
had
complained
that the latest stable version of the Chromium ebuild was
outdated:
The latest stable www-client/chromium (and google-chrome and possibly others)
is 151.0.7922.169, which contains a catastrophic 602 known
vulnerabilities of all severities. Measures need to be taken by somebody
qualified that this doesn't keep happening in packages as important as
these.
He had attached
an ebuild for a
newer version of Chromium
to the bug report, but noted that it would not work
if a user tried to compile Chromium with the
-bundled-toolchain
USE
flag.
James
replied
, "
Chromium
is horrible to maintain as a source package. It is easily the package in Gentoo
that burns through maintainers the most.
" Complaining about its maintenance
isn't helpful, he said, and added that the maintainers have come close to
giving Chromium last rites several times over the years due to the difficulty in
keeping it up to date. He also noted that he had mentioned this to Žilka before,
and said that it would be welcome if he wanted to assist with the package.
Indeed, Žilka had
filed a similar
bug
in August complaining about the number of vulnerabilities present in the
Chromium ebuild; James had
replied then
that the package had always
been difficult to maintain, "
and now they've added Go
" as a dependency as
well. Prior to that, Žilka had shown up in a
bug report filed
by Matt Jolly about Chromium vulnerabilities
to
complain
that "
the update process needs fixing, so that events like these don't happen
again in packages as critical as these!
"
Jolly had
replied
that the maintainers are a team of volunteers who do their best, but "
build
failures, human factors ('I messed up assigning the bug and automation didn't
pick it up'), and my own limited free time are the biggest causes of
delays
". The best way to change the situation, he said, would be for Žilka to
volunteer his help.
Trial and error
There are various third-party repositories, called
overlays
,
that provide additional and alternative ebuilds for Gentoo. On
September 11, Nick Reale
said
that he had tried ebuilds for
a newer version of Chromium from the
Bentoo
and
Fireburn
overlays, but he
couldn't get either one to work. A few days later he
reported success
with Bentoo's
ebuild and a specific set of
USE
flags. There was some follow-on discussion from
Reale and François Valenduc about various incantations they were able to use to
compile an updated version of Chromium on Gentoo from other ebuilds.
On September 18, Valenduc
commented
that version
153.0.8010.47 of Chromium was out, and that version was already available in
Arch Linux, openSUSE, SUSE, and Ubuntu. "
We are still waiting for Gentoo
despite all the proposals made here.
"
James
replied
that none of the maintainers have had a chance to look into
the problems with the Chromium package yet. He said that the patches and
ebuilds that had been submitted with the bug report were "
useful and
appreciated, but it's not as simple as just grabbing it and committing
it
". Users would complain, he said, if the maintainers had not tested the
ebuilds and it broke on their systems.
It'll get done when it's done, but it's more likely to be last-rited if nobody
is interested in handling it in the way these things have to be done (which goes
beyond just attaching ebuilds).
Valenduc
said
that he was
not able to maintain the package, "
but taking the ebuild from the bentoo
overlay was not that difficult [...] It's just frustrating to see no updates in
Gentoo.
" James
replied
that
just because the ebuild worked for Valenduc did not mean it had all
USE
flags
working. He added that no one had submitted a patch to the Gentoo ebuild, which
meant that the maintainers would need to reverse-engineer the changes by diffing
the ebuilds and work out what had been modified. "
All of that is a
non-trivial amount of work and while having some ebuild to start with is useful
for that, it doesn't mean one can just git add && git commit &&
git push it.
" Valenduc
acknowledged
that he could not
test all possible
USE
flags, since it took between 15 and 16 hours to compile
Chromium on his laptop.
Maciej S. Szmigiero
asked
if
it would be possible to keep the ebuild in Gentoo's repository and just declare
that it was maintained at "best effort" level. "
Removing buildable/patchable
Chromium is a huge loss for a Gentoo desktop.
" James
said
that he did not think
that was possible. He had already explained that Chromium was being maintained by
volunteers, and that explanation had not been accepted.
People were free to maintain the ebuild in another repository, he said, but
that meant they would have to do the work themselves or accept someone doing it
to a lower standard. He pointed out that the ebuilds from the Bentoo overlay had
been cited in the discussion, but creation of those ebuilds seemed to be
"
heavily automated
" and had missed some fixes in the Gentoo
version. "
Copying ebuilds works fine until it doesn't.
"
James added that someone could still pick up the Chromium package before the
end of the last-rites period on October 24, or that the package could be
restored in the future. He did not want to see that, though, unless there was a
plan for sustainable maintenance. "
Chromium has a history of burning out
maintainers in Gentoo because of the high rate of churn upstream, though some of
the contents of this bug don't help motivation at all either.
"
Matt Whitlock
wondered
if
the developer-burnout factor could be reduced by eliminating most of the
USE
flags for Chromium, or if the maintainers stopped unbundling third-party
libraries.
Basically, what I am asking is: can we give up _all_ of the flexibility to which
we have grown accustomed in www-client/chromium, in exchange for a package that
is actually maintainable but that is still built from sources by a toolchain
that is not distributed as opaque binaries?
He
added later
that part of
the problem was that the upstream project developers "
do not test
their builds with any of their allegedly 'optional' features disabled
". That
left the responsibility with the downstream package maintainers. "
In the case
of Chromium, keeping all the toggle switches working (despite chronic neglect
from upstream) is a monumental, nigh-insurmountable task.
"
Complexity
That was a good question, James
said
, but part of the recent
complexity with Chromium was the addition of Rust and Go dependencies. The
packagers had to do some wrangling to ensure that the Go build did not require
network access, which is forbidden with Gentoo ebuilds, but that was not the
only problem. He said that Google developers seem to keep using experimental
Rust features that break on new releases as well. On top of that, "
yet
another problem is that upstream's CI to produce release tarballs isn't
reliable
". One of the Gentoo Chromium maintainers had sent patches to fix
that, to little avail. "
It took ages to get [the patches] reviewed, and it's
broken again a few times since. They didn't seem to notice or care that it
either wasn't producing tarballs or was producing incomplete ones
."
Jolly
added some of his
observations
about problems with maintaining Chromium for Gentoo. He said
that maintaining Chromium can take more than six hours each week, and that was
counting only compilation time on a fast PC with "
an absurd amount of
RAM
". Compilation time is even longer for 64-bit Arm machines.
It's a commitment to volunteer at least a business day's worth of your free time
each week when you include rebasing patches, cherry-picking fixes, iterating on
`ebuild ... clean compile`, plus trying to identify and fix any new bugs,
working out how much you violate Gentoo policy by not unbundling more of the
browser, spending time on automation to save time and mistakes later,
etc. There's immense pressure to keep builds up-to-date, especially in the age
of hundreds of weekly browser CVEs.
He included a "
pre-emptive FAQ
" in his reply about the last rites for
Chromium, and what it would require to restore the package. He said that there
were no insurmountable technical issues to maintaining Chromium, but it would
need multiple maintainers with a broad set of skills—including familiarity
with C, C++, Go, JavaScript, and Rust. "
There are also a huge number of NIH
[not invented here] Google tools that you'll [have to] develop skills for and never be
able to use anywhere else - you have been warned
."
Using Google's toolchain would be simpler, but it would also restrict the
ebuild to x86-64, he said. "
We'd lose arm64, ppc64, and the RISC-V overlay -
better to just rip the band-aid off now as it doesn't materially make the
situation better
". He added that he would be willing to review commits and offer
advice to anyone who wanted to maintain the source ebuild, but he felt that at
least three people would be needed. "
History has shown that one maintainer
isn't working, and we've had the release cycle shorten twice since I started
maintaining the package in 2023; it was bad then, and it's worse now.
"
The
release
cadence
for Chromium is aggressive, to say the least. Chromium has multiple
channels including stable, beta, and development. There is a new major
branch of the browser roughly every two weeks via the stable channel, and a new
version is shipped every week.
Getting Chromium
For now, it appears that Gentoo users will need to search elsewhere for a
suitable Chromium ebuild, choose a different browser, or find a different
distribution method to acquire Chromium. For example, Gentoo users could install
the
Flatpak from
Flathub
, but it is an unverified package built by a third party—not by
the Chromium upstream project. The Flatpak is also of no help for users who are
not on x86-64 or 64-bit Arm systems.
It is technically possible for Chromium users to build and compile the
browser on their own using the upstream's instructions, but it does not appear
that the Chromium project cares a great deal about making that easy to do. It does have a
page on
getting the code
but the links to instructions for Linux (as well as macOS
and Windows) return a 503 error. Searching for instructions turns up
this
page
, though it is undated so it is unclear if it is the most
up-to-date. Assuming the instructions are current and correct, building Chromium
using those directions is quite an ordeal. Users can
download
pre-built binaries
from the project, but only for x86-64 systems.
Other distributions continue to supply Chromium packages, of course, though
their approach does not provide the same flexibility as Gentoo's. Fedora's
package
(which is described as "
A WebKit (Blink) powered web browser that Google
doesn't want you to use
") is at version 154.0.8037.92—one version
behind the upstream (154.0.8037.97) release that was published on
October 1. Likewise, the package in Debian's security repository is the
same version (currently) as Fedora's and the
information
page
shows that there are at least 11 known CVEs addressed in
154.0.8037.97. Keeping up with Chromium is not an easy task.
Perhaps Gentoo will find a team that is willing and able to take on the
burden of maintaining the Chromium ebuild up to the standards that Gentoo users
expect. Whatever happens, it seems unlikely that Chromium will become any easier
to maintain in the interim.
Where directories are code and drive space is infinite
About
Folders is a non-textual language, where code is expressed in containment and order alone. The names of the folders are ignored, apart from alphabetical ordering. In other words, they are
pure ordered trees
.
Inspired by the Whitespace language, Folders is devoted to the idea of dematerialized code. It began with the question
What is more empty than a file with no visible text?
The empty folder is clutter, an appendage with no purpose. In git, it is ignored entirely (for this reason, it is suggested that Folders programs put .gitignore files in their deepest reaches).
Folders began as a Windows language. In Windows, folders are an even more extreme measure of emptiness: they take up no disk space at all.
For proof, create 352,449 folders and get properties on it. In this way, Folders offers not only a dematerialized approach to code but also infinite storage capacity. Keep all your data encoded in folder names and never worry about running out of space again.
For those who use other operating systems, the emulator below gives some of the experience of how Folders manages data and code.
Each command folder has at least one child folder. The number of subfolders in the first
folder (alphabetically) indicates the type of command; any arguments are indicated in a
second folder; some commands require a third folder. Expressions are the same: the number of folders in the first sub-folder determine what kind of expression it is. The
full Language Spec is below
.
Temporary data is stored as folders; unlike Folders code, it is the name of the folder that stores the data.
Folders FS
The Folders interpreter does not create temp files; anything not held
immediately in memory is stored as a set of temp folders. Unlike Folders code, the name of the folder stores the data itself.
The prefered I/O of
Folders is another set of folders. This means you can encode all your data in
folders, bypassing the "material realm" of files entirely and giving you infinite disk space (attempt at your own risk). Folders lang for code, Folders FS for data storage.
Temp folders from several Folders programs
Visualizations
A Folders program is a
nil-terminated nested list
. Its simplest form is pure containment and order, like this all-array JSON:
That is also how the JS emulator saves/reads Folders programs.
However, other systems of visualization are possible. Folders programs are
content as structure
and can be applied to raw data of any type. Here is a
Truth Machine
as a contour map. The thicker lines are containers, and the order of folders is read starting at the upper left (NW corner) and proceeding counter-clockwise.
Other visualizations might be a family tree (with all single parents), a botanical branching structure (like a splitting stalk of wheat), or the paths through a maze.
The red dots indicate a threshhold from a container to a single child.
Language Spec
The language itself is a very simple imperative language with a short list of semantic rules.
For Commands and Expressions, the number of folders in their first child folder determines their use. Types are used directly.
Commands
Command
# of Folders
Details
if
0 folders
Second sub-folder holds expression, third holds list of commands
while
1 folder
Second sub-folder holds expression, third holds list of commands
declare
2 folders
Second sub-folder holds type, third holds var name (in number of folders)
let
3 folders
Second holds var name (in number of folders), third holds expression
print
4 folders
Second sub-folder holds expression
input
5 folders
Second sub-folder holds var name
Expressions
Type
# of Folders
Details
variable
0 folders
Second sub-folder holds var name
add
1 folder
Second sub-folder holds first expression to add, third holds second expression
subtract
2 folders
Second sub-folder holds first expression to subtract, third holds second expression
multiply
3 folders
Second sub-folder holds first expression to multiply, third holds second expression
divide
4 folders
Second sub-folder holds first expression to divide, third holds second expression
literal value
5 folders
Second sub-folder holds the type of the value (e.g. two folders for a string, third holds the value)
equal to
6 folders
Second and third folders hold expressions to compare
greater than
7 folders
Second and third folders hold expressions to compare
less than
8 folders
Second and third folders hold expressions to compare
Computers Made of Human Brain Tissue Identify Braille Letters In Breakthrough
403 Media
www.404media.co
2026-10-16 00:01:00
Scientists discovered that human brain organoids, which are small neural clusters derived from stem cells, could identify the Braille alphabet with a high degree of accuracy....
Scientists have made a breakthrough toward the mind-bending goal of creating computers made of brains by demonstrating that human neural tissue can classify letters of the Braille alphabet, according to
a study published on Friday
in
Frontiers in Artificial Intelligence
.
A team transmitted electrical signals corresponding to Braille letters to human brain organoids, which are living neural tissues derived from stem cells. The results revealed that a single organoid, consisting of about 10,000 neurons, could classify the letters with about 61 percent accuracy, while teams of three organoids reached 83 percent accuracy.
“The human brain can perform incredibly complex information processing while consuming relatively little energy, and artificial neural networks were originally inspired by biological nervous systems,” said Tianyi Liu, a PhD candidate at Bristol University who led the new study, in an email to 404 Media.
“If we've been trying to imitate biological neural networks all along, why not try using real biological neural networks directly?” she continued. “What kind of information processing capabilities might these tiny neural organoids have? Could they show some form of learning or adaptation? These are all questions we're very interested in.”
The new study falls under the emerging field of organoid intelligence, which aims to use organoids as biological “wetware” for computing applications. Previous studies have established that organoids are capable of recognizing speech
Japanese vowels
or even playing
the classic game Pong
.
Since Liu and her team specialize in how robots sense and respond to touch, they homed in on Braille as a way to convert tactile information into electrical stimuli that an organoid could receive, process, and classify.
In their experimental setup, the researchers used a tactile sensor to scan data from the 26 letters of the Braille alphabet, which is built from arrangements of raised dots. This data was converted into electrical stimulation patterns that were fed to the organoids, which are smaller than a millimeter in scale and positioned on arrays that keep them alive.
“Our original goal wasn't to prove that organoids could read Braille like humans, or that they were already ‘intelligent’ enough to understand Braille,” she added. “Rather, we wanted to use this task to explore whether real biological neural networks could participate in processing information from robotic tactile sensors.”
The tactile sensor used to scan Braille letters. Image: Dr Benjamin Ward-Cherrier.
In other words, the researchers aimed to discover if these stimulated inputs could be decoded by the organoids and returned back in discernable responses corresponding to the Braille letters. The results revealed that a single organoid could accurately classify the letters nearly two thirds of the time, while an "ensemble" of three organoids performed even better, with an accuracy of 83 percent.
“We still don't know the exact mechanism behind this improvement,” Liu said. “Our hypothesis is that different organoids respond to the same stimulation in similar, but not identical, ways.”
She added that “you can think of it as three people looking at the same object. Although they're all looking at the same thing, each person might notice different details. Some features might not be obvious to one person but could be quite easy for another to spot. By combining their observations, you might be able to make a more accurate and reliable judgement.”
🌘
Subscribe
to 404 Media to get
The Abstract
, our newsletter about the most exciting and mind-boggling science news and studies of the week.
The results are undeniably trippy, conjuring up the classic scifi trope of a hyperintelligent brain-in-a-vat. But Liu emphasized that this was an open-loop experiment, meaning that the organoids only received initial inputs without getting new feedback about their performance on the tasks. For this reason, the study does not prove that the organoids actually learned Braille, or were altered in any permanent way, just that they could classify Braille letters after receiving the electrical inputs.
“In the future, if we can build closed-loop systems where neural activity from the organoids actually participates in a robot's perception, decision making, and control, while the results of the robot's interactions with its environment are fed back to the organoids, we could begin to investigate whether these biological neural networks can adapt to new tasks through ongoing interaction,” she said.
Liu also noted that while there are many potential advantages to organoid intelligence, there are plenty of limitations to biological computing systems. For example, organoids cannot be standardized, leading to natural variations that can complicate results, plus they have to be kept alive in cultures that are more difficult to maintain than electronic devices.
“Compared with established computing chips, organoid systems still have a long way to go in terms of reliability, reproducibility, and scalability,” Liu said.
Even so, organoid intelligence “gives us the opportunity to explore a way of computing that's very different from traditional computers,” she concluded.
For the last seven months, I spent a good part of my (small amount of) free time rebuilding my self-hosting infrastructure at home. I wanted something secure, fully automated, that updates itself and that I can rebuild from scratch if something goes wrong. Most of the ideas come from my work on infrastructures following SecNumCloud (a French security standard for cloud providers) and, to a lesser extent, ISO 27001, I wanted to see how far I could apply the same principles at home.
In this blog post, I will explain how my personal infrastructure works, how all the pieces fit together, and why I think each security layer is useful. This is not a step by step guide, I will not go deep into code, the goal is to show the architecture and the reasons behind it.
Before going further, I need to be honest, this is a personal infrastructure running on a single machine at home, and it is probably totally overengineered for most people. If you just want to host a Nextcloud for your family, a lot of what follows is not needed. But I learned a lot along the way, especially about containers and cloud-init, and I am very happy with the result :)
The hosting server is nothing special, just a regular laptop with 16 GB of RAM, a NVMe SSD and a network card, sitting next to my Internet provider box.
Everything runs on this laptop. The operating system is Incus OS, a small immutable system that only run Incus, a manager for system containers and virtual machines (it is like Proxmox but more container oriented).
On top of it, there are about twenty Ubuntu system containers, one per service, and two virtual machines for the more sensitive parts. Inside each system container, the applications themselves run as podman containers, described with "quadlets", which are files that systemd turns into services. So there are two levels of containers: Incus instances, and podman containers inside them.
I am currently hosting the following services:
Nextcloud
Forgejo, with a CI runner
Immich for photos/videos dumped from smartphones
PeerTube for videos
Vaultwarden for passwords
Kanboard
Uptime Kuma and SmokePing to monitor the network
a static website
a monitoring stack: Prometheus, Grafana, Loki, Alertmanager
CrowdSec
restic for backups
Nothing is configured by hand. Everything is declared from a git repository with OpenTofu (the open source fork of Terraform) and cloud-init (the tool that configures a cloud system at its first boot).
The system containers are unprivileged, which means the root user inside a container is not root on the host. Compared to a VM per service, this is very efficient: the RAM and disk usage are much lower, and everything is pretty fast.
Here is a diagram of how everything fits together:
Incus OS is the foundation, I chose it because it is locked as much as possible. It comes with:
Secure Boot enabled
A/B boot: the update is written on the other partition, and the system can go back to the previous one if needed
no local access: there is no shell, no SSH, no package manager, nothing can be done with local access to the laptop
disk encryption with the TPM (this allows auto reboot without typing a passphrase, but if someone steals the laptop it will boot and they would be able to attack the system locally as if they were on my LAN)
It is not exposed on the Internet, I manage it from my LAN through the Incus API using a certificate for authentication.
An unexepcted side effect is that I do not use SSH anymore to manage the infrastructure. No SSH keys to manage, no SSH endpoint to secure, no TERM variable issue. When I need to look inside an instance, I can use
incus exec
to run a command or
incus shell
to open a shell, all through the Incus API. The only SSH in the whole setup is the git over SSH access provided by Forgejo, which is an application feature.
This is probably the part I like the most. Each instance is created from a fresh Ubuntu cloud image, and cloud-init does everything at first boot: upgrade the system, install podman, write the quadlet files, decrypt the secrets, start the services. I took inspiration from my experience with Qubes OS.
When I change anything on an instance (a configuration file, a container, a command, the order of commands), OpenTofu destroys the instance and recreates it from scratch. There is no configuration drift, what runs is exactly what is in git. If someone ever manages to get into a container and leave something behind, it disappears at the next rebuild.
Only the data persists, in dedicated Incus volumes:
a volume for podman storage, where the named volumes of the applications live
a volume for the secrets of the instance (its decryption key)
a local cache for the apt packages, to speed up rebuilds
As the system part is fully disposable, I could even replace Ubuntu with another distribution without much trouble, the applications run in podman containers anyway.
This is heavy: during a change, the component is not available for one or two minutes, the time for it to be rebuilt. But in exchange, every time I make a change, I am sure it will still work at the next boot, and I know I can rebuild the whole system if needed.
All instances are connected to an internal bridge with an Incus ACL that rejects everything by default in both directions, including between two instances. Every allowed network connection is declared in the OpenTofu code, with a description of why it exists. For example, the reverse proxies can reach the exact port of each backend, Prometheus can reach the metrics exporters, and every instance can send its logs to Loki, but Nextcloud cannot talk to Vaultwarden.
The goal is to protect the systems from each other. If one service gets compromised, the attacker should not be able to jump easily to the others.
There are two VMs for the most sensitive parts:
the haproxy VM, which is the only machine connected to the physical network and receives the Internet traffic (DMZ)
the CI runner, because CI jobs run arbitrary code, it also features Docker in Docker to run nested containers which required some privileges
The isolation of a container is a bit weaker than a VM, but it is acceptable for my threat model. For the parts most exposed to untrusted input, I preferred a hypervisor level security.
Most instances have no direct access to the Internet. A dedicated instance acts as the single exit point and provides:
an HTTP proxy with a list of allowed domains, everything else is refused (the domain list is shared by all consumers, this is acceptable here)
a caching proxy for apt packages (apt-cacher-ng)
local mirrors (pull-through caches) for the container registries I use: Docker Hub, GitHub and Codeberg
All the instances use these for their packages and container images, and the few applications that need to reach the Internet go through the filtering proxy. The few exceptions that cannot go through a proxy (for example ACME certificates for the public reverse proxy, the CI runner, the Uptime Kuma probes or the backups to S3) are explicit and documented ACL rules.
The benefit is that even if a service gets hacked, it will be complicated to exfiltrate data or download a second stage payload from an arbitrary server. Rebuilding twenty instances does not put load on the upstream mirrors or waste network bandwidth.
Internet
|
v
haproxy VM (CrowdSec bouncer with nftables)
| raw TCP + PROXY protocol
v
caddy (public) --> public services
The haproxy VM only forwards raw TCP, it never sees cleartext traffic and does not hold any certificate or private key. It uses the PROXY protocol, a small header added at the beginning of the connection that carries the original client IP, so caddy knows who is really connecting, even with NAT and containers in the middle.
On the same VM, the CrowdSec firewall bouncer drops connections from IPs with a bad reputation, directly in nftables, before haproxy even accepts the connection. CrowdSec reads the logs of caddy, Forgejo and Nextcloud from Loki to detect bad behavior, and also uses community blocklists. This only works because the real client IP is known all along the way.
Then, caddy terminates TLS and forwards the requests to the services.
I discovered caddy with this project, and I find it is a great piece of software. The documentation is very good, it always had the features I needed, and the configuration is easy to understand.
There are two separate caddy instances: one for public websites, and one for the sites only reachable over my VPN. This way, even if the public caddy gets hacked, the VPN only services are not affected.
The VPN caddy only listens on the Tailscale address of the host, and also checks that the client IP is in the VPN range. The admin tools (Alertmanager, Uptime Kuma, Kanboard...) have no public endpoint at all.
Some tools are exposed on the Internet, but their admin interface or admin API is only reachable through the VPN. Even if there is a vulnerability in the admin API, this will not be exploitable. For example, Nextcloud is available both publicly and over the VPN, but its admin API is only reachable through the VPN.
Immich, which I use for photos and videos (I wrote about it this year) goes further. Publicly, it only answers to share links, so I can share content with people outside. Everything else like browsing the library or uploading photos and videos, goes through the VPN. This is a security measure, the full application is not exposed over the Internet.
For the VPN sites, I wanted real TLS certificates that are not "self signed". I run my own certificate authority (CA), which delivers certificates through ACME, the same protocol used by Let's Encrypt. Its root certificate is installed on all the instances and on the devices (phones, computers, tablets), so every component knowing this root CA recognizes the certificates. No more
curl -k
!
Each instance has its own age private key, generated once and stored in the volume
secrets
, it never leaves the server. The secrets of a service are encrypted for that instance key and for my workstation keys only. This means only the person or machine that needs to know a secret can read it: a compromised Nextcloud cannot read the Vaultwarden secrets, even with a full copy of the repository.
At boot, the secrets are decrypted on the disposable root disk, so they are regenerated at every rebuild. A git pre-commit hook running gitleaks also blocks a commit if a secret is found in the history, just in case.
Ubuntu instances use unattended-upgrades, and a full upgrade is done when the instance is created, to be sure it starts with the latest packages (I still need to figure how to upgrade the whole base image instead of upgrading it in-place)
the podman containers are updated by
podman auto-update
(as a service), which pulls new images for the configured tag and rolls back if the new container fails to start
I chose tags following a major version (for example
postgres:18-alpine
), so major upgrades are a deliberate one line change in git. So far, I never had any issue after a container updated itself automatically. I subscribed to releases RSS feeds for each project I am using, to know quickly if they are breaking changes I need to deal with or a new major version.
ZFS snapshots of the various volumes, done automatically by Incus, for a quick recovery (daily snapshots kept two weeks for the data)
restic backups of the data volumes every day to an S3 storage, encrypted on the client side
If an attacker takes control of the restic instance, they can get the access to the bucket and delete the backups. To protect against this, the bucket has versioning and protections in place, so even if the data is deleted, I can restore it during a certain number of days. The bucket is not in immutable mode though, because restic modifies files at each run and this would break it. I explained this setup in an older blog post:
In security, we often talk about three criteria: confidentiality (only the right people can read the data), integrity (the data and systems are not modified without permission) and availability (the service works when you need it). Here is how the different layers help with them in my setup.
You only see those criterias when working on certified environments, but I like how they frame the various aspects of cyber security.
CrowdSec blocks known bad IPs, weird requests and brute force attempts
automatic updates reduce the time a vulnerability stays open, this is relevant nowadays
ZFS snapshots allow a fast rollback, restic allows a full restore
the S3 versioning protects the backups against deletion
monitoring and alerts tell me quickly when something goes wrong
the whole infrastructure can be rebuilt from the repository
The main limit for availability is that everything runs on a single machine at home, if it dies or if my Internet connection goes down, everything is down. And a rebuild of the public caddy or haproxy cuts the public traffic for a minute or two. This is fine for me. Incus OS have cluster features, but this goes too far for my setup.
It was not easy, here are the biggest challenges I faced.
sops in cloud-init: sops is not packaged in distributions I wanted to use, I ended up running sops itself as a podman container to decrypt the secrets at boot
the Incus ACL: the mechanism is not always simple to understand, with everything denied in both directions, connections between two instances must be allowed on both the egress and the ingress side
the ordering done by OpenTofu: as Internet access depends on the proxy and the registry mirrors, they must be up before anything else, and for example the CrowdSec bouncer needs the CrowdSec local API to be running to start
CrowdSec in general was very complicated to get right
getting the source IP of a request with NAT and the service running in a container, this was magically solved by haproxy and the PROXY protocol, once I learned about that PROXY protocol
the layers of reverse proxies and the HTTP headers up to the final application, it was particularly hard with PeerTube and Nextcloud to get them to use the correct domain
some applications do not like to work with two differents base domains, I had to decide if they were exclusively public or exclusively on the VPN
I am very happy with this setup. It is fast, the RAM and disk usage is very efficient compared to running VMs, and everything updates automatically. Making a change through OpenTofu and cloud-init is heavier than editing a file over SSH, but it works very well, and I never have to wonder if a service will come back after a reboot, or that fear when you need to play a whole ansible playbook and you know it will go wrong.
This took me seven months of my free time, but I learned a lot about containers and cloud-init. Again, this is probably overengineered for most people, and a single server at home is not a highly available platform. But if you like the idea of disposable systems, deny by default networking and no SSH at all, I hope this post gave you some ideas.
There are still a few things I would like to improve: logging could receive some filtering because they are way too much stuff there, crowdsec could be extended with scenarios, AlertManager is not great and I still need to figure how to trigger a system container update so I don't have to use unattended-upgrades in Ubuntu anymore (that's a service running apt-get update / upgrade automatically for security updates)
If you want to play with Incus without going into Incus OS, it works as a service on any linux distribution, so you can give it a try easily.
Stripped back to the essentials: the Mission S demonstrates what makes a true sports car and delivers an immediate driving experience.
Consequent.
Every detail is based on an idea. Every element serves a clear purpose. Nothing distracts the driver; everything enhances the pure driving experience.
Timeless.
Inspired by icons: the design language blends the past and the future into a distinctive design imbued with Porsche DNA.
FOCUS ON WHAT MATTERS.
Every idea behind the Mission S stems from a single question: what does the sports car of tomorrow really need? The answer is a consequent focus on the driver experience. From the five round instruments with an analogue rev counter to the centre dials with push-pull function.
FORM FOLLOWS FUNCTION.
The wraparound main line connects the light signatures at the front and rear. Distinctive torpedo-style fenders and the dynamic roofline draw on historic Porsche design features and reinterpret them.
Exterior highlights.
Mid-engine architecture.
The centrally positioned engine enables characteristic proportions, a particularly pronounced Porsche Flyline and a dramatic width-to-height ratio. The result: a sports car that reveals its performance at first glance.
Continuous wraparound main line.
The Mission S translates the signature design language of Porsche into the future. The wraparound main line connects key elements of the car and individual components to form a unified sports car sculpture.
Torpedo-style fender.
Inspired by legendary Porsche models, the distinctive torpedo-style fenders create a powerful front end and bridge the gap between the past and the future. Familiar in their origins, visionary in their design, they lend the sports car architecture a sense of dynamism and character.
Visible fan wheel at the rear.
As functional as it is emotional: forward-looking design elements demonstrate at first glance how performance can be reimagined. The prominently displayed fan wheel in lightweight construction supports cooling – whilst also paying homage to the most infamous and legendary Porsche racing car: the 917.
Reimagined dial-style wheels.
Every generation of sports cars leaves its mark. The Mission S wheels draw on an iconic design from the Porsche history and develop it further: the ‘dial-style wheels’ of the 928. The result is more than just a reinterpretation of a design motif. It is a link between the sports cars of yesterday and the driver’s cars of tomorrow.
AUTHENTIC. CONSEQUENT. TIMELESS.
A deliberate return to the core values of sports car engineering: the Mission S is consequently driver-focused. Clear information, intuitive controls and a precise layout of all elements ensure that attention remains where it belongs: on the road.
Interior highlights.
‘On your own’ driving mode.
A red button. A conscious decision. Activating the ‘On your own’ driving mode on the steering wheel deactivates the driver assistance systems. For driving pleasure in its purest form.
Central rev counter with an analogue design.
As the revs rise, every glance counts. That is why the digital rev counter with its analogue needle always remains the centre of attention. Around it, other classic round instruments constantly rearrange themselves – in line with the selected driving mode. The result is a display that intuitively supports the driver and remains quick and easy to read, even at high speeds.
Attention to detail.
The seats combine comfort and functionality with motorsport DNA. The result is a sports seat brimming with craftsmanship, precision and attention to detail – like the integrated seatbelt buckle in the centre panel and repositioned electric adjustment controls.
Aluminium key.
Noticeably different from the very first moment: the aluminium key offers a glimpse of what is to come. Even before the engine starts, a connection to the car is formed, transforming anticipation into something tangible.
Height-adjustable gear lever.
Grab. Shift. Feel. The Mission S gear lever is height-adjustable and deliberately designed to provide a tactile experience. It creates precisely the connection to the car that makes every journey more intense.
Linus Torvalds on AI-assisted kernel contributions
From: Linus Torvalds <torvalds@linux-foundation.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Kees Cook <kees@kernel.org>, Jori Koolstra <jkoolstra@xs4all.nl>,
"Lorenzo Stoakes (ARM)" <ljs@kernel.org>,
Krzysztof Kozlowski <krzk@kernel.org>,
Sasha Levin <sashal@kernel.org>,
corbet@lwn.net, skhan@linuxfoundation.org,
rdunlap@infradead.org, federico.vaga@vaga.pv.it,
apw@canonical.com, joe@perches.com, workflows@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Justin Stitt <justinstitt@google.com>,
Carlos Maiolino <cem@kernel.org>,
Jakub Kicinski <kuba@kernel.org>,
Brian Foster <bfoster@redhat.com>,
Christoph Hellwig <hch@infradead.org>,
David Disseldorp <ddiss@suse.de>, Mark Brown <broonie@kernel.org>,
Jani Nikula <jani.nikula@intel.com>,
Jens Axboe <axboe@kernel.dk>,
"David Hildenbrand (Arm)" <david@kernel.org>,
Vlastimil Babka <vbabka@kernel.org>,
"Christian Brauner (Amutable)" <brauner@kernel.org>
Subject: Re: [PATCH] docs: remove Assisted-by references
Date: Tue, 13 Oct 2026 13:45:09 -0700 [thread overview]
Message-ID: <CAHk-=whTs09_ozN+e09GU68N1wPP56MUzDjrg9rnKxQUa0A_4Q@mail.gmail.com> (raw)
In-Reply-To: <20261013201628.GO4214@killaraus.ideasonboard.com>
On Tue, 13 Oct 2026 at 13:16, Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> What this is about is setting our expectations, telling what we want and
> what we don't want.
No. What you are about is something entirely different. It has nothing
to do with "expectations", and it has everything to do with your
hangups.
I don't understand this whole idiotic concept of "don't use AI for X".
Here's a new rule just for you: don't use compilers for any of your
kernel submissions.
Because if you can't show that you really understand what the machine
is actually doing by writing your code in assembler, then I don't want
to see your code contribution. You clearly aren't competent if you
can't write it that way.
And btw, you had better not use an editor to write that commit message either.
Because I need you to show me that you can actually write a good
commit message without using tools that make it easy to backspace and
hide the mistakes you made while typing.
Ok?
Because otherwise those tool-assisted commits of yours clearly aren't
showing that you know what you are doing.
Do you not see how UTTERLY STUPID those kinds of rules would be?
So no. We're not going to make stupid rules that say "you can't use
tools for X".
The kind of expectations *I* have is that people do their best and I
expect people to understand what they are doing.
But that understanding has very little to do with what tools they use.
And quite honestly, in my experience, the people I respect and call
intelligent are not the ones that shy away from using new and
interesting tools.
Linus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAHk-=whTs09_ozN+e09GU68N1wPP56MUzDjrg9rnKxQUa0A_4Q@mail.gmail.com' \
--to=torvalds@linux-foundation.org \
--cc=apw@canonical.com \
--cc=axboe@kernel.dk \
--cc=bfoster@redhat.com \
--cc=brauner@kernel.org \
--cc=broonie@kernel.org \
--cc=cem@kernel.org \
--cc=corbet@lwn.net \
--cc=david@kernel.org \
--cc=ddiss@suse.de \
--cc=federico.vaga@vaga.pv.it \
--cc=gregkh@linuxfoundation.org \
--cc=hch@infradead.org \
--cc=jani.nikula@intel.com \
--cc=jkoolstra@xs4all.nl \
--cc=joe@perches.com \
--cc=justinstitt@google.com \
--cc=kees@kernel.org \
--cc=krzk@kernel.org \
--cc=kuba@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ljs@kernel.org \
--cc=rdunlap@infradead.org \
--cc=sashal@kernel.org \
--cc=skhan@linuxfoundation.org \
--cc=vbabka@kernel.org \
--cc=workflows@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a
Subject:
header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).
Commenter asdf wonders
where
WIN32_LEAN_AND_MEAN
came from
.
The
WIN32_LEAN_AND_MEAN
symbol was introduced in the Windows 95 time frame as a way to exclude a bunch of Windows header files when you include
windows.h
. You can take a look at your
windows.h
file to see which ones they are.
The symbol was added as part of the transition from 16-bit Windows to 32-bit Windows. The 16-bit
windows.h
header file didn’t include all of those header files, and defining
WIN32_LEAN_AND_MEAN
brought you back to the 16-bit Windows philosophy of a minimal set of header files for writing a bare-bones Windows program. This appeased the programmers who liked to micro-manage their header files, and it was a big help because, at the time the symbol was introduced, precompiled header files were not in common use. As I recall, on a 50MHz 80486 with 8MB of memory, switching to
WIN32_LEAN_AND_MEAN
shaved three seconds off the compile time of each C file. When your project consists of 20 C files, that’s a whole minute saved right there.
Moore’s Law and precompiled headers have conspired to render the
WIN32_LEAN_AND_MEAN
symbol relative useless. It doesn’t really save you much any more. But at one point, it did.
Category
Topics
Author
Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.
Abracadabra proposes winding down after string of hacks years ago left each $1 "stablecoin" token backed by $0.04 in reserves
Web3 Is Going Great
web3isgoinggreat.com
2026-10-15 22:24:38
Abracadabra, the defi project behind the Magic Internet Money (MIM) stablecoin, is shutting down. It blamed its string of hacks: $6.5 million theft in January 2024, $13 million in March 2025, and $1.8 million in October 2025, which altogether left about $21 million in bad debt. According to...
Abracadabra, the defi project behind the Magic Internet Money (MIM) stablecoin, is shutting down. It blamed its string of hacks:
$6.5 million theft in January 2024
,
$13 million in March 2025
, and
$1.8 million in October 2025
, which altogether left about $21 million in bad debt. According to the shutdown proposal, 22 million MIM are in circulation, backed by just $900,000 in "actionable backing" which puts the supposedly dollar-pegged token at about $0.04. Two wallets voted on the proposal.
In June, a similarly low-participation vote handed "stewardship" of the project to a different group which promised to "revitalize" Abracadabra. Days later, treasury wallets sold around $500,000 worth of MIM. In July, the project tweeted that a roadmap to restore the peg was "coming this week," then never posted again. A week after that tweet, Abracadabra-controlled wallets moved about $8.3 million in treasury assets with no explanation, some of it to a Binance deposit address, in what one commentator called "treasury looting". The wind-down proposal doesn't mention the $8.3 million or count it toward what MIM holders could redeem.
Porsche shuts down its NFT project with the floor price down 96%
Web3 Is Going Great
web3isgoinggreat.com
2026-10-15 22:13:02
When Porsche announced its Porsche 911 NFT project at Art Basel Miami in 2022, it promised holders "he opportunity to co-create Porsche's future in the Web3 universe". Turns out there wasn't much to that future.After bungling the mint, selling fewer than 2,000 of the planned 7,500 NFTs afte...
When Porsche announced its Porsche 911 NFT project at Art Basel Miami in 2022, it promised holders "he opportunity to co-create Porsche's future in the Web3 universe". Turns out there wasn't much to that future.
After
bungling the mint
, selling fewer than 2,000 of the planned 7,500 NFTs after buyers balked at the 0.911 ETH (then $1,490) pricetag, the price went nearly exclusively downhill. Now, with the NFTs floundering with
floor prices
down 96% from launch, Porsche has announced it is ending its "shared adventure".
A Center City Philadelphia woman was arrested after allegedly refusing to move out of the path of a delivery robot.
WPVI
Friday, October 16, 2026 1:07AM
PHILADELPHIA (WPVI) --
A Center City woman was arrested after allegedly refusing to move out of the path of a delivery robot.
The confrontation was captured on video and has since drawn online attention.
Philadelphia police said officers responded to the 1200 block of Filbert Street after witnesses reported a disturbance involving Carolyn Marvin and an Uber delivery robot near Reading Terminal Market.
IMAGE: Carolyn Marvin
According to police, Marvin repeatedly blocked the robot's path and ignored multiple commands from officers to move.
She was arrested and charged with disorderly conduct.
Marvin tells Action News she was protesting the use of delivery robots because she believes they are replacing human workers.
"I know they're taking the jobs of human delivery workers and so, I have been protesting them whenever I saw them by standing in front of them and preventing them from going forward," Marvin said.
She said she views her actions as protected speech.
Top Stories
Marvin said she has confronted delivery robots on multiple occasions, including a September incident along Broad Street that also gained attention on social media.
Ashley Baldwin of West Philadelphia said she witnessed one of those encounters.
"I actually thought the robot hit her, so my original question was, 'Are you OK? Did the robot hit you?' And she said, 'No, I have to stop this. They're taking over the world,'" Baldwin said.
Asked whether she plans to continue protesting the robots, Marvin said she does.
"I do. Why not?" Marvin said. "I think it's my First Amendment right to publicly demonstrate on a sidewalk to protest against delivery robots."
Marvin said she hopes the viral incident encourages discussion about delivery robots, artificial intelligence, and their growing role in everyday life.
Pudgy Penguins company shuts down its Abstract blockchain after losing "8 figures" running it
Web3 Is Going Great
web3isgoinggreat.com
2026-10-15 22:00:00
Igloo, the company behind the Pudgy Penguins NFTs, announced it will shut down Abstract, its Ethereum layer-2 blockchain, on December 15. CEO Luca Netz said the company had lost "8 figures" in the less than two years they were running the chain.Users have until December 15 to move their ass...
Igloo, the company behind the Pudgy Penguins NFTs, announced it will shut down Abstract, its Ethereum
layer-2
blockchain, on December 15. CEO Luca Netz said the company had lost "8 figures" in the less than two years they were running the chain.
Users have until December 15 to move their assets, after which anything left on the chain will become inaccessible. DefiLllama estimates there were around $76 million in assets on the chain when the shutdown was announced, leading some users to complain that the wind-down period is too short.
The shutdown comes a few months after Igloo
shut down its
Pudgy Party
mobile game
, which had dropped to around 200–300 active users shortly after its launch, and also lost the company millions of dollars.
LWN.net is a subscriber-supported publication; we rely on subscribers
to keep the entire operation going. Please help out by
buying a subscription
and keeping LWN on the
net.
Sharon Yang is a
Chromium
developer who worked at Google on the browser
and now works on it at Igalia. On the final day of FOSSY 2026, she gave a
presentation on her experiences with both of those companies, comparing and
contrasting the ways each one operates and how that affects work on the
code base. She enjoyed working at Google and feels the same about Igalia,
so the talk was not aimed at complaints—instead it was meant to give a feel
for two companies that are rather different.
The talk was entitled "From Corporate to Co-op" highlighting one of the
main differences between the enormous company, Google, and the
employee-owned cooperative at Igalia. She is from Vancouver and went to
the University of British Columbia, where FOSSY was held. While she was a
student, she did an internship at Google, working on the Chrome browser,
which is the Google product based on Chromium.
In her
slides
,
she showed a photo of herself—complete with propeller hat—in front of a
Google sign.
When she was a student, her life was measured in semesters, but some of the
people she worked with at Google had been working on Chrome for four years,
which was amazing to her at the time. She ended up working at Google
full-time for six years, all of it on Chrome. Most of her work was on the
content layer of the browser, which is part of the open-source Chromium
browser. So she works in the
same
repository
(
GitHub mirror
), and with many of the same people, at Igalia as she did at
Google. She briefly reflected on her time at Google: "
I had a good time
working on Chrome, the people were nice, I enjoyed it, it was cool, there
was lunch, it was good stuff
", she said to laughter.
Eventually, she thought it might be time to move on, and perhaps out of the
Seattle area where she was living, so she started looking around at the end
of 2024. She had seen Igalia email addresses in the code base and met some
of the people from the company at the
BlinkOn conferences
. Igalia is an
open-source consulting company that is hired to work on various things,
including Chromium; it is the largest contributor to Chromium that is not a
browser maker, in fact. She joined Igalia and moved back to Canada a
little less than a year before the talk in August.
Contrasts
She contrasted the two companies, starting with the number of employees:
Google has around 180,000, while Igalia has around 180. In terms of
revenue, last year Google had more than $400 billion, "
Igalia, much
smaller, we'll just say under a billion dollars
", which was greeted
with laughter. Google is owned by institutional investors, while Igalia is
owned by employees, which the audience applauded. Google has a wide range
of compensation, from the CEO's $600 million salary package to her pay
(somewhere in the range of
$100,000-$300,000) when she worked there; at Igalia, all employees are paid
the same, top to bottom and across the globe.
While they are "
massively different entities
", both companies have teams
working on things in common; she works on Chromium, but there are also
teams from each working on accessibility and on web standards.
Chrome and Chromium are "
kind of the same, they're kind of not
".
Chrome is a Google product, with Google branding and colors, while Chromium
is an open-source project that anyone can use to build a browser. Chromium
is missing proprietary pieces like digital rights management (DRM), "
AI
integration
", and certain codecs; "
and it's blue
". There are
various other browsers based on Chromium, including
Microsoft Edge
and
Brave
, as well.
Most of the Google Chrome team members do most or all of their work in the
Chromium repository. Obviously, the proprietary pieces are handled
elsewhere, but she and other Google Chrome developers rarely have to
interact with that code. Near the end of her time at Google, she had to
get help to do a simple task that required access to the "
totally different
universe
" where the proprietary parts live.
She then compared the experience of working for the two companies. The
first week is pretty much the same at any new job, she said. The initial
steps are getting to know your coworkers, reading internal documentation,
learning how to communicate internally, and so on. Igalia has a whole set
of open-source tools that it uses, which is nice.
There are some differences, as well. For example, there is a system for
doing faster builds of Chromium, "
otherwise you'll just spend all your
time building Chromium
". That system is immediately available to
Google employees, but external users have to request access to it. A
bigger area of friction is access to bug reports, which are meant to be
open to everyone unless they are security bugs. Due to a bug-tracker
migration a few years ago, though, there are bugs that should be
visible to outsiders, but are only visible to Google employees. "
It is
not a malicious thing
", and it is easy enough to get the access
fixed, but it is something extra she has to do once a week or so.
There is other information that could be more readily available to the
public, but is not because it is stored in Google Docs without being
shared. Ensuring that the public has access "
is a best-effort thing and
people forget
", which is unfortunate. In addition, all of the tools
for tasks like bug tracking are maintained by Google and, essentially, for
Google, so outsiders have no way to provide feedback or request features and
changes. They are "
relatively minor points of friction
" but they
are enough to feel that "
I am now separate from this
".
After a month in her new job, she started to see even more similarities
with her previous one. The team members are all still available via the same
communication channels (e.g. Slack), and she is likewise available to them.
Some of the work that Igalia does comes directly or indirectly from Google;
she is working a Chromium project that comes through the Linux Foundation,
which Google is a member of. "
I'm working on the same repository, I'm
using the same tools, I'm getting money from Google, what's changed here?
"
Projects
The answer it seems is "
kind of everything and kind of nothing
".
The types of projects are different at Igalia, though. At Google, she
worked on the projects that were important to the people in her management
chain; those are often new features or "
a flashy metric that they want
to improve
". They are often aimed at getting promotions for the
engineers and those in the reporting chain.
The projects handed to Igalia to work on come directly from the technical
staff, so they tend to be "
code-health or tech-debt kind of
projects
". For example, Igalia worked on componentizing the Chromium
code base and its current project is "
improving web-platform-test
interoperability between browsers
". It is important work that is good
to do, but "
it is just so hard to imagine anyone at Google doing it for
their day job
"; it is "
not the kind of work that gets prioritized or
rewarded
". Many of the people that she worked with on Chromium at
Google would love to be able to do that work. "
These are people who care
about the code base, they want it to be good, but there's just no room in
their day job to do that, which is too bad.
"
She was initially attracted to the Chrome team because all of the people on
it seemed to be welcoming. That remained true throughout
her tenure at Google and has continued into her work at Igalia. "
People
who work on Chromium have just generally been friendly and inclusive in all
domains, which is good, and is not to be taken for granted.
" She has
been able to maintain relationships with her former coworkers, review their
patches, leave comments on work that they have in common, and so on.
"
It's a nicer experience than sending a code review to some stranger.
"
Hierarchy
She put up a slide of an organization chart from a typical company, with
her picture in a leaf node as the only filled-in box. In a chart like
that, the engineer is at the bottom of the hierarchy; they have a manager,
who has a more senior manager, and so on. An engineer is concerned with
technical decisions, such as which language to use or how to test the code
being written, while at the top, they are deciding things like company
direction and vision. The people in the middle are doing some technical
work, but it is often not entirely clear what it is that they do; "
who
knows?
", she said to laughter. "
The people at the top are
paid a lot more than the people at the bottom.
"
At Igalia, things are quite different. The "
org chart is intentionally
flat
" and there are no managers. There are various teams, such as the
Chromium team that she is on, a Linux kernel team, and more. The flat
hierarchy means that "
all of the employees do a lot of work that you
typically wouldn't do as a leaf-node employee at a big company
", which
includes making company decisions, such as which projects to take on,
whether to increase headcount, and how much vacation time there is.
Igalia is
a cooperative, so votes are taken on those kinds of questions. "
These
are not decisions you have any influence at all over at a big company.
"
One of the nice things about that arrangement is that the people who are
making the decision are the ones who are affected by it, which is "
just
not the case at a standard company
". The most obvious
example for that is layoffs, Yang said.
There is a cost to doing things that way, of course. The meetings for
those decisions are lengthy and run for two days—in a European time zone.
When she was at Google, she was in the dominant time zone (US Pacific), and
her teammates elsewhere had to have meetings at weird times, so this feels
a bit like karma for her, she said. But that is a "
minor price to
pay
" for a structure that is "
so fundamentally different and feels good
".
It took her a while to fully recognize just how different Igalia's
structure is; the impacts of it did not sink in right away. The biggest
impact for her was promotions, which do not exist in a flat organization
where everyone is paid the same amount. When she was a new graduate,
promotion was her focus because it is expected of new hires; "
Meta
literally fires you if you don't reach a certain level in a certain time
".
Trying to ensure that she was working on the right projects and
"
demonstrating the right skills
" in order to be promoted was
stressful and took a lot of effort. Much of it is out of the engineer's
hands and is up to their manager. She was lucky and had a great manager at
Google, but even if they are good, they have multiple people reporting to
them. "
For you, it's like your whole professional life, but for them
it's one of the million things that they have to do.
"
The flat pay structure is also a welcome change—there are no pay
discrepancies. As a woman and someone who was formerly working on a visa,
"
these are very real concerns you have, and now that's just all
gone
". Everyone is on the same level playing field, which leads to
more trust and collaboration.
"
If that sounds fun, go join or start a coop
", she said to applause.
That was the end of her prepared talk, but
she had plenty of time for questions, which were numerous, perhaps
unsurprisingly.
Q&A
The first was about where direction came from in a flat structure; how are
decisions made about what she should work on? That depends on the project,
Yang said, some are closely aligned with the engineers at the client
company, while other projects are less hands-on. When working with the
client's engineers, the direction likely comes from the client side as in a
more typical organization. Sometimes projects are more open-ended, where
the client agrees to pay for work on a specific task for, say, a year to see
where things end up; in that case, the Igalia team decides on what to tackle.
Another attendee wondered what it was that Igalia's clients needed done
with Chromium. Once again, it varies, she said. Her project is cleaning
up the testing, which is something that Google wants and it does not fit
anywhere in its team. Other clients want customized browsers for internal
use, so parts of the Igalia Chromium team are also working on downstream projects.
The hiring process was up next. One attendee wondered how Igalia decided
that it needed to hire for a position and how the person to hire was
chosen. "
Which teams get headcount is decided at a company level
",
she said, so if the Chromium team wants to hire, it makes a pitch to the
assembly, which is the voting body. If that is approved, the team will
interview candidates and choose who it thinks should be hired, which goes
back to the assembly. Normally, that choice will be approved unless there
is some red flag that someone elsewhere in the company is aware of. Yang
reminded attendees that she was still fairly new at Igalia, but that there
were other employees sitting in on the talk who might chime in to help
clarify things; in this case she just got a thumbs up from them, she said.
Having 180 employees in a flat structure already sounds a bit unwieldy, an
attendee noted, is there a size where Igalia will essentially be forced
into a hierarchical structure just because of its size? Yang said that she
asked the same thing when she was interviewing, "
everyone agreed that
this is definitely an issue but there's not a clear solution yet
".
Her partner suggested that honeybees might provide a reasonable model of
how a split could be done; when a hive gets too big, part of the hive
leaves as a
swarm
to
found a new hive.
An employee at another employee-owned coop suggested that there were
synergies between open source and cooperatives, which might help when the
time comes to split up. He wondered if there were plans for Igalia to
release its internal tools and coop-operating documents as open source,
which could facilitate a new, separate company if that was needed. Yang
noted that her coworker Danielle Mayabb had a
session in the next
slot
about running the company using FOSS tools.
A researcher who studied companies with flat structures asked whether some
of the organizational structure came back into the picture within the
different teams. The teams are responsible for decisions like whether to
take a project or not, Yang said, and there are product managers that
coordinate between teams. The product managers work closely with clients,
but they have no inherent extra power, like a manager at a typical job.
Along the way, she had said that she was not yet part of the assembly, so
an attendee asked how that worked, how long it took, whether a vote was
needed, and so on. Yang recommended the
video
of a talk
by Valerie Young
at the first FOSSY in 2023, which goes into more detail.
Yang said that somewhere around the one-year mark it
would be decided whether an employee would join the assembly, though she
did not specify exactly how that was done. "
If you've done an
exceptionally bad job, you won't be permitted in.
"
That was a good segue to the next question, which was about what would prevent
an employee in the coop from just ceasing to work. In a flat hierarchy,
who is monitoring what employees are doing? Can someone just stop working
without detection? She joked that she would give it a try and come back
next year with a talk on that. More seriously, there are people who are
providing feedback on the performance of their coworkers; each person has a
mentor in the company who fills some of the roles of a manager at other
companies, including gathering assessments of the work that is being
done. "
People are monitoring your performance and it is a collection of
all of the people that you work with.
"
An attendee noted that there is a saying in the coop movement: "
If you've
seen one coop, you've seen one coop.
" That is why it is so helpful for
coops to share their internal structure; as with open-source software,
other coops can learn from the trial and error that went into forming the
coop. Yang noted that there used to be a coop track at FOSSY and that there
was talk of bringing it back for next year.
[I would like to thank the Linux Foundation, LWN's travel sponsor, for its
assistance with my trip to Vancouver for FOSSY.]
Near Intents exploited for $3.8 million, recovers all assets
Web3 Is Going Great
web3isgoinggreat.com
2026-10-15 21:46:51
Near Intents, a cross-chain swap service, halted operations after an attacker drained around $3.8 million by exploiting a bug in its Omni layer.The next day, Near Intents posted addresses for returning the funds and threatened the attacker: "We have identified you, sir." The attacker return...
Near Intents, a cross-chain swap service, halted operations after an attacker drained around $3.8 million by exploiting a bug in its Omni layer.
The next day, Near Intents posted addresses for returning the funds and threatened the attacker: "We have identified you, sir." The attacker returned everything the next day, in a transaction that included an on-chain message saying "We've returned all the funds, we were in the wrong". Near Intents confirmed the funds were returned, and said they were stopping their investigation.
Any window from your Mac, on your iPhone and iPad.
Sill shows a window from your Mac, or the whole desktop, on your iPhone or
iPad. You use it there with touch, a trackpad, a keyboard or Apple Pencil.
Sill for Mac captures the window, encodes it as HEVC video and sends it to the
Sill app on your device. Your taps, clicks, scrolls and keys go back to your
Mac. Your Mac and your device connect on the same network, over a USB cable,
with Direct Wireless Connection when they share no network, or through your
own VPN, such as Tailscale, with Remote Access. There is no account and no
server in between.
Sill for Mac is a free, notarized download from
getsill.app
; with
Homebrew
,
brew install --cask saffsanity/sill/sill
installs the same download from
Sill's own
tap
. Sill for iPhone
and iPad is free on the
App Store
,
and you can also build it from source (below).
Screenshots
These are the iPad screenshots from the App Store; on iPhone and iPhone Duo,
Sill has layouts of its own.
Requirements
A Mac with Apple silicon, on macOS 14 or later.
An iPhone or iPad with iOS 17 or iPadOS 17 or later.
On your Mac, Sill asks for Screen Recording, to show your windows, and
Accessibility, to click, scroll and type for you and to move and size the
window it shows. On macOS 15 or later, also allow Local Network. On your
iPhone or iPad, Sill asks for Local Network, to find your Mac, and for the
camera when you scan your Mac's pairing code (you can type the code
instead).
Your Mac and your device on the same network, joined by a USB cable, or near
each other with Direct Wireless Connection on. Away from home, your own VPN,
such as Tailscale, with Remote Access on.
How it works
Sill for Mac
lives in the menu bar. When your device picks a window, or
the whole desktop, Sill captures it with ScreenCaptureKit and encodes it as
HEVC with VideoToolbox, on the hardware video encoder in your Mac (or, while
that is busy, in software). It captures nothing while no device is connected.
The picture
goes over an encrypted connection (TLS 1.3) straight to the
Sill app on your iPhone or iPad, which decodes and shows it. When the
encoder or the link falls behind, Sill drops frames rather than queue them,
so the picture stays current.
Your input
goes back the same way: taps and clicks, scrolls with
momentum, the on-screen trackpad, keys and typed text, and Apple Pencil as
the pointer. Sill for Mac turns it into mouse and keyboard events, which
needs Accessibility. A keyboard attached to your device types on your Mac as
soon as the picture shows, Esc included, and a trackpad or a mouse scrolls
the window under its pointer. Three fingers swipe and pinch as on a Mac's
trackpad: Mission Control, App Exposé, the Spaces, Apps and Show Desktop,
through the keyboard shortcuts your Mac has for them.
On iPhone
, held upright, the picture is on top with buttons, keys and a
trackpad below. Larger Picture, in the settings panel, gives a window's
picture the room of the window thumbnails, down to where the keyboard comes
up; the Desktop keeps the usual layout. A window keeps its own shape until
you set its text size with Aa, or turn on the virtual display; then your Mac
makes it fill the taller picture.
The clipboard
goes both ways while Share Clipboard is on, in both apps:
text you copy on your Mac is ready to paste on your device, and Paste in
Sill sends what you copied on your device to your Mac's clipboard, where you
press ⌘V. Sill never reads your device's clipboard by itself, and copies a
password manager marks as concealed stay on your Mac.
On iPhone Duo
, Sill follows the hinge: open it flat and your Mac fills
the inner display; half open, the picture is above the fold with a trackpad
and keys below; closed, Sill runs on the cover display. Nothing you touch
sits on the fold.
The menus
of the app you use reach your device too: in the iPad's own
menu bar on iPadOS 26 or later, and behind the Menus button in Sill's bar.
Sill for Mac reads each menu from the app as you open it and chooses the
item you pick, through Accessibility. When someone moves the mouse at your
Mac, your device shows the pointer where it is.
Nearby
, your device finds your Mac with Bonjour on your local network.
Over a USB cable, your Mac shows as Wired and the connection uses the cable.
With no shared network, Direct Wireless Connection (off by default) connects
over peer-to-peer Wi-Fi, the way AirDrop does.
Pairing
: you pair each iPhone or iPad with your Mac once. Tap your Mac on
the device, and your Mac shows a code: scan it, or type its 12 digits. Over
a USB cable the device pairs by itself. From then on each end knows the
other's key, and every connection, nearby or away, is pinned to those keys.
In Sill's Settings on your Mac, Devices lists the devices you paired, and
you can remove any of them there.
Away from home
, Remote Access (off by default) lets the devices you
paired reach your Mac through your own VPN or a port you forward on your
router; a device learns how the next time it connects at home with Remote
Access on. A device away from home gets a quality of its own, Low at Standard
resolution until you pick another there or in Sill's settings, so a slow
connection never starts at your home quality; your home quality comes back
as soon as a device at home connects. When your device comes home and your
network lists your Mac, the session moves to your network by itself.
When the link can't keep up
, Sill for Mac notices that it is holding
frames back and tells your device, which says so over the picture and, in
its Settings, offers a quality the link can carry.
Text size
: Aa on your device resizes the window you stream on your Mac,
through Accessibility, so its text shows at the size you pick, and keeps it
at that size while it streams. The window goes back to its own size and
place when Sill stops showing it: you pick another window or the Desktop,
your last device disconnects, or you quit Sill. If you moved it on your Mac
meanwhile, it keeps its new place.
The virtual display
(off by default) moves a window you stream onto a
display of its own on your Mac, so it keeps updating when other windows
cover it. It uses a private macOS API, which is one reason Sill for Mac comes
from the website and not from the Mac App Store.
Good to know: Sill shows one window, or the whole desktop, at a time, and it
does not play sound from your Mac. The clipboard carries text only, up to 256
KB at a time, and only between apps that both have it. Your Mac needs to be
awake, with Sill open. Sill may not be able to wake it. After a restart Sill
opens only once someone logs in, with Launch at Login on. Only the iPhones and
iPads you paired can connect, unless you turn off Require pairing in Settings
› Devices; then any device on your network can, still encrypted. Pairing at
home came with Sill for Mac 0.4.0 and Sill for iPhone and iPad 0.5 (2), and
each needs the other: the iPhone and iPad app shows an older Sill for Mac as
"Update Sill", and an older iPhone and iPad app can't connect to Sill for Mac
0.4.0 or later at home. Since 0.5.1 the two apps share one version number for
each release. With Sill for Mac 0.3.1 or earlier, connections on your local
network, over the cable and over Direct Wireless Connection are not encrypted,
and anything that reaches your Mac there can connect without pairing: update
it.
Tips
Sill is free, with no ads, no tracking and no subscription. If it is useful to
you, a tip through
GitHub Sponsors
helps pay for the developer account. A tip unlocks nothing: every feature is
free.
Building from source
You need a Mac with Xcode (Sill is built with Xcode 27; the iPhone and iPad
app needs Xcode 27.1 or later, for the iPhone Duo's hinge and fold), selected
as the active developer directory, with its license accepted.
Sill for Mac, from the repository's folder:
Scripts/make-app.sh --install --open
This builds Sill.app with SwiftPM, signs it with your Apple Development
identity, replaces /Applications/Sill.app and opens it. If that was the Sill
for Mac you downloaded, grant Screen Recording and Accessibility again and
pair each device again: the download keeps its key and paired devices in the
data-protection keychain, which only a Developer ID build with the project's
provisioning profile reads, and a build of your own keeps them in your login
keychain. Without
--install
it only builds
.build/Sill.app
. With no Apple
Development identity it signs ad hoc, and then Screen Recording and
Accessibility have to be granted again after every build.
For work on the host itself,
swift run -c release SillHost
runs the same
host on the command line, with one difference: unless you add
--pairing
, its
home door is plain and open, with no pairing and no encryption, and any device
on your network can connect to it, so run it only while developing. The App
Store's Sill for iPhone and iPad never dials such a door ("Update Sill"); a
Debug build from this repository can (
docs/DEVELOPMENT.md
,
Pairing at home). With
--synthetic
it streams a test pattern with no Screen
Recording needed.
The iPhone and iPad app:
Open
iOSClient/Sill.xcodeproj
.
In the Sill target's Signing & Capabilities, pick your team, and change the
bundle identifier
me.saffer.sill
to one of your own.
Run it on an iPhone or iPad on the same network as your Mac, and tap your
Mac. The first time, a Sill for Mac built from this repository asks you to
pair: scan the code it shows, or connect the device with a USB cable.
docs/DEVELOPMENT.md
has the rest: every command-line
flag, the test tools and the simulator harness, permissions and how to reset
them, Remote Access, troubleshooting and releases.
Contributing
Issues are welcome: bug reports, questions and ideas. For a pull request, keep
to the conventions and decisions in
CLAUDE.md
: Swift and Apple
frameworks only, no third-party dependencies, nothing that needs a server, and
latency before picture quality. Open an issue before starting anything large.
Before a pull request,
Tests/checks/run-all.sh
runs the same pure checks as
CI, in about five minutes and with no device.
Contributions are accepted under the project's license. Please report a
security problem privately, as
SECURITY.md
says, not in a
public issue.
About a month after Michigan’s August 4 Democratic primary for U.S. Senate, where Dr. Abdul El-Sayed, depending on how you look at it, won in an upset or survived a squeaker, he sat down with a roundtable of Black mayors and elected officials across the state. The primary results clearly showed that El-Sayed had to take immediate steps to win over Black voters who had backed his chief rival Rep. Haley Stevens in the primary, and this meeting was part of the strategy.
At multiple points during the meeting, the mayors and representatives said they didn’t see El-Sayed enough during the primary. A few of them went further and argued that the Democrat hadn’t campaigned in their areas at all.
El-Sayed listened before politely, but firmly, pushing back.
“I’ll just tell you, through the course of the primary, I’ve actually been to every one of your cities,” El-Sayed said, looking around the table. He conceded that he may not have campaigned directly with each of them—some had backed Stevens—but he had sought the votes of all their constituents.
El-Sayed continued that, as health commissioner of Wayne County, which is
37 percent Black
, he had been a very “hands-on public servant” and planned to stay that way as a senator. He promised to be more visible in the leaders’ communities and to prevent the feeling that he was taking them for granted. “I want to understand what the problems are, and I want to figure out how I can partner together to solve them,” he said.
The 41-year-old progressive has fielded a fair share of criticism from important voting blocs in Michigan since winning the Democratic nomination. He has had to
push Democrats to coalesce
around his campaign and heal the scars from a contentious primary, during which he weathered over $60 million in attack ads. Foremost among these scars was the fact that African Americans came out for Stevens in a lopsided way that he could not ignore.
“He did not do well in the primary with Black voters outside of the 30 counties that he won,” Bernie Porn, the EPIC-MRA pollster who is seen as the best in the state, told me. “He would not have won the primary were it not for the overwhelming support he got among younger voters.”
Some Jewish voters in the state continue to warn that their support, too, may be up for grabs unless El-Sayed changes his answers on Israeli sovereignty and Palestine. And then there is Michigan’s Arab community, a small but critical voting bloc that strategists presume will decisively vote for El-Sayed despite shifting some support to Republicans and Donald Trump in recent years.
Bilal Beydoun, a Dearborn-based Democratic strategist and writer, said that in the Arab community, El-Sayed was bolstered by a few Arab American candidates who ran grassroots campaigns. But those candidates have won their primaries in safe Democratic seats, so that might detract from the ultimate turnout in November.
“For the Arab Americans who do turn out of course I expect them to fully back El-Sayed, and not just because he’s Arab American. I think that’s a lazy overall point that people are going to make,” Beydoun said. “His anti-war message is quite unprecedented and revolutionary. He would be the first Muslim senator, he would also be the first anti-war senator from Michigan in my lifetime.”
Even as the front-runner, El-Sayed’s calculus for winning the Senate seat is complicated. He overcame two better-known rivals in the primary with an outsider campaign. But in the general election, El-Sayed must maintain support from the Arab community and bolster support among African Americans—especially those who couldn’t bring themselves to vote for him in the primary.
Party regulars coming home after an extended and bitter primary isn’t unheard of. But electoral scar tissue can be persistent. The rub for El-Sayed is that there is a history in Michigan of the Arab American and Black communities being at odds with each other. El-Sayed is asking them to rally around the same candidate in an election where his opponents have actively worked to keep those constituencies divided.
“There are different interests,” said former Michigan House Speaker Joe Tate, a Democrat who attended the roundtable with El-Sayed. “And sometimes that can show itself as points of friction.”
Simmering Tensions
There are almost 400,000 Arab Americans in Michigan, according to the Arab American Institute. That’s nearly 4 percent of the state’s population. About 14 percent of Michigan’s population is African American, about 1.41 million voters, according to census figures.
Broken down by party affiliation, the vast majority of African American voters in Michigan are Democrats—about 83 percent, according to a Pew Research Center survey of voters. Black voters in Michigan have consistently leaned heavily Democratic in recent elections, even when Republicans and Donald Trump made gains among that constituency. Meanwhile, Arab American voters are more evenly split, with 38 percent identifying as Democrats or Democratic-leaning and the same percentage identifying as Republican or Republican-leaning, according to a national Arab American Institute poll.
In 2024, Trump’s re-election campaign worked to rally Arab voters, with former director of national intelligence Ric Grenell taking point on outreach. This was ultimately successful, as Trump
won Dearborn
, a famously majority-Arab city, by six points over Kamala Harris. That support helped the Republican president win the state for the second time in three tries.
During the August primary, El-Sayed won almost 80 percent of the vote in Dearborn. But he struggled among Black voters, getting crushed by Stevens in the majority-Black parts of the state. The dichotomy in how the two constituencies voted for El-Sayed reflects broader differences.
Arab voters strongly oppose U.S. support for Israel’s actions in Gaza. Throughout El-Sayed’s Senate campaign, he’s been one of the more outspoken Democratic Senate candidates in support of Palestinian rights and in opposition to robust economic aid to Israel over the war in Gaza. He’s refrained from giving a one-word answer about whether Israel has a right to exist. He supported the Uncommitted movement during the 2024 Democratic primary, when President Joe Biden was running for re-election, before endorsing Vice President Kamala Harris for president when she became the nominee.
Former Rep. Mike Rogers during a televised debate with Abdul El-Sayed, October 8, 2026, in Grand Rapids, Michigan. (Photo credit: Paul Sancya/AP Photo // The American Prospect)
Some Black voters, by contrast, have viewed El-Sayed skeptically for initially refraining from backing the Biden-Harris ticket and, effectively, withholding support from the first Black vice president in American history. And here, El-Sayed is running up against some deep fault lines.
“I think Abdul is facing a couple of challenges that might not be his fault. One of them is that there has been a historic conflict between Black folks and Middle Eastern folks in Michigan,” said Macomb County Commissioner Michael Howard, who is Black. “Some of the relationships have been absolutely great, and some of it has been absolutely contentious, and there has been some conflict there.”
Howard added that Harris’s loss in Michigan left Black voters feeling like, “Our candidate was put up, and you folks turned your backs on us. So that’s two strikes” for Abdul.
The tensions between the two communities go beyond politics. In September, a car crash involving an 18-year-old Arab woman and a 49-year-old Black woman resulted in an angry crowd of Arab American men surrounding the Black woman and yelling racial slurs at her. Activists and community leaders have pointed to that example.
“Unfortunately, there has been a lot of friction … I think more so in a lot of the Arab-owned businesses and in the way Black residents feel they have been treated,” Joel Rutherford, a longtime community activist and local government official, told me. Rutherford cited the car crash incident and said, “Once people hear about it, let’s face it, those kinds of things spread like wildfire. And unfortunately, because it seems like that’s happened [multiple times] over the years, that’s just exacerbated the problem. It’s something that, to me, the communities haven’t taken the time to really get to know each other. They’ve kind of decided that one group is on one side, one group is on the other.”
Political Outreach
El-Sayed and his team took his narrower-than-expected primary win to heart. Since becoming the nominee, he has participated in roundtable discussions with Black leaders. He’s campaigned with former Vice President Kamala Harris (even as other candidates have recoiled at the prospect), as well as Sen. Lisa Blunt Rochester (D-DE), one of the few African American legislators in the Senate. El-Sayed has appeared on numerous Black-focused podcasts, like The Breakfast Club and Higher Learning. Former President Barack Obama is scheduled to stump for El-Sayed and other Michigan Democrats later this month.
Obama formally endorsed El-Sayed on Monday in a
campaign ad
. But there have been bumps. A
CNN report
found that in 2012, El-Sayed wrote a critical essay about Obama’s presidency. El-Sayed recently
walked back that criticism
, likening Obama to a father figure that he can admire without unilaterally supporting all his actions.
Obama has likewise defended his plans to campaign for El-Sayed. “I’m going to go to Michigan to campaign for Abdul El-Sayed. And people are like, ‘Well, he’s really left-wing,’” Obama said at a recent fireside chat in Virginia. “But I don’t know, he’s for a higher minimum wage and health care for all, and it doesn’t seem crazy to me. You know, FDR was for that too.”
El-Sayed has enjoyed consistent but less visible support from Arab donors and outside groups dating back to when he unsuccessfully ran for governor. During the Senate primary, an under-the-radar super PAC called American Priorities,
formed
to counter spending from the American Israel Public Affairs Committee (AIPAC), spent $600,000. El-Sayed was endorsed by Michigan Rep. Rashida Tlaib, a progressive favorite and one of the few sitting Arab Americans in Congress. The Arab American Political Action Committee and
The Arab American News
both endorsed him, as did Abdullah Hammoud, the mayor of Dearborn. On primary day, El-Sayed won 70 percent of the vote in Dearborn Heights, which has a large Arab American population.
In the general election, El-Sayed has enjoyed support from prominent Muslim leaders, too. New York City Mayor Zohran Mamdani recently appeared at a tightly controlled fundraiser for the Democratic nominee in New York. Others, like Rep. Ilhan Omar, have been early supporters. The conventional wisdom has long been that El-Sayed would enjoy strong support among Arab American voters.
But for all the tacit support El-Sayed has maintained among Arab voters in Michigan and nationally, and the work he’s put in to shift the backing Stevens enjoyed among Black voters to his side, El-Sayed has not built an unbreakable coalition. His leads in polling, while clear (
21 of the last 22 polls
since Labor Day show him in front), are not overwhelming.
The Homestretch
For months, the campaign of El-Sayed’s Republican opponent, former U.S. Rep. Mike Rogers, has attempted to shave off slices of voters from various Democratic-leaning constituencies. The Rogers campaign has aggressively touted any support he’s built among Democrats to ease Democratic discomfort with crossover voting. (Some of this appears disingenuous; notable members of the “Democrats for Rogers” coalition have
supported Republicans for years
.)
Following this pattern, Rogers and his team have made plays to disillusion Arab voters with El-Sayed and attract African American voters. The Rogers campaign ran an ad featuring a young Persian American man arguing that El-Sayed is too closely linked to radical Islam and al-Qaeda. In the first of two debates Rogers is set to participate in, he repeatedly attacked the Democratic nominee on those same tenuous attack lines.
Another ad Rogers released on Monday featured three Black Michiganders talking directly to the camera about how they are voting for Rogers because El-Sayed is “too arrogant and way too extreme.” Rogers obviously doesn’t want to make the campaign about an unpopular president; he’s tried to mildly break from Trump over the trade war with Canada, for example. His pitch is that Black voters, Arab voters, Democrats, and Republicans all need to vote for him to block a dangerous, radical proxy for terrorism from entering the Senate. A different Democrats for Rogers ad features a number of Black voters saying they planned to vote for Rogers. There is also a line in the ad that says, “He cares more about the West Bank than West Detroit,” even though there is no West Detroit.
One of the latest—and likely among the final few—campaign ads for El-Sayed is called “War,” which trumpets the Democrat’s opposition to “Trump’s war abroad” and the exorbitant spending that comes with it. In multiple frames, the ad features El-Sayed smiling in a flannel shirt, with an acoustic guitar playing in the background. It’s a clear pushback against the abrasive, radical caricature of El-Sayed that Republicans want to portray.
El-Sayed’s campaign is taking a multipronged approach to the final stretch of the campaign. They are working to build support in the northern and more rural parts of the state while also trying to close the deal with voters who supported Haley Stevens—especially around Detroit—and make sure not to reverse any gains Michigan Democrats have made with Arab voters, who not so long ago backed Trump but are drifting left.
El-Sayed has held private fundraisers with prominent Muslim, Arab, and African American donors and leaders in the final stretch of the campaign. His campaign is slated to hold another one with former Detroit Mayor Dennis Archer, one of the city’s more successful recent mayors, who is Black.
I recently asked a top Michigan strategist with extensive campaign experience in the state if it’s fair to expect robust Arab turnout for El-Sayed. In response, the strategist said, “Yeah, but it’s just a very small percentage of the vote.”
Still, it is an important bloc of support. Margins of victory in Senate races in Michigan have shrunk dramatically over the past two decades. Twenty years ago, Debbie Stabenow won her 2006 Senate race by almost 16 percentage points. The late Sen. Carl Levin won his 2008 Senate race in a wave election by almost 29 percentage points. Yet the most recent Senate race between now-Sen. Elissa Slotkin and Rogers was decided by fewer than 20,000 votes, or 0.3 percentage points.
In other words, in a state where over eight million Michiganders vote, a large chunk of the 300,000 to 400,000 voters who identify as Arab could make the difference.
El-Sayed has, in character, presented an optimistic front. He’s recently predicted in multiple interviews that he could win by as much as seven percentage points, even as polling averages show him leading Rogers by 2.7 points.
The indicators suggest that this is a wave election year for Democrats, so it’s conceivable that a candidate like El-Sayed—who is enjoying large crowds in redder parts of Michigan—could win by a healthy margin. But it’s even easier to imagine El-Sayed, having overcome a bruising primary and an only slightly less arduous general election, eking out a victory by a minuscule number of votes. In that scenario, support from as many Black and Arab voters as possible would be invaluable.
“I think there’s a general sense that this will be a close race,” Tate said, adding, “In my mind, whatever friction points [Democrats] do have, Trump is overshadowing the whole thing.”
El-Sayed’s campaign has worked to turn Donald Trump’s support for Rogers and some of the Rogers campaign attacks into an advantage. On Wednesday, the campaign tweeted out a clip of El-Sayed where he says, “We’re too busy fighting each other because of our differences to realize they are picking our pockets at every turn.”
Daniel Strauss
is a Washington, D.C.–based political reporter. He has written for New York magazine, Slate, and Vanity Fair, and has worked as a reporter for CNN, The New Republic, The Guardian, Politico, and Talking Points Memo.
More by Daniel Strauss
]
★ Initial Thoughts on This Week’s New Apple TV 4K (4th Generation) and HomePod Mini 2
Daring Fireball
daringfireball.net
2026-10-15 21:18:29
At the old pre-June prices, you could buy a 128 GB Apple TV and a pair of HomePod Minis for $350 ($150 + $100 + $100). Four short months later, with today’s new models, that combination would cost $600 ($300 + $150 + $150)....
The new Apple TV 4K features three far-field microphones, letting
users control what they’re watching and discover new shows
completely hands-free. Advanced echo cancellation intelligently
isolates a user’s voice from background sound to deliver
crystal-clear “Hey Siri” or “Siri” recognition, even while audio
is playing.
This is nice, but I don’t think it buys me anything, because my existing Apple TV 4K is paired with 2nd-gen HomePods, and the HomePods each have a “four-microphone design for far-field Siri”.
The A19 chip in the new Apple TV 4K delivers up to 50 percent
faster CPU performance and up to 2× faster GPU performance than
the previous generation, for greater responsiveness, faster
navigation, and smoother animations. The A19 chip also includes a
new, dedicated AV1 decoder, enabling more efficient, high-quality
streaming while using less bandwidth.
The new AV1 decoder seems like it might be meaningful, but does anyone think UI navigation and animation smoothness is improved by going from the A15 to the A19 SoC? I mean navigation is going up/down/left/right. I’m sure the graphics and CPU improvements matter for gaming, but the only mention of gaming in Apple’s own Newsroom announcement is this sentence: “With Apple Fitness+, the living room becomes a workout studio, while Apple Arcade and the App Store’s library of games turn it into a home arcade.” I wish it were otherwise, but gaming is such an afterthought on Apple TV that it only garnered the second half of a sentence that started with Fitness+, a service that has only been in the news this year
because Mark Gurman says Apple laid off part of the team
.
The new Siri Remote keeps its familiar design while adding Find My
support with Precision Finding and an option to play a sound on
the remote — making it far easier to locate.
That’s my single favorite feature in the announcement. I hate to say it though, but the previous remote should have supported these features. The 3rd-gen Apple TV 4K came in 2022, but
Apple launched AirTags with Precision Finding in 2021
. Remote controls are right after keys on the list of things people misplace most frequently, and Apple’s remote controls, because they’re small and thin, are particularly susceptible to being snatched by couch-cushion gremlins. Speakers, so the remote can play a sound to help you find it, were invented even earlier than 2021.
Pairing HomePod with Apple TV 4K already offers users an immersive
viewing experience that’s easy to set up, and the new Apple TV 4K
takes it even further. For the first time, users can create a
four-speaker surround sound experience with Apple TV 4K (4th
generation) and HomePod mini 2. The four speakers work together
with Apple TV 4K to intelligently recognize their position in the
room so audio timing and levels are automatically calibrated to
the space. HomePod (2nd generation) can also be used in this
four-speaker setup for the ultimate audio experience, as long as
the front and rear speaker pairs match.
This is tempting to try. In other words, in addition to the two 2nd-gen HomePods I already have paired in my living room, I can add two of the new HomePod Mini 2’s behind the sofa for surround sound.
The elephant in the room, though, is price. Before this week, Apple sold two models of the 3rd-generation Apple TV. On a percentage basis, they were hit the hardest of any products Apple sells by
the company’s across-the-board price increases this summer
:
Before
June 25
Change
HomePod
$300
$350
17%
(Old) HomePod Mini
$100
$130
30%
(Old) Apple TV 64 GB
$130
$200
54%
(Old) Apple TV 128 GB
$150
$250
67%
The new Apple TV 4K announced this week only comes in one model, and it costs $300. It’s great that there’s only one model for simplicity’s sake, but the number one complaint when the previous generation cost $130/150 was that it was too expensive compared to set-top boxes and sticks from Amazon and Roku. (Or the “free” option of using the “smart TV” software that comes with every TV set.) Now, with the new Apple TV, it’s twice as expensive — and Apple is not keeping the 3rd-gen models around as lower-priced options. I still think it’s worth it, personally, but the general consumer market thought the old prices were too high and I don’t see any of the new features making Joe or Jane Consumer think “
Sure, I was skeptical about the old one at $130, but this new model, which looks exactly the same, this seems worth $300.
”
HomePod Mini 2 now costs $150. That’s not too much of an increase over the new-since-June-25 $130 price for the old HomePod Mini, but it’s a stiff 50 percent increase from
the old HomePod Mini’s $100 price from November 2020 through June 24 this year
. I generally round Apple’s prices up from their “99” values, but it’s worth noting that what I’m calling $100 was actually $99, and going to just two digits
does have a psychological effect on buying behavior
. Again, I think $150 is a reasonable price for the HomePod Mini 2, but it doesn’t feel as much like a lark as $99 did. $99 was a bit of a “
Sure, let’s get another one
” price; $150 is more of a “
Do we really need another one of these?
” price.
At the old pre-June prices, you could buy a 128 GB Apple TV and a pair of HomePod Minis for $350 ($150 + $100 + $100). Four short months later, with today’s new models, that combination would cost $600 ($300 + $150 + $150). That price difference is much more striking than any of the new and improved features in the products.
Blur NFT marketplace to shut down
Web3 Is Going Great
web3isgoinggreat.com
2026-10-15 21:13:52
Blur, the NFT marketplace that overtook OpenSea in trading volume shortly after its 2022 launch, announced it will shut down its website in a month. They also announced that Blend, Blur's NFT lending platform, will stop matching new loans on the same day. Borrowers have until then to repay ...
Blur, the NFT marketplace that overtook OpenSea in trading volume shortly after its 2022 launch, announced it will shut down its website in a month. They also announced that Blend, Blur's NFT lending platform, will stop matching new loans on the same day. Borrowers have until then to repay their loans or let them default.
The announcement comes days after the Blur team said it would also
shut down Blast
, its Ethereum layer-2 blockchain, because it cost more to run than it earned.
Blast, the Ethereum layer-2 created by the team behind the Blur NFT marketplace, is shutting down less than three years after launch. In the announcement, they disclosed that its costs now exceed its revenue and that it sees "no credible path" to fixing that. Despite once boasting of more t...
Blast, the Ethereum
layer-2
created by the team behind the Blur NFT marketplace, is shutting down less than three years after launch. In the announcement, they disclosed that its costs now exceed its revenue and that it sees "no credible path" to fixing that. Despite once boasting of more than $2 billion in
total value locked
in June 2024, generating revenue from network usage of around $3.5 million, that revenue has collapsed to less than $2,000 last month.
The announcement came two years to the day after Deno 2 shipped. Bun
joined Anthropic
ten months ago. The tempting conclusion is that the alternative-runtime experiment is over & Node has won by default. In reality, the ecosystem has gotten the benefits Deno was pushing, just not from Deno itself.
Competition is imperative to a healthy ecosystem
Unfortunately, Deno never really hit critical mass in production; Node is as dominant in 2026 as it was in 2018. What Deno did achieve was to reinvigorate & put pressure on the incumbent, & that pressure didn't only run one way.
Deno started as a clean break. Ryan stood up at
JSConf EU in 2018
& listed what he'd do differently from Node: deny-by-default permissions, TypeScript as a first-class input, web-standard APIs on the server, ES modules only, a single executable. And, pointedly, no
npm
, no
package.json
& no
node_modules
. Dependencies were URLs. The
slides
put it plainly: "There is no need to list dependencies."
A lot of us who'd spent years on npm & Node were skeptical of that last part (not the permissions or the TypeScript, which were obviously good) & said so at the time. We'd been there before, in the hotlinking era, when every page pulled
jquery.min.js
off somebody else's server & broke when it moved or got compromised. A URL tells you where something was, not what it is. Once you care that the bytes you tested are the bytes you ship, you need an integrity hash & somewhere to record it, & you've reinvented the lockfile. Matteo Collina of the Node TSC
said in 2020
that "another left-pad incident is waiting to happen, but this time there is no 'central entity' that can fix it." Some of this skepticism was defensive but happened to be right in the end.
Deno 1.0 shipped in 2020 on the original terms, & then spent the next four years walking them back one piece at a time. First the
deps.ts
convention, one file that re-exported every URL: a manifest in all but name. Then
lock.json
, an integrity hash per URL: a lockfile. Then import maps, so you could write bare specifiers again. Deno's own documentation
today
recommends registries over HTTPS imports because they "can drift to different versions across files" & "trust the serving host." Those were the objections from 2018, restated as guidance.
Then Bun showed up.
Bun 0.1
was released in July 2022 with the opposite bet: rebuild the toolchain from scratch for speed, but run existing npm packages, read
package.json
& act as a drop-in replacement for
node
. About six weeks later, Deno published
"Big Changes Ahead for Deno"
, announcing
npm:
specifiers, a commitment to make 80–90% of npm packages work within three months & a new goal of being "the fastest JavaScript runtime." Deno credited user feedback for the shift; the timing suggests Bun was a large part of it.
Deno 2
, in October 2024, finished the job with full Node & npm compatibility. Four years after launching as the alternative to Node's ecosystem, Deno had become another way to run it.
That was the right call, & it was also an admission that the ecosystem wasn't going to abandon over a decade's worth of dependencies overnight. Cloudflare's
workerd
, which it
open-sourced in 2022
, grew its own Node compatibility layer for the same reason: that's where the packages are.
Node ended up needing to respond. Since 2018 it has shipped a global
fetch
,
WebSocket
, Web Streams & Web Crypto; a
stable test runner
&
--watch
;
--env-file
& single-executable builds; a stable
permission model
;
type stripping
on by default;
node:sqlite
; &
require(esm)
. Node's contributors (many volunteers) did the hard work to listen & make big changes, & they deserve a ton of credit for it, but I don't think it happens on that timeline without three other runtimes shipping many of these ideas first. A mature open source project rarely lacks good ideas. It lacks urgency, & competitors supply that urgency.
The standards work came out of the same pressure:
WinterCG
formed in 2022 because several serious runtimes made "what's the minimum common API?" a practical question, & now, as
Ecma TC55
, it should outlast whichever runtimes consolidate next.
Package managers & registries
For most of its history the JavaScript package ecosystem was a monoculture: one client, one registry, & an API contract informal enough that it stayed
effectively undocumented
for a decade & a half. Nearly every improvement since came from someone refusing to accept the status quo.
Yarn (2016) insisted installs be deterministic & gave us the lockfile, workspaces & an offline cache; npm 5 shipped
package-lock.json
the next year. pnpm showed that
node_modules
didn't have to be hundreds of megabytes of duplicated files. Bun made
install
fast enough that the incumbents had to revisit their performance. Deno argued you should be able to read a dependency's source before you take it, & while URL imports didn't last, that idea did.
The clearest recent example is install scripts. pnpm & Bun stopped running them by default;
vlt never did
. The argument had been made inside npm for the entire time I worked there without ever becoming the default. In June of this year, after a run of supply-chain worms, GitHub
announced that npm 12 would stop running them by default
too. Nothing about the idea changed in those years; enough other package managers shipped it that npm could no longer treat it as radical. The pressure runs in both directions too: we borrowed
catalogs
from pnpm, & pnpm's
namedRegistries
borrowed our named-registry aliases.
On the registry side,
JSR
deserves credit. It made a different set of bets than we did: publish TypeScript source, require ESM, generate docs from code. We disagreed with parts of it &
added
jsr:
support to vlt
anyway because our users asked for it. It survives the wind-down because, as far as I can tell, it's cheap to run, its API is documented, & Cloudflare had a reason to keep it alive.
What changes now
The two most popular independent, venture-backed JavaScript runtimes now live inside companies whose business is something else. Jarred Sumner
said
the Bun team's relationship with the Claude Code team "probably will look similar to the relationship between Google Chrome <> V8," with more independence, & Cloudflare's post makes clear that workerd's roadmap is Cloudflare's. That's how JavaScriptCore & V8 have always been funded, & it's still a change.
Whether a community fork of the Deno runtime emerges will tell us whether the ecosystem values a secure-by-default, standards-first runtime enough to pay for one that isn't attached to a cloud. And celld-into-workerd is new optionality at a layer that has had very little: a self-hostable, open implementation of Workers & Durable Objects, led by Ryan & Bert Belder.
JavaScript has insurance at almost every layer: three production engines, several runtimes, several package managers. When one layer consolidates, as the runtime layer is doing now, the others hold. The churn that makes this possible is also what people complain about most. "JavaScript fatigue" has been a running joke for a decade: a new framework every week, a new bundler every month, & yet another package manager, which, yes, I'm aware I've contributed to. But nobody had to leave Node to get
fetch
, a permission model or TypeScript without a build step, & nobody has to switch package managers to get install scripts turned off by default anymore. Those things showed up in the tools people were already using because someone else shipped them first & the incumbent had to answer. The projects didn't always win, but the ideas usually did, & end-users collected them either way.
To Ryan, Bert, Bartek & the rest of the Deno team (past & present): your collective efforts have enriched our shared ecosystem.
Thank you!
The Internet relies on networks telling each other which IP addresses they can deliver traffic to, using
BGP
(Border Gateway Protocol). These routing announcements have historically depended heavily on trust. When a network announces addresses it shouldn’t, accidentally or deliberately, traffic can be sent to the wrong place and services can become unreachable.
On February 24, 2008, Pakistan Telecom (AS17557) tried to block YouTube inside Pakistan by announcing a more specific route for YouTube's addresses. Its upstream provider, PCCW Global (AS3491), accepted the announcement and passed it to the rest of the Internet, redirecting YouTube traffic to Pakistan globally for roughly two hours (
RIPE NCC's case study
). That’s exactly the kind of error RPKI is designed to prevent. Work on RPKI had started at the IETF two years earlier, and the regional Internet registries began issuing RPKI certificates in 2011.
RPKI
(Resource Public Key Infrastructure) lets the holder of a block of IP addresses publish a signed record, a Route Origin Authorization (ROA), naming the networks (Autonomous Systems, or ASes) allowed to announce it. Network operators that check RPKI compare announcements against those records and can reject the ones that fail.
The share of routed prefixes (blocks of IP addresses) that are RPKI-valid rose from 54.0% in September 2025 to 70.3% in September 2026, a gain of 16.4 percentage points, or 30% in a year. That’s a sharp increase. In each of the two years before, it rose three to four points. Much of the jump came from one country: China went from 3.7% of its IPv4 addresses in valid routes to 83.0%, almost 60% of the global gain counted by addresses.
RPKI grew more in the past year than in the two years before it combined: 16.4 points, against 3.9 and 3.2. Data pulled on September 28 of each year.
RPKI is doing what it was designed to do. A typical valid prefix is seen by 596 of the routers that feed the public RIPE RIS and RouteViews collectors. One with no RPKI record is seen by 595, and an invalid one by just two.
Invalid Routes Barely Propagate
In August, the
Internet Society Pulse
found RPKI-related activity accounts for under 1% of daily BGP update volume, a share that is rising but still small, so RPKI is not itself destabilizing routing. We wanted to know whether RPKI was actually protecting Internet routing.
Number of BGP vantage points (peers of the RIPE RIS and RouteViews collectors) seeing each prefix, by RPKI status. September 28, 2026, across 1,614,288 routed prefixes.
Routes with an RPKI record and routes with none travel equally far: a typical one is seen by 596 and 595 vantage points. Routes that fail the check are seen by just two. Now that enough networks check, they are dropping these invalid routes. Nearly half of all invalid routes reach only a single vantage point. When the wrong network announces the addresses, the clearest kind of hijack or mistake, 71% reach only one.
This changes how country-level RPKI statistics should be read. A country can look bad because of announcements almost nobody sees.
Simply counting invalid routes can badly exaggerate how much of a country is affected. Spain has the highest share of invalid IPv4 prefixes at 28.2%. Count the addresses in those routes instead, weighted by how many vantage points see each one, and it falls to 0.057%. Slovakia falls from 17.4% to almost zero. Italy has the highest figure of any country with at least a million IPv4 addresses, 0.121%, up from 0.075% a year ago, and 90% of it is one network.
WIND TRE (AS1267) announces 34 routes in its own address space that its own ROAs don't allow: 19 are more specific than the ROAs permit, and 15 come from AS1267 while the ROA names WIND TRE's other network, AS24608. None reaches more than 77 vantage points, against about 617 for the signed blocks around them.
Gray: share of a country's routed IPv4 prefixes that are RPKI-invalid. Blue: share of its IPv4 addresses in invalid routes, weighted by how many vantage points see each route. The 12 countries with the highest gray share and at least a million IPv4 addresses, September 28, 2026. The number after each country is its rank by gray share.
China Drove Most of the 2026 Jump
Counted by IPv4 addresses on September 28 each year, the share in RPKI-valid routes rose from 42.7% in 2023 to 47.9% in 2024, 53.1% in 2025 and 65.0% in 2026. The last jump was 11.9 points, against about five in each previous year.
Removing China shows how much of that was one country. Outside China, the share rose from 58.0% to 63.2%, a 5.2-point gain, a little less than the year before.
China's own change was extraordinary. 3.7% of its IPv4 addresses were in valid routes in September 2025, and 83.0% a year later. Most of that happened this year: at the end of December 2025, just 2.9% of China's routed prefixes were valid. It also changed which way it moves the world figure. In 2025 China pulled the global average down: 53.1% worldwide against 58.0% without China. In 2026 it pushed it up: 65.0% against 63.2%. Others moved a long way too: Egypt from 23% to 99%, Kazakhstan from 16% to 84%, Mexico from 37% to 78%, and South Africa from 38% to 60%.
Share of IPv4 addresses in RPKI-valid routes, September 28 of each year. Outside China the share rose about five points in each of the last two years. The lines cross in 2026, when China moved from lowering the global figure to raising it.
Share of each country's IPv4 addresses in RPKI-valid routes, September 28, 2026. Gray means no data.
Where the unprotected addresses are is just as concentrated. Of all routed IPv4 space not in RPKI-valid routes on September 28, nearly 60% is in the United States, and about one in four addresses belongs to the US Department of Defense (more on who holds IPv4 in an upcoming post). Most of that is space the Department began announcing in 2021 to watch for misuse, not to run services.
IPv6 Has Moved Ahead
In early 2025 there were concerns that IPv6 adoption of RPKI was slowing. Instead, it accelerated and has now overtaken IPv4. In
RPKI's 2024 year in review
for RIPE Labs, Job Snijders noted IPv6 ROA growth "seems to be stalling." Over our window, IPv6 routed prefixes marked valid rose from 56% to 79% while IPv4 prefixes rose from 54% to 68%, putting IPv6 roughly ten points ahead. The
Hurricane Electric
RPKI report shows the same ordering.
Two other metrics he flagged also changed: the average number of address blocks per ROA climbed back from 2.31 at the end of December to 2.62, and publication points, which he counted falling from 63 to 53 and read as consolidation, rose from 73 to 91 as more organizations began hosting their own repositories instead of relying on their registry.
Share of routed prefixes marked RPKI-valid, by address family. Daily, September 28, 2025 to September 28, 2026.
What RPKI Does Not Do
RPKI validates who may originate a prefix. It does not validate the path, and it cannot catch an attacker who stays inside the permission you published, so it's not bulletproof.
On August 28, 2026, a route for 162.55.80.0/24 (a block of 256 addresses) appeared with Hetzner's AS24940 forged as the origin. Hetzner's ROA covered the surrounding /16, a block 256 times larger, and allowed announcements as small as a /24, so the forged route satisfied it. The route was RPKI-valid, no legitimate /24 existed to compete with it, and longest-prefix-match meant everyone preferred it. That was enough to obtain a genuine TLS certificate and serve a malicious Virtualizor update to hypervisors, as
documented by Kentik
. Nothing about RPKI failed. The ROA permitted it.
We measured how common that posture is. Of 855,217 RPKI-covered IPv4 routes, 138,698, or 16.2%, have a ROA looser than the route announced and no more-specific route of their own filling the gap. For IPv6 it is 20.9%. That leaves roughly 18 million more-specific prefixes an attacker could announce today, forge the origin, and come out RPKI-valid and uncontested.
Operators in the same business make very different choices here. Among hosting providers, Contabo has an open window on 540 of 553 covered routes and DigitalOcean on 780 of 863, while OVH sits at 11.5%. Access providers are worse still: Cablevision at 98.1%, Shaw at 96.5%, Bharti Airtel at 85.0%.
RFC 9319
already says the best practice is to leave maxLength unset. maxLength is the setting that lets a ROA also cover smaller blocks inside it, so leaving it unset means a ROA matches only the block actually announced. Hetzner tightened three prefixes after the incident, including the one that was hijacked, though 49 of its 63 covered routes remain open.
Share of RPKI-covered IPv4 routes with an open more-specific window, by hosting provider, against the 16.2% global average. (September 28, 2026)
Where RPKI Coverage Declined
RPKI coverage can also disappear without causing an outage. A missing ROA simply removes the protection, and nobody notices unless they look. We found several cases where that happened over the past year.
Unlike China, Mauritius saw its RPKI coverage fall. The share of its IPv4 addresses in valid routes fell from 94.0% to 69.0% between September 2025 and September 2026. SEACOM (AS37100) lost four of its six ROAs on January 1. One covered 105.16.0.0/12, a block of about a million addresses, 46% of which are in Mauritius. That block alone explains Mauritius's drop, and it still had no ROA on September 28.
Two other operators show the same thing happening and then being fixed. Saudi Telecom (AS25019) lost RPKI protection on 19 routes, including six large blocks totaling about 1.6 million addresses, when the ROAs for those six blocks disappeared between March 30 and April 13. Saudi Arabia's coverage recovered when the ROAs came back on September 21 and 22.
In Morocco, Orange Maroc (AS36925) is the only large operator that publishes ROAs, and most of them went missing twice: from July 2025 to July 2026, and again from July 25 to September 3. Morocco went from 20% covered to almost none, and back.
Days with no ROA for the largest address blocks of Saudi Telecom (AS25019) and SEACOM (AS37100), and for most of Orange Maroc's (AS36925) ROAs. The routes stayed reachable but lost RPKI protection. SEACOM's block still had no ROA on September 28, 2026.
One Measurement Trap
There is a critical measurement trap here. Some validation methods can count an RPKI record as failed even though it is still providing protection in practice.
Every signed record carries a link to the certificate above it. When an operator moves its repository, that link can go stale, and a check that inspects records one by one will report a hard failure. But the validation that actually produces the list routers use never follows that link, it walks down from the trust anchors instead.
We found thousands of records flagged as failed that were present in every independently validated set we checked, with their routes still RPKI-valid. So if you are reading anyone's RPKI numbers, including ours, it is worth knowing which of the two they counted. A count of failing records is not a measure of lost protection.
Path Validation Is Starting to Arrive
ROAs secure the origin of a route. They say nothing about whether the path used to reach that origin makes sense.
ASPA, or Autonomous System Provider Authorization, addresses that. A network publishes a signed record naming its authorized upstream providers, which lets others check observed AS paths against them and catch route leaks that origin validation misses.
Deployment is early but fast. On September 28, 2025, 131 networks had published ASPA records. By September 28, 2026 there were 3,272, 25 times as many.
The growth comes in steps rather than a curve. RIPE NCC sat at about 85 networks from September to late November, then climbed to 470 by the end of December. ARIN stepped up from January 21, APNIC at the end of June and again in September, when its count nearly doubled. Each jump follows a registry making ASPA signing available, so tooling has been the main driver. One detail:
APNIC announced its support on July 9
, and its curve started climbing on June 26.
Networks publishing ASPA records, stacked by registry, September 28, 2025 to September 28, 2026. The December, January, June, and September increases line up with registries shipping signing tools.
That coverage is now enough to ask the better question: how much of observed routing is ASPA-valid?
On September 28, 2026, 9.7% of observed routing passed ASPA checks, up from 6.2% a year earlier. Most of that is automatic: under the draft rules, a path through only one or two networks always passes, and those short paths were about 6% of routing in both years.
Take them out and the records networks have published verify about 3.5% of routing, up from roughly 0.1%. That is the real progress.
Almost all the rest is not failing. It is unknown, because too few networks along those paths have published records to tell. In practice, ASPA can check only a small slice of routing today, and that slice grows with every network that publishes a record.
More interesting is the part that can be judged and fails. Paths breaking ASPA's rules mid-path, the signal a collector can read with most confidence, rose from effectively zero to 0.048% of observations. That is not necessarily routing getting worse: a path can only be called invalid once enough of it has declared providers, so as publication grew, paths that were previously unjudgeable became testable and some failed.
Share of observed routing that is ASPA-valid, weighted by route observations. The headline rose from 6.2% to 9.7%, but about 6 points of that is a structural floor; published records account for about 3.5 points, up from 0.1.
Attributing those failures needs care, because the gap sits mid-path: one provider with a stale record makes every one of its customers' routes look invalid, so ranking by origin blames the wrong party.
Attribute to the hop instead and the networks at the top are the ones doing it right. Cogent, Arelion, and GTT each declare AS0, which says they buy transit from nobody. That is true, and it is exactly what stops a stale record further down the path from hiding as "no attestation." The real gaps are smaller: of 3,272 networks publishing ASPA records, 479 have upstream providers visible in our routing data that they never declared, across 658 missing relationships.
The largest single cause is one operator. Syrian Telecom (AS29386) publishes a record naming four carriers. Three of them carry just 16% of the transit we observe through it, and the fourth carries none. The four carriers that handle the other 84% are missing from the record, so about 40% of paths arriving through them fail the check, and the rest come out unknown.
Through Syrian Telecom's own routes and those of two Syrian networks that reach the Internet through it, that record accounts for 21% of all mid-path ASPA failures on the Internet. Another 3 points come from AS201550, a second Syrian Telecom network whose record copies the same four carriers instead of naming the Syrian Telecom networks it connects through. Which means the global ASPA failure rate is not yet a measure of the Internet's health. About a quarter of it comes from one operator's incomplete records.
Eighteen years after PCCW Global passed on Pakistan Telecom's announcement for YouTube's addresses, PCCW is a gap in the newer system. ASPA would not have stopped the 2008 incident; RPKI's origin check is what covers that. But ASPA lets others check PCCW's place in a path, and AS3491 has not published a record. That breaks nothing on its own. Still, nearly 6,000 paths crossing PCCW read ASPA-invalid today, because networks below it publish records that leave PCCW out.
What Operators Can Do
RPKI now protects most Internet routes, and invalid routes barely travel. The gaps that remain are mostly in the hands of the networks that own the addresses:
Publish ROAs for everything you announce.
Three in ten routed prefixes are still not RPKI-valid.
Leave maxLength unset.
One in six covered IPv4 routes has a window like the one used against Hetzner.
Check that your ROAs are still there.
Saudi Telecom, SEACOM, and Orange Maroc each lost some of theirs, and since nothing broke, it was easy to miss.
Publish ASPA, and list every provider.
Syrian Telecom's record leaves out the four carriers that handle most of the traffic we see reaching it, so many routes through them fail the check.
Methodology
:
All figures come from IPinfo's routing and RPKI datasets, one RPKI snapshot per day. RPKI validity is the share of routed prefixes classified valid against the validated authorization set, not the validation status of individual RPKI objects. Routing data comes from the public RIPE RIS and RouteViews collectors, which IPinfo ingests daily. A prefix's visibility is the number of distinct BGP peers of those collectors carrying it. Across every prefix seen by at least one of them the figure was 70.3% on September 28, 2026; requiring two or more removes isolated announcements and gives 71.4%. Propagation figures are medians; the corresponding means are 519, 515 and 9, pulled up by a tail of more widely seen invalids.
Country figures use IPv4 only and count addresses, not prefixes. Each routed prefix is split across countries by IPinfo geolocation, so a /16 with half its addresses in Italy counts 32,768 addresses toward Italy. Where routes overlap, each address is counted once, and current geolocation is used for every year. An address counts as covered if any RPKI-valid route includes it. The prefix share in Chart 3 assigns each prefix to the country of its first address. The weighted invalid share in Chart 3 is counted per route: it multiplies each route's addresses by the number of vantage points that see it.
Propagation-weighted figures begin in 2024, as the underlying peer data does not exist for earlier snapshots. Yearly comparisons use September 28 snapshots unless another period is stated.
Figures are single-day snapshots rather than averages. The daily series is stable enough that this makes no practical difference: RPKI-valid share moves a median of 0.05 points a day, and a seven-day mean around each date differs from the single-day value by less than 0.1 points.
The maxLength measurement covers prefixes seen by two or more vantage points on September 28, 2026, which drops isolated announcements. An "open window" is a routed prefix whose covering ROA permits a longer prefix than the one announced, with no more-specific route of the operator's own inside that range.
ASPA figures cover daily observations from September 9, 2025 to September 28, 2026, weighted by route observations rather than distinct AS paths. The 0.048% figure is mid-path invalidity only; terminal-hop invalidity is excluded because it turns on the collector peer's own record, and a single incomplete record there taints that peer's entire table. Two peers account for 70% of it.
Meta releases Muse Spark Open, a new ‘open-weight’ AI model
Guardian
www.theguardian.com
2026-10-15 20:34:28
Meta says Muse excels at ‘multi-step reasoning’ and ‘complex software engineering’ as it races to catch up to Chinese rivals Meta on Thursday launched a new open-weight AI model which it claims rivals, and in some cases outperforms, similar products from leading Chinese developers. Muse Spark Open “...
Meta on Thursday launched a new open-weight AI model which it claims rivals, and in some cases outperforms, similar products from leading Chinese developers.
Muse Spark Open “is the most capable US open-weight model to date,” Meta’s chief of AI Alexandr Wang wrote on X.
Unlike so-called closed models – such as Anthropic’s Claude or OpenAI’s ChatGPT – developers can download the parameters, known as weights and biases, of an open-weight model and modify them.
Chinese developers have emerged as dominant players in the open-weight market for AI models over the past couple of years.
Alibaba’s Qwen, Moonshot AI’s Kimi K3 and Z.ai’s GLM models have been considered open-weight frontrunners globally, but Meta claims its new open model now competes on a similar level.
“Built for coding and agentic work,” Muse Spark Open “excels at long-horizon tasks, complex software engineering, and multi-step reasoning,” Meta said in a blogpost, adding that “strong safeguards” have been integrated into the new model.
Muse Spark Open is also “optimized” to run on Apple’s advanced M5 Ultra chips, Meta said, signaling an unusual partnership between the two tech companies.
Muse Spark Open requires significant computing power. Users can run the model on two Mac Studios with M5 Ultra chips to create a “supercomputer” on their own desktop, Meta said.
The launch comes just days after Meta announced its newest closed model, which it said rivalled the most advanced versions of ChatGPT and Claude.
Meta’s AI efforts were initially focused on open models, but more recently Zuckerberg has pushed the company to compete with OpenAI and Anthropic.
In Memoriam: Barry Steinhardt
Electronic Frontier Foundation
www.eff.org
2026-10-15 20:07:22
Barry Steinhardt, a lifelong privacy champion and an early leader in the battle for digital civil liberties who served as EFF’s president in 1998-99, died last week at age 73.
A Connecticut native, Steinhardt led the Vermont and Pennsylvania affiliates of the American Civil Liberties Union before b...
Barry Steinhardt, a lifelong privacy champion and an early leader in the battle for digital civil liberties who served as EFF’s president in 1998-99, died last week at age 73.
A Connecticut native, Steinhardt led the Vermont and Pennsylvania affiliates of the American Civil Liberties Union before becoming associate director of the national ACLU. There, he helped spearhead the fight to overturn much of the Communications Decency Act, resulting in the U.S. Supreme Court’s landmark
Reno v. ACLU
ruling in 1997.
When the internet was still young,
Steinhardt
became one of
the first
attorneys to
specialize in the intersection of technology and privacy
.
In early 1998 he took a leave of absence from the ACLU to become EFF’s president, and then returned to the ACLU in 1999.
In 2002 he founded the ACLU’s Program on Technology and Liberty. After retiring from the ACLU, he continued on as a senior advisor to London-based
Privacy International
.
Steinhardt chaired the 2003 Computer Freedom and Privacy Conference and served on a wide variety of significant panels and boards, including the Department of Transportation’s Negotiated Rule Making on national driver’s license standards, the Advisory Committee to the US Census, and the Blue Ribbon Panel on Genetics of the National Conference of State Legislatures. He also was selected to be a member of the US delegation to the G-8 Government and Private Sector Tokyo conference on Cyber Crime and served as an advisor to the Czech Helsinki Committee.
“Barry led many critical technology and civil liberties fights and was an important mentor to me and others in the field,” said EFF Executive Director Nicole Ozer. “Barry’s influential work across strategy to defend and advance privacy rights and safeguard people against surveillance has made its mark on the law and policy of our digital world and protected the rights and safety of people across the United States and around the world.”
Reproducible Builds (diffoscope): diffoscope 334 released
PlanetDebian
diffoscope.org
2026-10-15 20:00:00
The diffoscope maintainers are pleased to announce the release of diffoscope
version 334. This version includes the following changes:
[ Chris Lamb ]
* Fix a crash when using the latest versions of Androguard. Thanks, hc!
(Closes: reproducible-builds/diffoscope#434)
You find out more by visitin...
This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.
What can I do to resolve this?
You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
Is Liquid Metal Killing Our PCs? Scientific Analysis and a 2-Year Test [video]
BeBox is a Haiku application that emulates Be Inc.'s BeBox, the
dual-processor computer that BeOS was born on. It runs both PowerPC models
from their original boot ROMs, with BeOS for PowerPC from Developer Release
6 through R5.0.3. It also runs the Hobbit prototypes that came before them,
built around two AT&T Hobbit processors, with Be's 1993-94 system from
their surviving disks.
Model
Processors
Bus
BeBox Dual603-66
two PowerPC 603 at 66 MHz
33 MHz
BeBox Dual603e-133
two PowerPC 603e at 133 MHz
33 MHz
Hobbit prototype (1993-94)
two AT&T 92010 (Hobbit) at 25 MHz
BeBus, 25 MHz
The window shows the emulated screen between the two front panel LED
columns (the "blinkenlights"), sixteen light pipe segments each: a CPU load
bar of fifteen LEDs over the power LED (left) or the disk LED (right), lime
and amber like the real ones (or red and green, if you prefer).
What is emulated
Both processors (a PowerPC 603/603e interpreter with the 603's software
TLB), the MPC105 bridge, the BeBox interrupt and CPU control registers.
Boot ROM: the nub and main ROM in a writable flash (BeOS's ROM updater
works), NVRAM and real time clock.
Video: Number Nine #9 GXE64 (S3 Vision864, AT&T 21C498 RAMDAC) with its
graphics engine, the default; or Cirrus Logic CL-GD5434. 640x480 to
1280x1024, 8 and 32 bits per pixel (what the BeOS drivers offer).
Sound: Crystal CS4231A codec, played through the Haiku media kit.
AT keyboard and PS/2 mouse; four game ports (axes and buttons).
Storage: NCR 53C810 SCSI (disks and CD-ROMs on IDs 0-6), IDE, floppy.
Four serial ports: to a console window, a TCP server or client, a host
serial port or a log file.
Ethernet: an NE2000 compatible ISA card on a private network behind the
host (NAT, through libslirp): the BeBox reaches the host and the
Internet, and host ports can be forwarded to it.
Shared folders: a Haiku folder appears to BeOS as a SCSI disk it can read
and write; the changes come back to the folder when BeOS shuts down.
Not emulated yet: the parallel port, GeekPort, MIDI and infrared ports.
What you need
The BeBox boot ROMs
, which are not included:
bootnub.rom
(16 KB)
and
bootmain.rom
(Be Boot ROM 1.1d7) from a BeBox, in a folder of your
choice.
BeOS for PowerPC
: CD images (ISO, BIN/CUE or Toast).
For the releases with the Be File System (Advanced Access to R5): a
newer boot ROM, which the Preview Release 2, R3 and R4.5 CDs carry as
/beos/etc/bebox_bootmain.image
(Advanced Access, Preview Release 1 and
R5 use one of those). BeBox extracts it for you (see below).
Getting started
Open
Machine > Preferences > ROM & NVRAM
and choose the folder with
the ROMs. For a BFS release, choose its CD image as
Boot ROM image
:
BeBox copies the boot ROM from the CD (PR2's also boots Advanced Access
and PR1).
In
Storage
, put the CD image on a SCSI ID as CD-ROM (ID 3 is the
classic choice), and give another ID a disk for installing:
Choose...
opens a file panel whose
New disk image...
button makes one right
there (in the folder the panel shows) and puts it on that ID.
Machine > Power on
. The newer boot ROMs stop at their boot menu when
no boot volume is set yet: press Return.
Changes to the hardware restart the machine. A device type set without a
file is turned back into "None" when the preferences are saved.
The Hobbit prototype
Before the PowerPC BeBox, Be built its machine around two AT&T 92010
"Hobbit" processors, three AT&T DSP3210 signal processors and the BeBus.
A few prototypes survive with their disks, running Be's 1993-94 system: a
window server, a console, the Browser and its dock.
What is emulated:
Both Hobbit processors (an interpreter written from AT&T's programmer's
reference: the stack cache, the MMU, the timers, the event sequences).
The board: its I/O and interrupt registers, the processor resets, the
floppy DMA; the PC compatible I/O chips (keyboard and PS/2 mouse, real
time clock, two serial ports, floppy) and the NCR 53C94 SCSI
controller.
The video card: a Trident VGA with an XGA style graphics engine on the
BeBus (640x480 or 800x600, 256 colors, as the window servers set it).
Not emulated: the three DSPs and what hangs off them (sound, the telephone
and modem), the Ethernet card, the joystick controller and the parallel
port. The system starts without them (its sound server reports an error).
No boot ROM of these machines survives, so BeBox does the boot ROM's job:
it loads
/system/kernel
from the boot volume (the floppy if one is
inserted, else the SCSI disk with the lowest ID) and starts it. To run one:
In
Preferences > Machine
, choose
Hobbit prototype
and 4, 8, 16,
20 or 32 MB of memory (the sizes its kernel knows).
In
Storage
, put a Hobbit disk image on a SCSI ID as a disk. To run a
kernel of your own instead of the disk's, choose it in
ROM & NVRAM >
Hobbit kernel
.
Machine > Power on
. The kernel reports its progress on serial port
1 (give it a console window in
Serial
to watch).
Notes:
The November 1994 disks start
/system/Browser
, which they have as
/system/browser
: the console comes up instead (the real machines did
the same). Type
/system/browser &
in it to start the Browser.
The floppy drive is the kernel's drive 1.
The system writes to its disk (swap files and more): keep a copy of
your images, or use them through QCOW2 overlays
(
bebox-img create -b IMAGE OVERLAY.qcow2
).
The front panel lights are hidden: the Hobbit's kernel drives none.
Installing from the floppies
The installer floppy and disks 1of7 to 7of7 install the November 1994
system (the one on the "pixels" disk) on a new disk. The installer floppy
has no window of its own: its
/system/Browser
copies a minimal system
(kernel, servers, shell,
/Installer
) from the floppy to the first hard
disk, without asking and without showing anything but the pointer. Boot it
only with the disk to install on: it replaces the system files of any
other Hobbit disk it finds.
Put a copy of a Hobbit disk (or an overlay of one) on SCSI ID 0, and a
new disk image on ID 1 (in
Storage
, the ID's file panel has
New
disk image...
; 120 MB works, the original disks have 120 to 170 MB).
Power on, type
/bin/format
in the console, choose the SCSI disk with
ID 1, give the volume a name, then 0 to leave. Power off.
Take the Hobbit disk off ID 0 and put the new disk there instead.
Insert the installer floppy and power on. After about a minute (the
pointer is all you see), power off and eject the floppy.
Power on: the console comes up from the new disk. Type
/Installer
,
click
Begin
, then insert 1of7 (
Media > Insert floppy...
) and
click
Continue
, and so on up to 7of7. The Installer then
uncompresses, verifies and extracts the archive (a few minutes), and
Install
finishes: "Installation complete". When it starts
uncompressing, the console shows
VOLUME:/_install_/archive.Z: System Error 0
: harmless, and a real Hobbit did the same (
compress
deletes
the archive while it still has it open, which this file system
refuses; the Installer removes it at the end).
Restart, and type
/system/browser &
to start the Browser.
Optionally, run
/Installer
again with
update.img
as disk #1: Be's
update of 28 November 1994 (a fixed
storage_server
and the Phone
answering machine's spoken prompts in
/system/phone
, as on the "be"
disk).
Profiles
Each release likes a machine of its own (its boot ROM, its disks, maybe
the 133 MHz model), so the machine is kept in a
profile
: everything in
the preferences except Keyboard & mouse and the LED look, plus the boot
ROM flash (with the boot ROM updates BeOS installs) and the NVRAM (with
the boot volume).
Machine > Profile
lists the profiles to switch
between (a running BeBox restarts with the other one), and has
New
profile...
(a copy of the current profile, under a name like "BeOS5 133
MHz" or "DR8 66 32 MB"),
Rename
and
Delete
. The status line shows
the current profile. Profiles are folders in
~/config/settings/BeBox/Profiles/
; the settings from before profiles
became the profile "Default".
Release
Boot ROM
Boots from CD
Installs to disk
DR6 (BeOS 1.1d6)
original 1.1d7
yes
yes
DR7 (BeOS 1.1d7)
original 1.1d7
yes
yes
DR8
original 1.1d7
yes
yes
Advanced Access
PR2's
yes
yes
Preview Release 1
PR2's
yes
-
Preview Release 2
from its CD
yes
yes
R3
from its CD
yes
yes
R4.5
from its CD
yes
yes
R5.0.3
R3's
yes
yes
"-" means not tried yet. The DR8.2 image is a Mac updater, and the R4 image
is x86 only. The boot ROM from the R3 CD works with every release tested
here, so one profile with it can run them all.
DR6 predates the 1.1d7 boot ROM: BeBox hands its kernel the PCI device
table in the older format it expects. Install it as the CD says: boot the
CD, run the Installer from the dock, format the SCSI disk ("Format:" in the
left pop-up menu), then install onto it and make it the startup disk.
DR6's mouse driver moves the pointer twice as far left and down as right
and up (that is DR6, not the emulation). The Developer Releases'
date
prints the year as years since 1900 (126 for 2026).
Using it
While the window is active, the keyboard belongs to the BeBox. Click the
screen to capture the mouse; the host key,
right Control
, releases
it.
Keyboard & mouse
in the preferences picks another host key and
sets the mouse speed.
Game ports
in the preferences connects host joysticks to the four
sticks (two per game port, as with Y cables).
The status line shows the floppy, CD and hard disk (with the disk
activity); click the floppy to insert one.
Machine
has the power, reset and interrupt switches, and restarts with
the boot menu or with kernel debug output on serial port 4 (that holds
F1 at power on, as on a real BeBox).
Send Ctrl+Alt+Delete
gives BeOS
the keys Haiku keeps for itself: BeOS R3 and later show their Team
Monitor, and restart when it is sent again.
The two processors run on two host cores when both are busy
(
Preferences > Advanced
, on by default): up to nearly twice as fast,
which the 133 MHz model needs on slower computers. The status line shows
the speed in percent of a real BeBox.
Tools > Serial console
shows a serial port connected to a console.
View
shows the screen at actual or double size or fitted to the
window, and shows or hides the LEDs.
Network
In
Preferences > Network
, turn on the Ethernet card (port 300h, IRQ 5
by default, as Be's software expects). In BeOS's Network preferences, add a
"Novell NE2000 compatible adapter (ISA)" with the same port and IRQ, and
choose DHCP (R4.5) or set IP 10.0.2.15, mask 255.255.255.0, gateway
10.0.2.2 and DNS 10.0.2.3 by hand. The host is 10.0.2.2 from the BeBox.
Forwarded host ports
(
tcp:2121:21, tcp:2323:23
) make services
running in BeOS reachable from the host.
Shared folders
In
Preferences > Storage
, make a SCSI ID a
Shared folder
and choose
a Haiku folder. At power on BeBox copies the folder, with its attributes
(file types, icons), to a fresh BFS volume that BeOS mounts like any disk;
the releases with BFS (Advanced Access and later) can use it. When BeOS has
shut down (Be menu > Shut Down) and the BeBox is powered off, BeOS's changes
go back to the folder: new and changed files, attributes, deletions. A file
changed on both sides meanwhile keeps the Haiku version, and BeOS's is saved
next to it as "NAME (BeBox)". If BeOS did not shut down cleanly, the volume
is kept and given back to BeOS at the next power on, so that it can repair
it first. As the whole folder is copied at every power on, keep it small.
Disk images
Hard disks are raw images or QCOW2 images, which only take the space that
is written (thin provisioning) and can be overlays of a backing image.
bebox-img
manages them, and reads files from BeOS volumes (BFS) and from
the Hobbit prototypes' disks:
For example
bebox-img extract "BeOS Release 3 PowerPC.iso" /beos/etc/bebox_bootmain.image r3.rom
.
On a Hobbit disk,
extract
also copies whole directories (
/
for the
whole disk) into a new folder, keeping the files' dates, and
ls
shows
the files' types and creators:
bebox-img extract hobbit-930800009.img / pixels
. No BeOS release reads the Hobbit's file system (DR6 to DR8 have
a later, incompatible version of it, the others BFS), so this is the way
to its files: extract them, then give the folder to a BFS release as a
shared folder
. The Hobbit's programs do not run on the
PowerPC; its sources, headers, text and pictures are what is useful.
Scripting
The machine window answers
hey
:
hey BeBox get Running of Window BeBox # also set ... to true/false
hey BeBox get Speed of Window BeBox # percent of real time
hey BeBox get LedLevels of Window BeBox # left, right (0-15)
hey BeBox get SerialLog 4 of Window BeBox # a console port's output
hey BeBox set Floppy of Window BeBox to /path/disk.img
hey BeBox type of Window BeBox with text=ls # types on the keyboard
hey BeBox shot of Window BeBox with path=/tmp/screen.png
Also
get Mips
,
get EmulatedTime
,
get DiskLed
,
get AudioStats
(the
sound output's counters: underruns are gaps),
get Profiles
,
get Profile
and
set Profile
(switches, restarting a running machine), and the
commands
pwon
,
pwof
,
rset
and
cadl
(Ctrl+Alt+Delete). Replies come after the
action.
Command line
BeBox [--profile NAME] [--rom-dir DIR] [--boot-rom IMAGE] [--model 66|133|hobbit] [--kernel FILE] [--ram MB] [--video s3|cirrus] [--scsiN-disk FILE] [--scsiN-cd FILE] [--scsiN-share FOLDER] [--ide0 FILE] [--floppy FILE] [--net] [--net-forward SPEC] [--power-on]
sets up the machine (the
settings are kept).
--profile
switches to a profile first, making it as a
copy of the current one if there is none; the other options change that
profile.
bebox-headless
runs a machine without a window, for tests and debugging:
serial ports to files or TCP, scripted keys and mouse clicks, screenshots,
instruction traces, memory dumps and watches.
bebox-headless --help
lists
the options.
Building
On Haiku (with
haiku_devel
,
zlib_devel
and
libslirp_devel
):
make
builds the app;
package/build-package.sh
builds the app and the tools and creates the
package.
The emulator core is portable C++17 and is tested on Linux:
make -C tests/linux check
: processor tests (against
qemu-ppc
as an
oracle), Hobbit processor tests, multiprocessor and device tests, QCOW2
tests (against
qemu-img
), under AddressSanitizer and
UndefinedBehaviorSanitizer.
tests/boot-regression.sh
: boots each BeOS release headless (the media
and installed disks go in
work/
) and the Hobbit disks (in
Hobbit/
),
through throwaway overlays.
tests/vm-test.sh user@haiku-host
: builds the app on a Haiku machine and
drives it with
hey
.
design/
describes the hardware and the emulator's design.
Authors
Claude Opus 5.5
John Rash
License
MIT, see
LICENSE
. The application icon (
artwork/BeBox.hvif
) is by
zuMi, under the MIT License. The icons in
artwork/icons
come from Haiku's
icon set (MIT, Haiku, Inc.). The BeBox ROMs and BeOS are not part of this
project.
The Rust team has published a new point release of Rust, 1.99.1. Rust is a programming language that is empowering everyone to build reliable and efficient software.
If you have a previous version of Rust installed via rustup, getting Rust 1.99.1 is as easy as:
rustup update stable
If you don't have it already, you can
get
rustup
from the appropriate page on our website.
What's in 1.99.1
Rust 1.99.1 fixes the following regressions from prior releases:
Missing symbol
wcslen
: Some Rust targets were getting link errors for missing
wcslen
, and that function is now present in Rust's compiler-builtins library as a fallback.
The LLVM
loop-idiom-wcslen
pass may introduce calls to
wcslen
as an optimization, and some Rust targets did not have that function readily available in
libc
or elsewhere. The UEFI targets in particular were broken for any project using
std
, as some of these calls were introduced in the precompiled standard library, but the issue was also reproducible for similar user code patterns.
Miscompilation of FFI
bool
return values on x86_64
: Rust functions returning
bool
through FFI could leave bits 1-7 of the return register unspecified, causing callers to observe raw values other than
0
or
1
. This return type is now marked for zero-extension again, as required by the ABI.
rust-lld
failed to load
libLLVM
on macOS
: This linker could fail to run if the compiler was invoked without the
rustup
proxy, as there was no direct setting for the appropriate library search path. Now
rust-lld
is built with an
rpath
entry for the directory containing
libLLVM.dylib
.
If you'd like to help us out by testing future releases, you might consider using the beta (
rustup default beta
) and nightly (
rustup default nightly
) channels locally and in your CI. Please
report
any bugs you might come across!
Contributors to 1.99.1
Many people came together to create Rust 1.99.1. We couldn't have done it without all of you.
Thanks!
‘We Will Not Forgive’: Gazans Rage at Hamas for the October 7 Gamble
Portside
portside.org
2026-10-15 18:24:01
‘We Will Not Forgive’: Gazans Rage at Hamas for the October 7 Gamble
jay
Thu, 10/15/2026 - 18:24
...
"On that accursed day, they pushed Gaza off the edge of the cliff ... then picked up their phones to find the best angle for the shot," Gazan writer and poet Ni'ma Hassan wrote on her Facebook page on October 7. A few hours later, she posted again, perhaps responding to readers who had attacked her for criticizing Hamas, as she has done before: "Even after three years, they tell us that the outcome is what counts and victory is near. By God! Even if you build paradise […]we will not forgive what has happened and is still happening to us."
Hasan writes openly what many in Gaza say among themselves and some put into writing, with varying degrees of boldness and bluntness. They see no contradiction between criticizing Hamas and recognizing that Israel chose to destroy Gaza and their lives there, and even declared its intention to do so.
Their anger at Hamas over what they describe as a strategic mistake, an adventure, a gamble or even a conspiracy does not diminish their loathing for Israel or their knowledge that this endless war is part of Israel's longstanding policy against the Palestinian people.
Journalist Hamed Jad, the Gaza bureau chief for the Ramallah-based daily Al-Ayyam, also recalled Hamas' promises of a decisive victory after the terrible suffering. He, too, was writing on the third anniversary of "Al-Aqsa Flood," Hamas' name for the
October 7 attack
. About a year after the attack, at a press conference with Khalil al-Hayya, now chairman of Hamas' political bureau, Jad asked: "Can you name a single achievement October 7 has brought?" Al-Hayya replied that it was too early to judge.
This week, Jad revisited that answer from two years ago with bitter irony: "Al-Hayya was right when he told me: 'It is unfair to judge the Flood before it has ended, because it has not yet ended.' Indeed, three years later, the Flood has not stopped, and we are still drowning in its raging waves, ground down day after day by the millstones of killing, destruction, displacement and loss."
Breaching the border fence east of Khan Yunis, October 7, 2023. "Three years later, the Flood has not stopped, and we are still drowning in its raging waves," wrote a Gazan journalist. (Photo credit: Yousef Masoud/AP // Haaretz)
Addressing al-Hayya, who is now abroad and four of whose sons were killed by Israel, Jad asked with biting sarcasm: "Do you still insist that it is too early, and unfair, as you put it, to judge the Flood and the suffering it has inflicted on us so far?"
Those
living in the Gaza Strip today
, and those who have managed to escape, long for October 6, 2023. They have not forgotten the blockade Israel imposed on them or their isolation from the world; the unemployment and poverty that isolation caused, and the humiliation that came with both; the struggle for the right to receive medical treatment outside the Strip; or being prevented from seeing relatives and friends living just 80 kilometers away.
Yet Gazans defied the blockade through community and family life, their studies and their plans for their children. They cultivated their talents in painting, poetry, prose and computer science, pursued building projects and business ventures, and connected with the world online. In the face of Israel, the hostile power that controlled them and aspired to "sink Gaza into the sea," their insistence on living rather than merely existing was an act of civil resistance. Hamas' "Flood" held this kind of unarmed struggle in contempt.
Here is a fragment of life before the Flood, from another post Hassan wrote that same day: "My daughter Mayar spent Friday, October 6, 2023, memorizing a short play in English about olive trees to perform on the school radio. My job was to buy her a Palestinian dress. On the morning of October 7, they burned the school, the olive trees, the studio ... and we left the dress and the city behind."
Her daughter will no longer be able to fulfill her dream of riding a motorcycle through the city's streets without anyone making comments. The city no longer has streets, and her daughter now wears a hijab. She has grown up, in other words, and will no longer be able to fulfill her wish.
Hassan leaves no doubt that by "they," she means Israel. But in another text, addressed to Hamas, she tallies figures that have reached her: more than 70,000 children who have lost one or both parents; more than 86,000 households headed by women; nearly 260,000 families living in shelters; more than 64,000 widows; and almost 17,000 people have disabilities. UN reports support some of these figures:
UNICEF reported
more than 58,000 children who had lost a parent in October 2025, while UN Women estimated 86,290 women-headed households in September 2026.
"And amid all these details," Hasan adds, "two million lives of unrelenting pain."
There are everyday pains that go unphotographed, supposedly small ones, that teacher Samia Wadi describes in another Facebook post. One student is always late, arriving halfway through class because she has to wait for her sister to return from her own lesson and hand over the pair of shoes they share. Many students take no notes as Wadi explains the lesson. She knows they are waiting for UNRWA to provide notebooks. Two others miss class every few days, whenever the truck delivering purified water passes through the displacement camp where they live, so they can fill their jerry cans. Another student is frequently absent. Wadi knows that the girl's grandfather banished her widowed mother from the southern Strip to the north. The younger children stayed with him. Reading between the lines, the absent student has to look after them.
Another teacher is described as moving "with the lightness of a merciful angel among her very young pupils" in a tent turned into a classroom. The writer, also posting on Facebook, is mental health specialist Dr. Saeed al-Kahlout. In his poetic style, he describes how she gently explains the lesson and promises her pupils a better future. She pauses over the "r" at the beginning of "right," he writes, then over the "l" at the beginning of "life."
A school in Nuseirat in September. Teacher Samia Wadi wrote about a student who is always late because she has to wait for her sister to hand over the pair of shoes they share. (Photo credit: Photo: Jehad Alshrafi/AP // Haaretz)
Just then, a stray bullet is fired from a tank a few hundred meters away. "The bullet sliced swiftly through the air, crossed the distance in moments and lodged in the teacher's heart ... In the classroom tent, the children watched their teacher struggle for her final breaths, drenched in her own blood. In the tent where she lived, children are waiting for their mother, not yet knowing that she will never return."
A few weeks ago, tempers flared in Gaza when some sheikh used his Friday sermon to subject his listeners, willing and unwilling alike, to a flood of abuse over women's supposedly immodest behavior. Many women and men criticized his misogynistic detachment from a reality in which women bear the burden of keeping families going under conditions so harsh they are scarcely imaginable.
Some women go further, writing about "the consequences of annihilation that no one sees. Before the war, these things happened discreetly, and very rarely. Now they happen brazenly, proudly, as a matter of routine and a way of life," as the young Najia Mahmoud writes by way of introduction. The English translation is based on Tamar Goldschmidt's Hebrew translation. For three years, Goldschmidt has been posting breathtaking texts by men and women in Gaza on her Facebook page. Amid collapsing walls and falling skies, these writers paint in words events, feelings and thoughts that no camera can capture, and Goldschmidt translates them with extraordinary skill.
Palestinians walking in Gaza last week. More than 86,000 households are headed by women, and nearly 260,000 families are living in shelters.
Credit: Jehad Alshrafi/אי־פי // Haaretz)
Mahmoud writes: "The age of slavery has not ended. It has moved into the tents and called itself 'protecting the daughter's honor' and 'the circumstances of war.' What is happening around us today makes your blood boil, turns your stomach and makes you sick beyond words. The
child marriages
that have suddenly become widespread in Gaza are not marriages. They are an auction of girls! To give you an idea of just how low things have sunk: My neighbor, a man in his twenties, is married to a 15-year-old girl. He 'wipes the floor with her' day and night. He beats her for half an hour, and the girl stays silent despite the pain. The moment a cry of pain slips out, he starts beating her all over again.
"And what drives you out of your mind, makes you go crazy and want to set every last tent on fire, is not just the beating. What drives you out of your mind is that her family is a few meters away, his family is right there with him in the same compound, and every one of them has a shoe stuffed in their mouth and says nothing! They throw their own flesh and blood to a piece of human garbage, and when you open your mouth, they trot out an excuse uglier than the sin itself: 'By God, lady, times are hard, and we can't afford to support the girls, so let's protect her honor.' What expenses? What honor are you talking about?! Anyone who can't raise children shouldn't have them in the first place! Why do you keep having one daughter after another if you're going to throw them to their torturers in such a vile way?"
Mahmoud continues: "We are living through war and annihilation. The soup kitchen feeds you, you and your children, and all of us in the tents live on aid like paupers. Not one of you is any better off financially than his daughter. These days, none of you is paying out of your own pocket, so how can you plead poverty and sell your daughter so cheaply and so shamefully? With the same coercion and lack of decency, you see a man throw his little children out among the stray dogs and into danger to peddle goods and support him! A tiny child, no bigger than your little finger, ought to be at school or at least sitting safely in his tent. Instead, he's dumped on the streets to support an entire family. What right do you have to make a child worry about keeping you alive?"
Gaza City last week. Dr. Saeed al-Kahlout wrote about children riding a donkey-drawn cart and discussing the tragic fate of their mutual friends. (Photo credit: Jehad Alshrafi/AP // Haaretz)
Writing from a different angle a few days ago, Dr. al-Kahlout described other children: "The two children sat on a donkey-drawn cart on their way back from the learning tent, their new school.
Al-Mawasi
's scorching sun seared their tiny faces. Sand from the school, where the pupils sit directly on the ground, mingled with the dust of the road and danced through their worn-out clothes. They began asking what had become of their mutual friends. 'What about Tamer?!' asked the first, sitting on the edge of the cart and lifting his little feet whenever another cart, drawn by a horse, came close, afraid it would crash into them. 'Tamer was killed with his dad at the entrance to their tent. A missile tore them to pieces. People spent three days picking up bits of flesh around the tent.'
"The boy said this while staring at something in the distance, as though the scene had suddenly appeared before his eyes. Then he remembered something, broke off his story and asked: 'And Aboud? Where is he? Why didn't he come to school today?'
"'Aboud, oh, Aboud! Both his legs got cut off. While he was asleep, a piece of shrapnel tore through the tent and landed right on them. When he woke up, they found him with his legs cut off.'
"'And what about our teacher, Mr. Issam? Did you see Mr. Issam today?'
"'Didn't you hear what happened to him? Mr. Issam got hit by a bullet while he was waiting in line to fill up water in the city center, and he got paralyzed. He's in a tent now. He doesn't react or answer.'
"'And Hani? Hani, when they went back to their house in the north, the wall fell on them. He died, and his little sister and their mom, and his dad went crazy because of it. I'm telling you, wow, he walks around the streets shouting: My children and their mother. Oh God, my children and their mother.'"
Amira Hass
is a reporter and columnist for Ha’aretz Daily, a newspaper based in Tel Aviv, Israel. She has been a journalist for two decades.
Hass has written critically about both Israeli and Palestinian authorities. She has not allowed her gender, ethnicity or nationality – all hindrances in the region she reports from – to obstruct her from pursuing the truth in her reporting.
In 1989, Hass quit her studies in history at Tel Aviv University and began working as a copy editor for Ha’aretz Daily. At the same time, she volunteered for Workers Hotline, a human rights group dedicated to reaching out to vulnerable workers, many of whom were Palestinian. She became acquainted with life in Gaza and grew frustrated about how poorly Israel’s occupation of Gaza was represented in the Israeli press.
By 1991, Hass was writing weekly features for Ha’aretz Daily, and in 1993, she became a full-time writer for the paper. She moved to Gaza, which at the time was under direct and full Israeli occupation.
Hass, now based in Ramallah, has lived in the Occupied Palestinian territories for nearly 30 years. She has been reporting on the life of Palestinians under the Israeli occupation and covering the major armed clashes and Israeli military attacks. Her goal has been to provide her readers with detailed information about Israeli policies, especially restrictions on the freedom of movement.
In the course of her work, Hass has been threatened, harassed and detained. In May 2009, she was detained by Israeli police on her return from a four-month stay in Gaza “for violating a military order” (which forbids entry into Gaza) and “for staying illegally in an enemy state.” She had also been detained in December 2008 by Israeli police on her return to Ramallah for violating the same military order.]
Proposed U.S. Census Changes Could Be Catastrophic for Public Health
Portside
portside.org
2026-10-15 18:05:26
Proposed U.S. Census Changes Could Be Catastrophic for Public Health
jay
Thu, 10/15/2026 - 18:05
...
In 2030, U.S. mortality and morbidity rates will suddenly jump. This will happen not because there is a new pandemic or a sudden rise in cases of existing diseases or injuries, or a sudden decline in access to health care. These jumps in rates will occur throughout the U.S., more in some states than others. Within states, these rate changes will be especially noticeable among four groups: college-age people, retirement-age people, people of color, and immigrants.
Even more remarkable, these shocking changes in U.S. health statistics could be averted without any new treatments or changes in access to or quality of health care.
On Sept. 10, the U.S. Federal Register published an extraordinary notice blandly titled “
Decennial Census of the Population of Americans
; Proposed Residence Criteria and Proposed Regulations for Demographic Questions.” It announced plans for
three major unprecedented and untested changes
to the U.S. decennial census, which together will
reduce, selectively, the number of people counted — and where
. Since rates are computed by dividing the number of cases by the population at risk in a specified time period, then by definition, if the number of cases stays the same but the size of the denominator shrinks, the rates will be higher.
The initial window for comments was a scant 33 days, with comments due by
Oct. 13
. Public pushback has resulted in the comment period being extended to
Nov. 2
.
1) Instead of counting the “whole number of persons in each state,” as commanded by
the 14th Amendment of the Constitution
, the count will be restricted solely to “citizens or lawful permanent residents of the US.” This excludes all foreign citizen residents who do not meet these criteria, including international students, work visa holders, and recognized refugee and aslyees, and also erases undocumented immigrants.
2) Instead of counting people in relation to their usual residence on Census Day (April 1 of the census year), the changed “rules of residence” will require counting people in relation to where they resided the most between Jan. 3 to April 1, as tied also to the address used in tax records. This will likely mean that college students will be counted as living at their parents’ address, instead of at college, and “snowbirds” and seasonal workers will be counted in the warmer states where they winter, not their primary non-winter residence.
3) Prohibit questions about
race and ethnicity
(race has been asked about since the first U.S. census in 1790) and prohibit any questions about sexual orientation (first appearing in the 2020 census in a question about household relationships).
Have any of these changes been carefully tested, following usual protocols for reviewing any changes to the census?
No
. Are they consistent with the Constitution and its amendments?
No
.
The only reason to make these changes is
partisan politics
. The Constitution allocates political power — specifically representation in the House of Representatives — and draws political districts in relation to decennial census counts of
population size
. Change the rules on who is counted where and when, and states’ population counts, political power, and political districts will change. The bet is that the proposed changes will provide partisan advantage to those proposing the change in rules.
Altering the count will affect more than just denominators and the distribution of political power. The predictable data distortions will rupture any understanding of the realities of — and trends in — U.S. morbidity and mortality rates. They will also
undermine the data used
in federal funding formulas for program eligibility and resource allocation, even as removing people from the census count by political sleight of hand does not disappear their needs.
Furthermore, the distortions will
impair the conduct and use
of population survey data involving economics, health, education, transportation, etc., by distorting the population-based sampling frames and weights on which all such surveys rely.
The far-ranging potential harms are starkly revealed by the U.S. Census Bureau’s list of
50 common uses of census data
for allocation of resources and planning, spanning every sector of the U.S. Those especially germane to health and health services include: “Planning for hospitals, nursing homes, clinics, and the location of other health services”; “Estimating the number of people displaced by natural disasters”; “Creating maps to speed emergency services to households in need of assistance”; “Facilitating scientific research”; and “Assessing the potential for spread of communicable diseases.”
Over the past 40 years, virtually all health outcomes tracked in the benchmark U.S. annual federal documents
Health, United States
and in the
Healthy People objectives
have used census population data to report rates for both the total U.S. population and by race/ethnicity, as well as occasionally by socioeconomic position. For those who think economic data are sufficient to identify who is at highest risk of poor health outcomes in the U.S. absent racial/ethnic data,
think again
.
A case in point is maternal mortality. The U.S. stands as an outlier with rates higher than those in
all other high-income countries
. Reflecting intertwined histories of racialized and economic injustice, not only are there
stark disparities
by race/ethnicity and by educational level, but there are also racialized inequities within each educational level, and educational inequities within each racialized group. Moreover,
these inequities
interact
: Maternal mortality rates are higher among Black women with a completed college education compared to white women with less than a high school diploma. Maternal mortality is a critical and preventable outcome — but prevention requires accurate data.
Prohibit collecting data on race/ethnicity in the census, and the net result will be to render invisible
longstanding
and well-known
American racialized health inequities
, overall and by socioeconomic position, as well as their changes over time.
For example
, between 1966 and 1980, U.S. socioeconomic and racialized inequities in rates of death before age 65 shrank, only to rise thereafter. These patterns likely reflect the beneficial impacts of the 1960s Great Society programs, followed by the post-1980 conservative and neoliberal backlash.
Erasing data does not erase need or harm, but instead is a time-disgraced method of avoiding accountability via the shameful ruse of
“no data, no problem.”
For these and many more reasons, the proposed changes to the 2030 U.S. decennial census must be blocked before they can ever be implemented. Everyone who cares about the health and wellbeing of the U.S. population and the integrity of data
can submit comments
by Nov. 2.
[
Nancy Krieger
is professor of social epidemiology and American Cancer Society clinical research professor at the Harvard T.H. Chan School of Public Health. She represents her own views and does not speak on behalf of her institution.]
Why Are the Democratic Socialists of America So Successful?
Portside
portside.org
2026-10-15 17:49:32
Why Are the Democratic Socialists of America So Successful?
jay
Thu, 10/15/2026 - 17:49
...
A lot has been written recently in an effort to understand the Democratic Socialists of America (DSA) and how we’ve risen to such prominence in a short time.
It is clear that we reflect a growing disillusionment with the
Democratic party
, and a further radicalization of the American population. But many leftwing social movement organizations, such as
Black Lives Matter
and the Women’s March, have risen in the last decade or so, and many groups, from MoveOn to the Sunrise Movement, have attempted to absorb large numbers of people, influence the Democratic party and enter the public consciousness with lower levels of success.
It may just be that we happened to be the organization that had the name closest to the ideology of Bernie Sanders, the man arguably most responsible for reintroducing
democratic socialism
to the popular American lexicon. But name recognition alone can’t explain both our rapid growth and the ability to sustain that growth. Sanders has also talked about the need for a “political revolution” – but his own organization, Our Revolution, is politically irrelevant.
What is missing from the discussion is the DSA’s structure.
Unlike all of the groups I’ve named, it is a thoroughly democratically run organization that allows its members to set its goals, elect its leaders and amend its constitution. None of the other organizations even have constitutions to be altered. Instead, they have corporate bylaws and unelected executive boards to maintain their
tax status
with the IRS.
While the DSA is primarily operated and funded by its growing membership, the other organizations rely on foundation funding and have a deeper reliance on professional staff. While local chapters of most of these groups have almost no control over the national structure, the DSA functions as a federation in which the national office is beholden to its constituent parts.
The DSA is not succeeding because of a good name. It is growing because it treats its members like adults capable of managing their own affairs and that of the organization, and they reward it with monthly dues and a long commitment that supersedes the natural highs and lows of uprisings.
This idea isn’t new; in fact it is foundational to the success of the American project (well, OK, success is a bit of a stretch, isn’t it?). Writing in the early 19th century, the French philosopher Alexis de Tocqueville
described
these kinds of membership-driven organizations as the “free schools” of democracy that serve as the bedrock of America’s political system.
They prepare Americans to lead and give them the political vehicles in which they can work with their neighbors to steer the country. This model is dying, but we still see it alive through organizations like the NAACP and the US Student Association, which I was a member of in my youth.
The NAACP is more than a hundred years old and the US Student Association will be 80 next year. While the DSA was created in 1982, it can trace its full history as a faction within larger organizations going back well
over a century
.
It is doubtful that the
conflict
-ridden Black Lives Global Network Foundation, the 501(c)3 organization that took the reins of the BLM movement, will survive the decade.
BLM chapters have dissolved,
broken away
or become relatively dormant across the country. The network helped oversee the largest protest in US history, but it is doubtful that there are more than a handful of chapters functioning in the country. The Minneapolis chapter, arguably its most successful, reconstituted itself as Black Visions, and then
sunsetted
after years of misalignment and the forcing out of its original leadership.
The Green New Deal-championing Sunrise Movement has fared better, but not by much. It too has faced internal power struggles between leadership, who are paid staff members, and its base.
According
to one former member, the organization went from having more than 500 chapters in 2021 to probably fewer than 90 by 2023. It has made efforts to become more democratic but could only muster 700 votes for an internal decision, despite counting more than 80,000 members years prior.
While some of this must be the natural attrition of social movements – the DSA’s membership also ebbs and flows – founders of the Sunrise Movement have publicly
recognized
the internal conflict built into their model.
And this is why the DSA will continue to succeed where most groups fail. It has clear mechanisms for its membership to change the direction of the organization without engaging in backroom schemes and internal coups. Clashes still happen, but they are facilitated by clear guidelines that allow factions – called caucuses – to vie for power, and leaders have clear term limits.
I joined the US Student Association (USSA) with a desire to learn from it and steal members for my own organization, in the vein of the
Québécois
student unions. But the USSA was so democratic and full of meaningful deliberation that I realized I could change it from within instead of splintering it.
Over a decade later, I’m a dedicated alumnus who has volunteered dozens of hours out of sheer love for the organization. There is evidence that
participating
in a thoughtful deliberative process increases satisfaction with the outcomes of a decision and trust of institutions.
I joined the DSA after sitting through one meeting and realizing that my voice actually mattered. I did not need to become a staff member or somehow be appointed to the board of directors. I could make the DSA what I want it to be, while being transformed by it in turn.
I hadn’t experienced that since my days at the USSA’s national student congress. And that is because the new model of social movement organization has long become dominant.
According
to the Harvard sociologist Theda Skocpol, grant-funded, staff-run, low membership participation models became popular in the 1970s. They create an incentive model that I believe is deleterious to long-term social change.
Foundations force organizations to become constant money-chasing machines, applying for annual grant after annual grant, and to adopt a model of centralized control that maximizes efficiency – having tens of thousands of decision-makers can be messy, after all.
This model can still bring in a lot of members, but they tend to be temporary participants, or paper members, like the millions of members of MoveOn, who donate monthly but do little to operate between mobilizations, and have no clear role in determining the future of the organization as a whole.
I supported the development of a new generation of organizations through my work as a trainer with the Momentum Community, but the groups I advised, many of which are named in this article, still suffered from this top-down non-profit model. These groups can absorb thousands of people in moments of public frustration, but they are structurally unable to keep them.
The DSA is growing not only because it reflects frustration over the status quo; it is growing also because it gives people a voice within a vehicle that promises to change that status quo.
[
Akin Olla
is a contributing opinion writer at the Guardian US.]
Tidbits-Oct. 15: Reader Comments: Diesel Prices; Setting the Record Straight on AOC & Gaza; Speaking of Public Executions; Resource From EPI – Weak September Jobs Report Shows Hiring and Wage Growth Slow; More…
Portside
portside.org
2026-10-15 17:26:06
Tidbits-Oct. 15: Reader Comments: Diesel Prices; Setting the Record Straight on AOC & Gaza; Speaking of Public Executions; Resource From EPI – Weak September Jobs Report Shows Hiring and Wage Growth Slow; More…
jay
Thu, 10/15/2026 - 17:26
...
Tidbits-Oct. 15: Reader Comments: Diesel Prices; Setting the Record Straight on AOC & Gaza; Speaking of Public Executions; Resource From EPI – Weak September Jobs Report Shows Hiring and Wage Growth Slow; More…
Published
Good
article
debunks the carping about AOCs supposed imperfections.
Funny how there so much less carping about Bernie and Zohran. Maybe because they’re men.
Below, Economic Policy Institute senior economist Elise Gould offers her insights on the jobs report released this morning. Read the full thread
her
e.
Lockheed Martin Showered Susan Collins With Cash as F-35 Program Hit Turbulence
Intercept
theintercept.com
2026-10-15 17:14:22
Collins received tens of thousands from Lockheed during a two-month period surrounding a critical 2023 watchdog report.
The post Lockheed Martin Showered Susan Collins With Cash as F-35 Program Hit Turbulence appeared first on The Intercept....
In May 2023,
the Pentagon’s shiny new fighter jet was not looking so shiny or new.
Already a decade late and nearly $200 billion over its original cost estimate, the F-35 program faced a new crisis. An internal government watchdog report detailed a
cascade of new problems
with the program, which was in a period of flux amid plans to upgrade the jet’s engine and cooling system.
The
report
from the Government Accountability Office criticized the Pentagon for lumping those upgrades in with the overall purchase of the planes. Conflating the two, the authors said, would limit congressional insight into cost increases. And they criticized the contractors behind the aircraft for failing to deliver the F-35 in a timely manner.
For Lockheed Martin, the main defense giant overseeing the development of the F-35, the timing was far from ideal. In a few weeks, Congress was set to debate the Pentagon’s mammoth budget — and with it, new funding for the military’s purchase of F-35 jets.
Collins was the largest recipient of Lockheed cash in the period surrounding the inspector general report.
So Lockheed and its lobbyists went on a charm offensive in Washington. The weapons maker shelled out hundreds of thousands over a two-month period, in what the money-in-politics watchdog
Open Secrets described
as “one of the largest coordinated lobbying efforts” around that year’s military budget.
No member of Congress benefited more than Sen. Susan Collins, R-Maine, who at the time served as the ranking member on the Defense Appropriations Subcommittee.
From May 1 to June 30, 2023, employees and top executives from Lockheed Martin donated $59,500 to Collins’s campaign committee. The donations were outliers during that period: Collins was among the largest recipients of Lockheed cash; the company was her largest single donor over those two months; and it was the largest spending blitz on Collins by Lockheed compared to the same period in other years.
The effort appeared to pay off for Lockheed. In July 2023, less than two months after the release of the Government Accountability Office report, Collins voted in favor of appropriating funds to purchase 83 new F-35 jets. Later that year, when the final version of the military budget was signed into law, Collins celebrated the economic boon she said it would bring to the state of Maine.
In response to questions from The Intercept, Phoebe Keller, a spokesperson for the Republican-controlled Senate Appropriations Committee, said Collins’s support for the jet had nothing to do with donations from Lockheed or any other firm.
“The F-35 jet program is a longstanding bipartisan defense priority,” Keller said. “Sen. Collins has always publicly supported the F-35 jet program, as dozens of both Republican and Democratic Senators.”
Collins’s position on the Defense Subcommittee of the Senate Appropriations Committee likely played a role in the outsized donations, according to analyst Dan Grazier. And Collins, for her part, would have good reason to approve the spending: The F-35 program,
Lockheed claims
, has had a nine-figure economic impact in Maine.
Fight of Her Political Life
In the final weeks of the biggest fight of her political career against Democratic challenger Troy Jackson, fresh scrutiny on Collins’s donations from defense contractors has become a sore spot for her campaign.
In some cases, the senator’s interactions with defense firms are the routine for Washington: glad-handing, lobbying, contributions, and directing pork-barrel spending back home. Not all of it, though, is standard.
Last month, a bombshell report in ProPublica detailed an
FBI investigation into an alleged pay-to-play scheme
. A former defense contractor claimed to federal agents that he worked with figures tied to Collins to disguise campaign donations — and got federal contracts totaling $32 million in return. (The FBI probe fizzled after Trump returned to office and purged the bureau; Collins denied wrongdoing, pushing back on
elements
of the report.)
On Wednesday, more than 250 Mainers signed a letter to the state’s attorney general asking the official to investigate the allegations of corruption, according to
Maine Morning Star
, a local news outlet.
And earlier this month, The Intercept reported on donations from another defense contractor, AM General, and its parent company, whose employees gave $58,000 to fundraising committees associated with Collins after a damning assessment from the Army
put its federal contracts in jeopardy
.
As with the AM General donations, the contributions by employees and lobbyists of Lockheed Martin do not indicate wrongdoing by Collins or her donors.
They instead illuminate how companies that garner lucrative contracts zero in on powerful members of Congress, who often tout the benefits to their states.
“This is an example of what’s wrong with our approach to buying weapons,” said William Hartung, an analyst who has written
critically
of defense spending and influence peddling in Washington. “If we buy things because they’re in the state of a powerful member, we’re not going to have a coherent arsenal.”
From May 1 to June 30, 2023, Lockheed’s corporate PAC
doled out $421,000
in a bipartisan blitz to various campaign political action committees, campaign funds, state parties, and charitable foundations. (Aside from 2024, the year of the presidential election, contributions in that two-month period in 2023 eclipsed subsequent years. In the same period
this year
, Lockheed’s corporate PAC made 128 donations totaling $236,000;
last year
, it gave $286,000 across 158 donations during the same period.)
Collins was by far the biggest single beneficiary of the influx of cash — which came at a time when she was not actively campaigning. And, unlike the donations spread out to other campaign committees, the cash going from Lockheed into Collins’s coffers during those months came exclusively in the form of individual donations by employees and executives, including the firm’s CEO and chief operating officer,
data
from the Federal Election Commission shows.
Of the 60 donations of $1,000 or more during May and June of that year, 56 went to Collins.
Lobbyists working for Lockheed contributed another $5,000 to Collins during that period, and corporate PACs for Lockheed’s lobbying firms shelled out another $5,500 total, according to FEC disclosures.
Among individual contributions by Lockheed employees, donations to Collins made up more than 10 percent of all donations during the two-month period surrounding the watchdog report.
Only the firm’s in-house employee PAC, which received 75 percent of all employee donations, took in more from figures tied to Lockheed. Collins got more than twice as much as the next highest recipient, ActBlue, the Democratic Party-aligned fundraising vehicle, which received 4 percent of all Lockheed employee contributions in that period, according to
FEC data
.
The vast majority donations from Lockheed employees and officials were under $1,000. Of the 60 donations of $1,000 or more during May and June 2023, 56
went to Collins
.
Virtually all employee contributions from Lockheed workers and executives to Collins during her current term came during that two-month window,
according to the FEC
.
Lockheed donations made up a quarter of all contributions during May and June 2023 to Collins’s main fundraising arm, Collins for Senator. The next runner-up was telecom giant Charter Communications, whose employee contributions made up just 8 percent of
gifts to the Collins campaign
in the second quarter of the 2023 fiscal year.
A spokesperson for Lockheed did not answer specific questions regarding the reason for the sudden influx of individual contributions to Collins in 2023.
“Our employee PAC program continues to observe long-standing principles of bi-partisan political engagement in support of our business interests,” the spokesperson wrote in an email.
Another Vehicle Army Didn’t Want
Two years later, a similar pattern played out in miniature when a lesser-known defense firm with a troubled product enjoyed Collins’s support on Capitol Hill.
Collins went out of her way last year to
slam the Pentagon
for
canceling its plans
to purchase robotic combat vehicles from Textron and its subsidiary Howe & Howe, the Maine-based developer of the Ripsaw.
Collins has repeatedly hyped the unmanned robotic combat vehicle in Senate hearings and official statements. On June 18, 2025, she took issue with the fact that the vehicle had appeared in a recent military parade, but did not make the cut for further spending.
“It’s the height of irony that you would feature this combat vehicle in your parade as the future of the Army at the same time that you’ve canceled the contract — the cancellation of a contract that was won over a lot of other competitors,” Collins said, describing the decision as “terribly unfair and a real mistake.”
A month later, after the military budget cleared the Senate Appropriations Committee, Collins
singled out Howe & Howe
, and its plant in Waterboro, Maine, as a potential beneficiary of a portion of $44 million allotted to outfit the U.S. Marine Corps with amphibious and autonomous vehicles.
She gave another shoutout to Howe & Howe in January, after the 2026 military budget was signed into law. This May, during the congressional testimony by then-Army Secretary Daniel Driscoll, Collins
again took the military to task
for cutting its planned purchase of the Ripsaw.
Textron’s corporate PAC made contributions totaling $4,000 to various PACs associated with Collins just ahead of her vote on the 2026 military budget. $3,000 of the gifts came days after Collins criticized the military for cutting its plans for the Ripsaw program that would have brought millions of dollars to Howe & Howe.
Later in the year, the Textron corporate PAC donated another $7,000 to Collins for Senator and the Collins-linked Dirigo PAC, according to
FEC filings
. (A spokesperson for Textron and Howe & Howe did not respond to a request for comment. Keller, the Senate Appropriations Committee spokesperson, did not respond to questions about the Textron and Howe & Howe donations.)
Employees of Textron and its subsidiary, meanwhile, made contributions to various Collins-linked PACS totaling nearly $15,000 between September 2025 and October 15, 2026,
FEC data shows
.
The donations, relatively small in the post-
Citizens United
era of campaign finance, still illustrate a troubling pattern of how influence plays out in Washington, according to Hartung, the analyst critical of military spending.
“A lot of members lobby to get more units of something built in their state, or craft legislation for a system that only their local firm can produce,” Hartung said. “It’s kind of business as usual, but sometimes business as usual causes great harm.”
Comparing New York's Most Powerful Judges' Records Has Never Been Possible—Until Now
hellgate
hellgatenyc.com
2026-10-15 17:10:14
A new platform called Decoded lets New Yorkers look up how our most powerful judges are voting....
New Yorkers can now see how the judges on the state's highest court decide on issues like tenant protections, immigrant rights, voting access, and policing through
a new public information tool
launched this week.
Our Court of Appeals judges dictate how the rest of the state's courts must rule. Now, with a few clicks, New Yorkers can compare, side-by-side, how each of the appeals court judges have voted when the court had a split decision.
The platform, called Decoded, is the newest project from Oded Oren, who in 2023
left his job as a public defender to start Scrutinize
, a website dedicated to increasing judicial transparency. (Hell Gate used Scrutinize as a research tool for our project
Courts of Contempt
, a deep dive into how judges become judges in New York, and the consequences the broken system can have for everyday New Yorkers.)
Decoded uses AI to scrape and organize the judges' decisions, a platform Oren launched Wednesday after a year of intense development and trial and error. (It was worth it:
Oren won a David Prize for his efforts
.)
"If a New Yorker is interested in a specific judge, they can go to their profile page, and they can see their record on the issues that they care about: voting rights, healthcare, criminal justice, and so on," Oren explained.
A screenshot from Decoded. (Scrutinize.org)
To launch the project, Oren used Court of Appeals
Judge Jenny Rivera
as an example—laying out her entire 13-year voting record on its website. It's a fascinating case study, because Judge Rivera's term ends in February 2027. By looking at her decision-making record, we can see what kind of judge we are set to lose from the bench, as the legislature, state government, and Governor Kathy Hochul begin to consider whether they will reappoint her or appoint someone new.
The record shows that Rivera—the judge who has been on the bench the longest—pulls the bench to the left in many categories. She's voted to increase noncitizen protections in 88 percent of cases—more than any other judge. She's voted 100 percent of the time to increase tenant protections, also more than any other judge. She's voted to increase due process protections almost 70 percent of time, the highest rate of any judge, and voted to increase criminal punishment in just 29 percent of cases—one of the lowest rates of the seven justices.
The Commission on Judicial Nomination is currently vetting those who have nominated themselves to take Judge Rivera's position, Oren said. Now, for the first time, the decision makers will have data at their fingertips about the bench they've already selected, and the type of judge they're looking at replacing.
Hell Gate caught up with Oren on Thursday to learn more about how Decoded changes the judicial appointment game, and how regular New Yorkers can use it—including
to see which judges terms are up soon
.
This interview has been lightly edited and condensed for clarity.
Hackers exploit Collabora RCE flaw to backdoor Nextcloud servers
Bleeping Computer
www.bleepingcomputer.com
2026-10-15 16:25:04
Threat actors are exploiting a critical command execution flaw, now tracked as CVE-2026-110447, in the Collabora Online - Built-in CODE Server app (richdocumentscode) for Nextcloud. [...]...
Threat actors are exploiting a critical command execution flaw, now tracked as CVE-2026-110447, in the Collabora Online - Built-in CODE Server app (richdocumentscode) for Nextcloud.
CVE-2026-110447 impacts richdocumentscode versions before 26.4.303 and resides in the Nextcloud app’s mechanism for starting the bundled Collabora server.
The flaw affects only the optional built-in CODE server app. Standalone Collabora Online servers, Docker and RPM/DEB installations, and Nextcloud All-in-One deployments remain unaffected, according to Collabora.
The attacks involve sending a malicious request to the app’s
proxy.php
endpoint, triggering OS command injection.
A key prerequisite for successful exploitation is that the built-in CODE server must be stopped (e.g., after a restart, upgrade, crash). Authentication or user interaction is not required.
According to the reports, the attacker planted PHP webshells and used them to search for password databases, password manager artifacts, and cryptocurrency wallets.
System administrators are recommended to upgrade to version 26.4.303 or later, or remove the server app if not needed. The vendor warned that disabling the app is insufficient.
Beyond the mid-September warnings from maintainers, a
community warning
was also published on October 3, urging administrators to update immediately due to ongoing exploitation.
However, the lack of a CVE ID made it more difficult for administrators to pinpoint the issue correctly and implement efficient defenses.
A
study
from cybersecurity company Second Security illustrates the gap between security fixes and formal vulnerability notifications.
The firm analyzed real-world examples from open-source flaws and found that the median interval between public fixes and CVE publication was 39 days in August, up from 5.1 days in January.
The researchers suggest that growing volumes of AI-assisted vulnerability discoveries are straining CVE processing and contributing to publication delays.
Source: Second Security
In many cases, the researchers found public exploit code emerged online within hours of a security fix and several days before the corresponding CVE was published.
Second Security notes that the use of AI tools makes it easy for attackers to generate working exploits for published fixes.
Examples of public exploits and CVE appearance times
Source: Second Security
In Collabora’s case, the fix was committed on September 9, and version 26.4.303 was released on September 11. The advisory and CVE were published on October 14, a gap of more than four weeks.
BleepingComputer contacted Nextcloud with questions about its response to the malicious activity reports, as well as details about the attacks and the number of impacted systems.
Nextcloud told BleepingComputer that Collabora reported the vulnerability in mid-September and that an update became available through the app store.
The company justified the disclosure delay by saying it gave users time to update and that it had not observed widespread exploitation.
In a
blog post
earlier today about the activity, Collabora attributed the delayed announcement primarily to GitHub CVE-processing backlogs, which it said were under strain from increasing volumes of AI-driven security reports.
Join Mikko Hyppönen and security leaders from the NFL, CHANEL, and Atlassian for a two-hour digital summit on what AI-speed attacks change, what defenders should stop doing, and how to validate, decide, fix, and re-validate at machine speed.
Matthew Garrett: Epic's EAC2 v2 seems fairly easily bypassable
PlanetDebian
codon.org.uk
2026-10-15 16:23:59
Epic just announced the upcoming version 2 of their Linux implementation of Easy Anti-Cheat. It’s based on using the Linux eBPF security module to monitor what’s happening, and then a bunch of extra infrastructure to make sure this can’t be bypassed. The core part of this is requiring secure boot be...
Epic just
announced
the upcoming version 2 of their Linux implementation of Easy Anti-Cheat. It’s based on using the
Linux eBPF security module
to monitor what’s happening, and then a bunch of extra infrastructure to make sure this can’t be bypassed. The core part of this is requiring secure boot be enabled (ensuring that modified kernels can’t be used), using measured boot to verify that secure boot is enabled and which keys are used (to prevent you from just signing your own modified kernel), and then doing remote attestation, a mechanism where the TPM generates a signed copy of the boot measurements and passes that off to a server which verifies it came from a real TPM, verifies that you have secure boot enabled and are using the right keys, and presumably then allows you into the game.
This is all fine as long as you can prove that the measurements provided are real, and that’s actually a lot harder than you might think. First, we can simply make up our own quote signed with our own key and say that it came from a TPM. This is avoided by every TPM having an Endorsement Key (or EK) and an associated certificate, with that certificate being signed by the TPM vendor. If you have a list of all the legitimate TPM vendors and their CA keys, you can verify that the measurements came from a real TPM. Easy enough. So we need to get the measurements from a real TPM, and the one on our motherboard contains the measurements that were generated by the firmware and bootloader, and we can’t reset those at runtime without resetting the TPM, which… oh huh there’s actually nothing stopping us from doing that at runtime, as long as we have access to the hardware. Many desktop boards have the TPM on a small plugin module with a standard pinout that includes a reset pin. Simply short that to ground briefly and the TPM is back in its initial state, and userland can write whatever measurements it wants to it. Boot a modified kernel which lies to the eBPF code? As long as you replay the expected log values from a boot with secure boot on and a trusted kernel, the TPM will still happily provide a legitimate set of measurements that’ll satisfy the checker.
What if the TPM is less accessible, either because it’s mounted directly to the motherboard or it’s inside the CPU or chipset? That’s going to be trickier. But here’s the thing. The quote needs to come from
a
TPM, but not necessarily the TPM on your motherboard. TPMs these days are usually connected via the
Serial Peripheral Interface
, usually referred to as SPI. Microchip make a
USB to SPI bridge
, and there’s a
Linux driver
. Wire one of those up with an appropriate header and you can plug in an easily available TPM module intended for plugging into a motherboard, and now we tell the kernel to ignore the motherboard TPM and make /dev/tpmrm0 point at the USB one and program it with a set of trusted measurements and once again everything is going to look just fine (yes obviously the eBPF code can look for this, but we’re running a modified kernel so we can just lie to the eBPF code).
Remote attestation on PCs just doesn’t work that well in environments where you can’t associate a specific TPM with a specific system, which is basically everywhere except enterprises. But maybe that doesn’t matter and cheaters wouldn’t be willing to spend the $20 or so it’d take to produce one of these things? That would seem somewhat surprising, but it’s not impossible. And obviously any server-side cheat detection that triggers could then block that specific TPM, meaning they’d need to go and get another TPM, and maybe that ends up being enough to discourage people from bothering. From a practical level, this may be sufficient. But at a technical level? It’s not great.
I’ve always had a foot in the self-hosting world, long before it was called that. My freshman year of university, I ran a website from a Linux box underneath my bed. There was some downtime when my roommate got tired of the fan noise and turned it off. For several years I ran
MythTV
, then
XBMC
(later known as Kodi).
Recently, I lived for a few years in India, where streaming services are extremely inexpensive by western standards. We had Netflix, Disney Plus (Hotstar in India), and Spotify. After leaving India, I was unwilling to pay western prices for these services. But I had also become fed up with the engagement treadmill, particularly for my son. We wanted to limit his viewing choices to certain programming, but the constant “recommended for you” and “up next” caused conflict. While there are ways to limit content to specific titles, or disable auto-play, doing this for each service and keeping track of when client applications change and need to be reconfigured is too much work.
So, I “cut the cord” in a different sense, ditching streaming services for self-hosted
Jellyfin
. Over the course of the next year and a half, Jellyfin opened the door to self-hosting many other services, reducing my dependence on cloud service providers, and providing a welcome stability. No longer am I constantly confronted with unnecessary site redesigns, new features of questionable value, and a barrage of e-mails about terms-of-service updates, binding arbitration, data breaches, etc. I read the release notes of new versions of the software I host and decide if and when I want to upgrade.
Rules
I have a few ground rules.
With the exception of VPN servers that run on my router, I do not expose any services directly to the public internet. I don’t care how convenient it would be, or how secure an application is. Especially with AI-assisted hacking, I simply don’t think it’s wise. My ISP also uses
CGNAT
for its IPv4 addresses, so my home network is not directly reachable from the public internet via IPv4. My VPN servers are only publicly routable on IPv6, a limitation that has some downsides but is workable for my use cases, and likely helps limit unfriendly attempted connections. The biggest downside is that my VPN will almost never function on a public Wifi network, since these rarely offer IPv6. When using my phone, I can disable Wi-Fi and connect over mobile data… if there is service.
I prefer running services natively when possible, but will containerize complex services or those with many dependencies. Love: a service that’s a single Go binary. A service that only comes as a Docker compose file and wants to run MySQL, Redis, and three other containers? I’m already looking for an alternative. If the dependencies aren’t overwhelming, native is better, faster, and more efficient. I can use the same management tools and commands across multiple services. There’s no mental overhead of having to get into this container to run some command, finding out this container is missing curl, that one runs busybox so all the arguments are different, or dealing with a virtual network and host port mapping.
Related, I don’t do Docker anymore. It’s not really a principled position, but I grew tired of having to manage a completely separate service control system on my server. I’m already using systemd, and at this point
Podman’s integration with systemd
is excellent.
Hardware
Last year I bought a Beelink Mini PC, specifically an S12 Pro with an Intel N100 processor, 16 GB RAM, and a 512 GB internal SSD. It was before the rampocalypse, so I paid EUR 180. The same listing on Amazon is currently EUR 359. Ouch! Attached to the server is a 6 TB hard drive for media storage.
My
comment on Hacker News
about what I self-host prompted some questions about how all of this could run on 16 GB RAM. As I describe below, there are some choices I’ve made that reduce resource demand on my server, but ultimately it turns out you don’t need much hardware to run a lot of stuff. Obviously I’m not running any local inference on this hardware, but for everything non-AI, it has just worked out of the box, or with some simple configuration tweaks.
Services
In alphabetical order.
Actual Budget
Budgeting software with desktop clients and a web application, custom reports, and rules-based categorization. I only use this for budgeting and checking/savings/credit accounts. For tracking investment accounts, I use a cloud service. Some day I’ll try to move away from the latter…
While
Actual Budget
supports automatic transaction import from various banks, I don’t use this feature. Instead, after each month end, I download the prior month’s transactions (OFX format preferred, CSV if no other option) and import them manually. This works for me because I primarily use Actual Budget for expense tracking, not… actual… budgeting.
Podman.
Audiobookshelf
Add, download and store audiobooks and podcasts on your server, listen to them on your phone. I haven’t used the audiobook feature much, I set it up more for my kids, but it has very nice chapter handling. In the past for podcasts I used PlayerFM, then Pocket Casts, but now unless I’m out of the house without VPN connectivity, I use
Audiobookshelf
.
Native.
Automatic Ripping Machine (ARM)
ARM
automates ripping and transcoding DVDs (and Blu-rays, but I don’t do those). Yes, it’s 2026 and I still rip DVDs. Remember, we cut the cord, so not only is this a conduit for new-to-us content, but it’s also a way for us to get bilingual content (English and French).
Podman.
Backrest
Web UI for
Restic
backup software. Backups are important! Especially for Immich (photos). Restic does a good job deduplicating and compressing backed up data, and
Backrest
makes it easy to manage the storage retention policies. Notifications in case of failure go to Gotify.
Native.
Beszel
Beszel
is a simple monitoring dashboard that collects basic stats from agents (in the old-fashioned sense of a small background service) to display CPU load, memory and disk usage, temperature, battery, etc. Helps me keep an eye on various other hosts I have around the house (several Rapsberry Pis and a Proxmox cluster that may be the subject of a future post).
Native.
Caddy
Caddy
is a web server and reverse proxy. Early on I didn’t understand the value of a reverse proxy, and I thought I would be fine accessing my services with a local DNS name, or even IP address, and port number. But then I started adding more and more services, and some required HTTPS. So I got a domain name (not this one) and set up Caddy to automatically obtain LetsEncrypt SSL certificates, and now nearly all of my services are accessible on my LAN (or over VPN) with HTTPS and friendly subdomain names. Adding a new service is a quick edit to the Caddyfile.
Native.
Cockpit
Cockpit
is a web-based admin console for the server. It uses normal system authentication methods. For me, it’s mainly useful for spotting failed services when no notifications are set up for them.
Native.
Forgejo
Forgejo
is a fork of Gitea, and deploys as a single binary. Github’s uptime is the butt of a lot of jokes these days, but I also appreciate the speed of having my own git remote. Eventually I’ll set up CI/CD and runners, if only to deploy this blog.
Native.
Web-based RSS reader
. These days I basically visit two websites, though, so I’ve not been using it much. I do subscribe to the Github releases of some of the services I self-host so I can check out the features and bugfixes in new versions.
Native.
Frigate
Network video recorder (NVR). I first started with
Zoneminder
because I’m of a certain age. But it became clear that Zoneminder is past its prime.
Frigate
has been fantastic. I run it with 8 IP cameras. It provides alerts for people and cars entering the driveway, integrates with Home Assistant to power various automations (e.g., when a person is detected in the backyard, turn on the camera floodlight). I may write a future post with some details about my IP camera adventures.
I run all of my cameras at lower resolutions than they support, primarily to avoid Wi-Fi network congestion. Most cameras also support an even lower-resolution RTSP substream, which is what Frigate uses for motion and object detection. Keeping the camera resolutions low avoids excessive CPU and memory from video processing, and excessive disk usage from recordings. They are good enough to identify faces, and privacy laws in my country prohibit filming public rights of way, so my cameras are not aimed at distant points.
Podman.
Gonic
Subsonic-compatible server written in Go. I purchased a perpetual Subsonic license a long time ago, but the original project is ancient and the modern alternatives are better. I run two separate instances of
Gonic
, one serves kid music, the other serves adult music.
Native.
Gotify
Simple notification service written in Go. Many self-hosted services directly support
Gotify
notifications, or can send them via a custom HTTP POST. In conjunction with Uptime Kuma, I use Gotify to get notifications about any services or devices that are down, what my kids are watching on Jellyfin, when a new podcast episode is available in Audiobookshelf, etc.
Native.
Home Assistant
Home Assistant
probably deserves its own post. It’s fantastic, and I cannot imagine trying to accomplish the same things within a proprietary ecosystem like Google Home, Amazon Alexa, or Apple Home. Things are better now that device manufacturers are standardizing on protocols like Matter, but the control and flexibility you get with Home Assistant is hard to beat. It has a steep learning curve, though, and I need to think about realistic ways to handle potential server failure without compromising the functionality of my home.
Podman.
Homepage
At some point I realized I was running so many services, I needed another service just to keep track of them all.
Homepage
was a good solution. It has widgets for almost all the services I run, so I can get a quick overview of what’s going on, or just a quick link to the subdomain of a service.
Podman.
Immich
Google Photos alternative. I was tired of Google constantly promoting paid storage plans in their apps. I was able to manage my storage space, but my wife was always about to run out of room. We moved to
Immich
last year, just after version 2 was released. It’s much faster to load pages full of photos when all the network activity is within your house. I’ve come up with a solution for sharing albums with family, as well. Still a lot of work to do with Immich - I have many duplicates, and now that storage isn’t a concern, I’ve been less disciplined about culling photos and videos.
Podman.
Jellyfin
As I mentioned in the introduction, I’ve self-hosted media for a long time, going all the way back to MythTV twenty-some years ago.
Jellyfin
is opinionated about its media organization, but it generally works well. I only use it for movies, TV, and home videos, so I can’t speak to its other features (e-books, music, photos, etc.). While my son still remembers Netflix, he is satisfied with Jellyfin. I appreciate the lack of auto-play, never seeing recommendations, and not having to scroll past a bunch of garbage to find what I want to watch.
One of my ways of managing resource demand is by generally preferring 720p media over 1080p or higher. And obviously when ripping DVDs, it’s either 576p or 480p. I do have a 4k TV, but it’s not extremely large, and while I can tell the difference in resolution between SD and HD, for almost everything, 720p seems to be good enough for me.
Podman.
Music Player Daemon (MPD)
Sometimes there are solutions that just work, and don’t really need to change. I think
MPD
is one of these. It’s been around for 23 years. While Gonic is great for listening to music on my phone, even streaming music from home to my phone while I’m away via VPN, MPD is how I play music through Snapcast to the whole house audio system. I run two instances of MPD, one for music, and one for podcasts.
Native.
PocketBase
I used to keep track of transactions and receipts for special accounts (HSA, 529, etc.) in a SQLite file I accessed directly with SQL Workbench/J. But things became more complicated as I moved between countries, currencies, and different insurance systems, and also wanted to offer my wife the ability to enter transactions. I migrated to
PocketBase
, which is ultimately still just a SQLite file, but with a nice web-based management frontend that I abuse as a generic CRUD frontend. It’s simple enough for my wife to use as well, and I can still run arbitrary queries against the underlying database file.
Native.
Readeck
Readeck
lets me tag and archive copies of stuff I read. I was a heavy
Zotero
user in graduate school, but I’ve not needed to write a bibliography in years. However, I still read things that I want to ensure I can access later. I tried
Wallabag
first, but it had trouble archiving things that were paywalled, even when I was logged in on my phone. In contrast, Readeck will archive what my phone is seeing and store it on my server.
Native.
Samba
Samba
provides shared network storage, making it easy to copy files to and from the server, or share important documents with my wife. It’s funny how a file sharing protocol first developed in the 1980s and most associated with Windows remains the best option for cross-platform file sharing on a LAN.
Snapcast
provides whole-house synchronized audio. Think Sonos, but without the expensive vendor lock-in and planned obsolescence. This also deserves its own post. It’s complicated to set up, but it works really well. I eventually plan to purchase some additional devices primarily for use as Snapcast receivers.
Native.
Syncthing
Syncthing
is part of a backup strategy for my photos in Immich. I’ve set up a one-way sync (receive only) on my Macbook, so that a copy of all the photos in Immich eventually make their way to my Macbook’s external drive.
After a few instances of my wife saying “X isn’t working” and needing to restart a service manually, I realized I needed a way to keep track of what services were running, or not.
Uptime Kuma
is simple but has a useful set of features. I can ping devices to ensure they’re online, check the status of Podman containers, look for HTTP 2XX response codes from various services, or even parse a JSON payload and extract some details for the health check. If something goes down, I can send a Gotify notification (after a few retries, of course).
Podman.
Vaultwarden
Self-hosted version of Bitwarden. For years, I used
KeePass
, but never had a good syncing solution, so just avoided logging into things on my phone. Meanwhile, my wife used LastPass, which had various breaches and incidents, besides autofill just not working very well. Migrating her to KeePass was not practical, and I settled on
VaultWarden
, which is an open-source API-compatible reimplementation of BitWarden that works with the official BitWarden clients. I’m not a huge fan of the BitWarden browser extension, but it’s mostly fine. The Android application is good enough, and syncs seamlessly and automatically when I’m connected to my LAN; otherwise, I can connect via VPN and manually trigger a sync if needed.
I am a little concerned that Bitwarden may eventually become hostile to VaultWarden and break the client compatibility. At this point, the only other major Bitwarden compatible client I’m aware of is
Keyguard
, which does not have an open source license and uses a freemium model.
Podman.
Vikunja
I’ve been a Trello user for about a decade. But after Trello’s
disastrous multi-day outage
earlier this year, I decided to find a self-hosted alternative. I ruled out anything that involved spinning up a PostgreSQL or MySQL database for a service that will serve two users.
Vikunja
uses SQLite by default, though it can be configured to use other database backends. It’s not perfect, and the Android application has some missing features, but it’s good enough for me. Single binary deployment? Yes, please.
Podman.
Yubal
Simple web application to download YouTube Music playlists. I normally use
yt-dlp
for downloading YouTube videos, or
NewPipe
for watching on my phone, but
Yubal
will properly name, organize, and tag music downloaded from YouTube Music.
Podman.
Non-Services
Here are a few things I don’t self-host, tried but decided against, or am unlikely to try.
The *arr Stack
Sonarr, Lidarr, Radarr
, etc. Every time I read about setting it up, it just sounds like a resource-intensive mess that’s fundamentally prone to frequent breakage. That’s the opposite of what I’m looking for when choosing self-hosted services.
Collabora Online
While it would be nice to completely part ways with Google, it’s hard to beat Google Docs as a highly convenient and easily accessible way to store and share information. Still, I choose LibreOffice Writer and Calc unless I have a specific reason why the document needs to be in the cloud. Since I already have a shared network drive, it seems pointless to run a service like
Collabora Online
(a web-based office suite) instead of just using LibreOffice locally.
Firefly III
I tried
Firefly III
before Actual Budget, thinking I needed built-in support for multiple currencies. It was a complex setup, involving multiple containers, including a container just for importing data. Actual Budget was much simpler to set up and use. For my foreign currency accounts, I have my own simple script to handle exchange rate conversion, so everything in Actual Budget stays in USD.
Owntracks
I like Google Maps Timeline, but after Google limited the location data to the individual device, I hoped to find a self-hosted version. But I could never get the
OwnTracks
Android application to consistently report my position, no matter how many battery or location settings I tried.
Dawarich
is another option in this space, but it wants to run “at least” four containers (PostgreSQL, Redis, Sidekiq, web application). For me, that’s not a compelling trade of resources required versus value I’m likely to obtain.
Music Assistant
Music Assistant
might work better for you if you don’t already have a music setup you like. In my case, I already had Gonic, Snapcast, and MPD working well. Music Assistant felt like it wanted to “own” everything; for example, it seemed to continually rearrange my Snapcast device groups.
E-mail
Self-hosting e-mail seems like a lot of work for very little benefit. I cannot risk not being able to send or receive e-mails. Eventually I would like to transition away from Gmail to a paid provider.
Conclusion
That’s 17 native services and 11 Podman services, all managed by systemd.
htop
currently shows about 7.5 GB of memory in use, and CPUs fluctuating between 30% and 40%. It turns out this Mini PC can run a lot! Given how expensive computer hardware has become due to the AI crunch, I hope we’ll continue to see self-hostable projects that prioritize simplicity and efficiency.
[This is a guest post by
Rikab Gambhir
. This blog post was initially written in a different file format and converted using AI. — T.]
First, they came for the artists,
and I did not speak out, because I was not an artist.
Then, they came for the mathematicians,
and I did not speak out, because I was not a mathematician.
Then, they came for the physicists,
and it was actually really cool and they gave me free tokens and promised to solve my entire field for me and now I can finally devote myself to the important work of publishing papers instead of doing physics
In early October, OpenAI fulfilled every mathematician’s childhood dream.
I am not a mathematician myself (merely a theoretical particle physicist, which some argue barely counts as a scientist either), so I can’t 100% say for certain what inspires someone to pursue mathematics. But, I imagine this dream is common to all academics:
Looking up at the stars in wonderment, or enjoying a complex puzzle game, or being inspired by an encouraging teacher, and dreaming that one day an unfeeling corporate robot[1] will burn a rainforest to compile a list of 700 highly obscure barely-readable facts that *might* be true that nobody can understand as part of a marketing gimmick to raise hype for an IPO[2]
.
This is probably why most of you reading this got into academia. At least, that’s why I did.
In 1941, Jorge Luis Borges imagined a
library
containing every possible book that could ever be written. Somewhere in this Library of Babel is a proof of the Riemann hypothesis, the complete all-orders theory of quantum gravity, and all the papers I will ever write. Of course, there are also incorrect proofs, theories, and
misleading Lean certificates
, but that is besides the point.
By the research standards of 2026, Borges’s Library of Babel would be the most successful research institution in human history, containing an inconceivably large number of potentially correct mathematical and physical results, blowing
OpenAI’s mere 722 write-ups
and even the
physics community’s recent 2500 write-ups
out of the water.
Of course, most recognize that Borges was a visionless fool who failed to recognize the commercial potential of his library, as he never actually built it. He did not have the entrepreneurial STEM-spirit to raise venture capital, launch an IPO, and announce that he had the potential to solve all of mathematics. He was too concerned about the futility of sorting through randomized slop trying to understand what is correct and what isn’t and how to understand it all. But what did Borges know? He was only a writer, and we have already established that artists are obsolete.
Fortunately, OpenAI has brought us one step closer to realizing Borges’s vision. Rather than generating every possible mathematical paper, they’ve found a way to probabilistically generate things that
look
correct. An important aspect of this increase in efficiency is outsourcing the tedious, unprestigious, and unprofitable work of determining the actual correctness and understanding to the mathematics community (in the past, this was reserved typically for the group writing the paper), while also not wasting any time making the papers human-comprehensible. This is, of course, a tremendous breakthrough. In centuries past, scientists and mathematicians were limited in their ability to solve problems by their ability to understand the solutions. This bottleneck has been removed, and now there is no theoretical limit to the amount of scientific and mathematical factoids we can fail to understand.
From what I know about the academic community (mostly from Twitter and LinkedIn, which I assume are representative), there seems to be near-unanimous agreement that the purpose of math and science research is to gather a large quantity of potentially true factoids in a repository that nobody will actually ever read, in a ritual called “advancing humanity’s[3] knowledge”. That these results are well-written, understandable, pleasant to read or look at, or even completely correct is a secondary concern — in fact, in the pursuit of advancing humanity’s knowledge as quickly as possible, many academics will recoil in anger at the suggestion that it is worth spending any time making results understandable to humans. It is inefficient to explain or check a result when those resources can be spent generating another.
This aligns with my own lived experiences —
I didn’t become a theoretical physicist
to learn about the universe or better appreciate the beauty of nature myself (that’s philosophy, which I would never be a doctor of). Nor did I spend years learning to write code, make pleasing plots, or craft well-written papers for the simple satisfaction of creating something (that’s art, and we’ve already established that art is obsolete). Rather, I became a physicist to stare at large databases of histograms produced by a Lovecraftian-autocomplete of dubious correctness and say “yeah that’s probably ok I guess” to add to humanity’s knowledge frontier.
I live to serve the knowledge frontier and
nothing else
.
Math and science are about cold, hard answers, just as art is about producing images, music is about producing sound waves, and literature is about producing strings of text. These things exist to be consumed as content. No rational person, least of all us masters of rationality in STEM, pursues these for the joy of creation, learning, or beauty — all of these are inefficiencies, and we mustn’t be inefficient lest we stifle humanity’s progress. LLMs are not burdened with these inefficiencies, and they will be merely the pursuits of those left behind with nothing more productive to do all day.
Personally, I look forward to the day when ChatGPT can enjoy a sunset or a nice meal on my behalf and free up my time, in the same way I save time on scenic hikes using Uber. And now that AI has solved all our problems, we can devote ourselves to more important work: going into quantitative finance, vibecoding sports-betting apps, consuming AI-generated TikTok shorts, and arguing with political bots on Twitter.
Ultimately, this isn’t just about mathematics or physics — it’s about fundamentally reimagining what it means to be human. By outsourcing the burdens of curiosity, creativity, and understanding, we can finally focus on what matters most: generating value, maximizing productivity, and accelerating progress towards the ultimate goal of science: a complete repo of potentially true facts in a Library of Babel that nobody will bother reading.
Thank you to Terry Tao and Rachel Ward for the opportunity to write a guest blog post! And thank you to Radha Mastandrea, Benoit Assi, Manuel Szewc, Jure Zupan, and Jesse Thaler for their feedback on this essay.
Remember why you chose to go into science and math in the first place!
[1] To be clear, in your childhood dream, you don’t get to make the robot yourself. It’s a giant corporation’s robot that they made in part by stealing things from you and your friends. It’s also not a particularly cool or robot, it can only talk in HR-speak.
[2] To be clear, in your childhood dream, it’s somebody else’s IPO and they get all the money, not you.
[3] Here, “humanity” is metaphorical, and does not refer to any actual real person understanding anything.
On the technical actions needed to ensure the continuity of UTC
Lobsters
www.bipm.org
2026-10-15 16:22:14
No more leap seconds. Sorry, about the title, but I couldn‘t resist.
Comments...
On the technical actions needed to ensure the continuity of UTC
The General Conference on Weights and Measures (CGPM), at its 28th meeting,
recalling
that
the CGPM, when adopting Resolution 2 “On the definition of time scales” at its 26th meeting (2018),
confirmed that Coordinated Universal Time (UTC) is a time scale produced by the International Bureau of Weights and Measures (BIPM) with the same rate as International Atomic Time (TAI), but differing from TAI only by an integral number of seconds,
stated that UTC is the only recommended time scale for international reference and the basis of civil time in most countries,
the CGPM, when adopting Resolution 4 “On the use and future development of UTC” at its 27th meeting (2022),
recalled that the offset by an integral number of seconds is due to the agreement maintained between UTC and the time scale describing the angular rotation of the Earth (UT1),
decided that the maximum value for the difference
|UT1-UTC|
will be increased in, or before, 2035, to ensure the continuity of UTC for at least a century,
requested the CIPM to draft a resolution for the 28th meeting of the CGPM (2026),
recognizing
that
industrial users and the synchronization needs of national critical infrastructures, for example transportation, energy distribution, telecommunication, and space projects require UTC to be continuous without any future adjustment,
for some applications it is necessary to fix a maximum value for the difference
|UT1-UTC|
to appropriately design the software underlying operational systems,
in many countries there are differences of more than one hour between local apparent solar time and civil time due to the choice of time zone, and changes of an hour are regularly introduced when daylight-saving time is used,
further recognizing
that
users of UT1 can find information on the value of the difference
UT1-UTC
in the Global Navigation Satellite Services (GNSS) navigation messages, and internet services provided by the International Earth Rotation and Reference Systems Service (IERS), National Metrology Institutes (NMIs), and other services,
the International Telecommunication Union Radiocommunication Sector (ITU-R), through its Working Party 7A, is studying possible updates of the code for the transmission of the difference UT1-UTC by radio stations and Resolution 655
(REV.WRC-23)
resolved to “establish a transition period for implementation and allow for the possibility to disseminate the increased difference between UT1 and UTC via radiocommunication system until 2035, but no later than 2040, in cases where existing equipment cannot be replaced earlier”,
noting
that
a workshop organized by the Consultative Committee for Time and Frequency (CCTF) and IERS in March 2025, which included experts on Earth rotation, estimated that the probability of a negative leap second will increase rapidly in the near future, reaching a 30 % probability by 2035,
a negative leap second has not previously been applied, and it is considered to pose a high risk of causing anomalies and disruption to critical infrastructures that are largely unprepared, and the preparation would create, for the industries that rely on time synchronization, a need for financial investment, whose amount is estimated to be similar to their preparations for the millennium bug,
the growing influence of IoT (Internet of Things) technologies, dispersed multi-sensor systems, smart grids, and virtual services for contemporary society, creates an increasing risk of malfunction in operation of systems and services with the insertion of any leap second, especially with a negative one,
the use of different mitigation methods for leap second introductions by global service providers in their server systems, in order to avoid time steps, leads to inconsistency in timing between different systems and in the disseminated time and frequency, which do not conform to the SI unit,
international organizations including the International Telecommunication Union Telecommunication Standardization Sector (ITU-T), the International Union of Radio Science (URSI), international working groups such as the Institute of Electrical and Electronics Engineers (IEEE) 1588, and individual industry representatives have provided formal statements to the BIPM on the need to bring forward the implementation of UTC as a continuous time scale to avoid the risk of the insertion of a negative leap second,
the additional risk of a delay in updating UTC could cause some user organizations to change their reference time scales to, for example, a GNSS time instead of UTC, seriously compromising the concept of international standardization in metrology,
welcoming
the excellent collaboration between the BIPM and the ITU-R and the endorsement of CGPM Resolution 4 (2022) at the World Radiocommunication Conference by Resolution 655 (REV.WRC 2023),
the support and engagement of the IERS to take all necessary measures to change its operational provision for, and its announcement of, leap seconds according to the CGPM resolutions,
decides
that
continuous UTC will become effective on 20 May 2027,
the maximum value for the difference
|UT1-UTC|
will be 3 600 seconds (1 hour), ensuring the long term continuity for UTC for several centuries,
requests
the BIPM
to continue to collaborate with the International Telecommunication Union (ITU), International Astronomical Union (IAU), International Union of Geodesy and Geophysics (IUGG), IERS, and other organizations that may be impacted by this decision in order to
inform users and support the application of this decision,
continue to monitor the value of
UT1-UTC,
its estimated evolution and modelling as determined by the IERS,
inform the CIPM regularly on the evolution of the value of
UT1-UTC,
and to continue to work with the Regional Metrology Organizations, the NMIs, and users to promote the understanding of the importance of a continuous UTC and its prompt and efficient provision to the users.
The reader should note that the official version of this Resolution is the
French
text
Our Lawsuit Against the Trump Administration’s Social Media Surveillance Moves Forward. Here’s What the Court Said.
Electronic Frontier Foundation
www.eff.org
2026-10-15 16:08:58
No one should have to choose between speaking freely and protecting their immigration status. Yet that’s precisely the choice the Trump administration’s mass surveillance of online speech forces on noncitizens living in the U.S.
Last fall, we sued on behalf of three major labor unions to stop thi...
No one should have to choose between speaking freely and protecting their immigration status. Yet that’s precisely the choice the Trump administration’s mass surveillance of online speech forces on noncitizens living in the U.S.
Last fall, we
sued
on behalf of three major labor unions to stop this surveillance program. And just this month, we won our first major ruling: A federal district court
denied
the government’s motion to dismiss our lawsuit. This means the case can move forward—a win for free speech and a critical step in protecting our First Amendment rights online. We’ve already explained why this is a
big deal
for our clients, so let's take a closer look at the court’s reasoning.
It has paired that surveillance with a public intimidation campaign. High-ranking officials have explicitly
threatened
to punish noncitizens for their online speech, then followed through with a series of terrifying viewpoint-driven enforcement actions.
This has led to a significant chilling effect on speech, not just for noncitizens, but also for their families, coworkers, and friends.
In response, three major labor unions—the United Auto Workers (UAW), the Communications Workers of America (CWA), and the American Federation of Teachers (AFT)—
sued
the Departments of State and Homeland Security alleging that this viewpoint-based surveillance program violates the First Amendment and the Administrative Procedure Act (APA).
The unions are represented by EFF, Muslim Advocates (MA), and the Media Freedom & Information Access Clinic (MFIA).
The government moved to dismiss our lawsuit, arguing first that federal immigration law prevents federal district courts from hearing the case, and second, that the unions don’t have “standing” to sue. Judge Alvin K. Hellerstein of the Southern District of New York rejected both arguments and allowed the case to proceed. At this stage in the litigation, the court accepted all of the facts in our complaint as true and analyzed the law based on those facts. We will now prove these facts as the case proceeds.
Federal Immigration Law Doesn’t Block Our Lawsuit
The government first argued that the court had no power to hear our case at all. It pointed to three provisions of the Immigration and Nationality Act (INA) that restrict when federal courts can review immigration matters. The district court disagreed and rejected each provision in turn.
The first provision,
8 U.S.C. § 1252(b)(9)
, is often called the “zipper clause.” It bars federal courts from hearing challenges that arise from efforts to deport someone, except through review of an individual’s final removal order. The government
claimed
the zipper clause applies here because our lawsuit is really an effort to stop it from initiating adverse immigration actions.
The district court wholly rejected this argument. Relying on the Second Circuit’s decision in
Ozturk v. Hyde
, it held that the zipper clause bars only challenges to a particular individual’s removal proceedings, not a lawsuit like ours that challenges the constitutionality of the surveillance program itself. That the surveillance program might affect someone’s immigration proceeding down the line doesn’t turn our lawsuit into a removal challenge.
The court similarly rejected the government’s argument that
§ 1252(g)
and
§ 1252(f)(1)
prevent federal courts from hearing this case. Our suit, the court explained, “challenges the constitutionality of a government policy that is collateral to any active removal proceedings,” so § 1252(g) doesn’t apply. And § 1252(f)(1) only limits what kind of relief a court can give. So while the court may not be able to stop a particular person’s removal proceedings, it can still block “an unlawful surveillance program that suppresses free speech.”
The Unions Have Standing to Sue
To sue in federal court, a plaintiff must show that it has “standing” to bring its claims. This requires a plaintiff to show an “
injury in fact
” that is, among other things, “concrete.” That’s often a high bar in surveillance cases, where plaintiffs can’t easily see what the government is doing behind the scenes. And the Supreme Court
has
held
that a person’s mere subjective fear of surveillance is too speculative to confer standing.
Even so, our plaintiffs cleared the bar. The court held that the unions alleged concrete injuries, including a chill on members’ speech that is objectively reasonable, not just subjectively felt. It found that the unions had established standing in two ways:
“organizational standing,” based on the unions’ own injuries, and “associational standing,” based on injuries the unions’ members have suffered.
Organizational Standing
The court first held that our plaintiffs had successfully alleged an injury to the unions themselves (injury was the only aspect of organizational standing the government disputed). The surveillance program has harmed the unions’ ability to carry out their core responsibilities, including “organizing their members and advocating for the unions’ goals.” The court made two key points:
1. Unions Are Injured When Members Go Silent
As we explained in our
complaint
, the surveillance program has caused members to step back from union leadership roles; stop participating in union activities online and in person; remove their names from union webpages; and avoid filling out bargaining surveys. Members who might otherwise spread the unions’ message and raise awareness of union issues are staying quiet, hampering the unions’ ability to organize. The court said this amounts to a concrete injury for purposes of standing.
2. Surveillance Doesn’t Need to Target Pro-Union Speech
The court also rejected the government’s claim that members’ retreat from union activities was “essentially an overreaction,” because the surveillance doesn't target pro-union views. The court said this misunderstands the issue: “the question is whether the Government’s conduct would deter a person of ordinary firmness from engaging in protected activity, not whether the specific expression a member forgoes is itself among the viewpoints the Government disfavors.”
Here, the surveillance program monitors noncitizens’ online activity indiscriminately, and members “cannot reliably predict which of their activities will be captured” and attributed to a disfavored viewpoint. What’s more, the court noted, the unions’ organizing often happens alongside the very advocacy the government is alleged to target, “including pro-Palestine and anti-ICE activism on college campuses.” That makes members’ retreat from union activity a foreseeable consequence of the program.
Associational Standing
The court also held that the unions established associational standing to sue on behalf of their members. Of the three requirements for associational standing, the government challenged only two. It argued that members lacked sufficiently concrete injuries to sue in their own right, and that the claims aren’t “germane” to the unions’ purpose.
The court disagreed and found associational standing for every claim but one: members’ right to receive information. That claim survives anyway, because the unions’ organizational standing covers it. Along the way, the court made several important rulings.
1. The Ongoing Surveillance Is a Present Injury
As a threshold matter, the government argued that our case is a “pre-enforcement challenge,” meaning we sued before the government actually punished anyone. That would trigger a different test, and the government argued we failed it because we hadn’t alleged a sufficiently imminent threat of prosecution.
The court disagreed, explaining that “Plaintiffs’ allegations are of an ongoing surveillance program that is actively chilling the speech of their members and otherwise causing harm.” That chilling effect is a First Amendment injury even if there isn’t a direct prohibition on speech. And when government conduct is actively chilling speech right now, a challenge to it isn’t pre-enforcement.
2. Surveillance + Public Threats Reasonably Chills Speech
The court rejected the government’s argument that we alleged only a generalized, subjective, speculative fear of surveillance, explaining that “the chilling effect” of the program can “itself be an injury when the plaintiffs are surveilled.” Here, plaintiffs have alleged that their members are under active surveillance, which has had objective chilling effects on their speech. And the government is targeting certain disfavored viewpoints, making it “viewpoint discrimination” that is “presumptively unconstitutional.”
The chill is also objectively reasonable, the court held, because the government has extensively publicized the surveillance program through public statements and social media posts, making clear that noncitizens who post disfavored views will be targeted for removal. Notably, the court agreed with us that the “threat of adverse immigration consequences, under a government whose harsh immigration crackdowns has been heavily publicized and reported on, is certainly enough to deter a person of ordinary firmness from the exercise of First Amendment rights.”
This is a concrete injury sufficient for standing.
3.
Demanding Social Media Handles Also Causes Harm
Under the surveillance program, applicants for certain immigration benefits must
disclose
all social media handles they have used during the preceding five years and, in some instances, maintain
public social media accounts
. The district court held that this too amounts to a First Amendment injury, undermining the rights to anonymity and freedom of association.
The judge pointed to one CWA member we identified, a lawful permanent resident with a pending naturalization application who is subject to the five-year disclosure requirement. The member has deleted one social media account, set another to private, and removed past posts expressing disfavored views. These allegations, the court said, show an actual and objectively reasonable injury due to the government’s surveillance program.
4. General, Public Threats Can Still Be Coercive
We also argued that the Trump administration is waging a campaign of coercive threats to suppress disfavored speech, which the First Amendment prohibits. The court agreed that this campaign can be an actionable injury of its own.
Notably, the court held that it didn’t matter that the government’s statements were not specifically targeted at certain individuals, and were instead made on social media or to the public. In this case, the court explained, “the number, severity, and high-profile examples of action upon those threats are such that a reasonable person would perceive the communication as coercive.”
That means it’s reasonable that the unions’ members “would, and did, limit their public speech on disfavored viewpoints” in response. That the threats were made to the general public “does not diminish this injury,” as the very purpose of the challenged surveillance program is to intimidate noncitizens into silence.
5. Free Speech is Central to Union Functioning
The court also found that the unions met the second prong of associational standing. It held that the unions’ interests in protecting their members’ rights to speak freely, organize, and advocate, are “germane” to the unions’ missions.
The court put it plainly:
The freedom of Plaintiffs’ members to speak, associate, and appear publicly is not incidental to union work, but rather is the mechanism through which unions recruit, organize, communicate, and bargain. A program alleged to silence members and drive them from the unions’ rolls therefore strikes at the unions’ representational function itself.
Next Steps
When the government surveils what people post online and threatens to punish them for their viewpoints, the result is exactly what our clients have experienced. Members have deleted their accounts, scrubbed posts, and withdrawn from union activities.
The government must now answer our complaint and we will move forward with the discovery process, in which we anticipate getting more information from the government about its surveillance program. We look forward to continuing to prove our case.
Everybody Deserves to Sweat in Public
hellgate
hellgatenyc.com
2026-10-15 16:00:08
A sauna for the people. Plus: What a museum retrospective of 1970s music tells us about today....
Hello, Julianne Escobedo Shepherd here. Adlan Jackson is currently on vacation, so I will be your host for today's edition of Cultural Capital, Hell Gate's newish, biweekly arts and culture newsletter, in which we deliver a critical eye on the city scene. Subscribe to it
here
. A little further down, we’ll give you nightlife recommendations, capsule reviews, and a recap of what’s come across New York City’s last real local culture desk. Before that, Katie Way tells us one cool way to sweat in public that
isn't
dancing.
Gabe Bender
wants New Yorkers to bathe in public. It's why he founded
CUL DE SAC
, the nonprofit billed as the city's first outdoor community sauna, and it's why he and his team work hard to get first-timers on a wooden bench and sweating for little to no cost.
"One in four New Yorkers has had a mental illness in the past year. That's basically the size of the population of Manhattan. Saunas can go a long way in providing preventative or complementary care for people who need that," Bender told Hell Gate. "We should also have public community saunas as infrastructure, as municipal structures, for people to go to and use in the way that you can go to a park or a community garden or a basketball court in New York City."
In fact, New York City
needs
community saunas urgently, according to Bender—a need that he and his team have been filling with free sessions for homeless LGBTQ+ youth via
New Alternatives
and the
Ali Forney Center
, for New York City Public School employees, and for longtime East Village residents via the
Loisaida Center
.
Android gets AI defenses against messaging scams, fake calls
Bleeping Computer
www.bleepingcomputer.com
2026-10-15 15:48:43
Google announced new AI-powered defenses against scam messages and call-forwarding abuse on Android, currently rolling out to eligible devices. [...]...
Google announced new AI-powered defenses against scam messages and call-forwarding abuse on Android, currently rolling out to eligible devices.
The new measures aim to address the increased sophistication of scams targeting mobile users, including fraudulent bank alerts and voice-cloning attacks.
“Mobile scams have evolved far beyond basic robocalls and phishing texts, turning into sophisticated operations that use spoofed numbers, fake bank alerts, and AI voice cloning,”
Google says
.
“With scams growing harder to spot, it’s nearly impossible for users to catch every red flag themselves,” added the tech giant.
Google says its
existing
Phone and Messages scam detection flags more than 5 million suspected scam calls and texts monthly, but the new measures are expected to catch even more threats.
Cloud-based scam analysis
The new protections focus on Google Messages and rely on cloud-based Gemini-backed analysis for complex conversations, scrutinizing them for signs of fraud.
The system analyzes conversations with unknown senders within the encrypted Private AI Compute environment, protecting user privacy at all times.
The new mode also adds on-device Gemini Nano (local AI model) checks for unfamiliar links using real-time web signals, plus clearer warnings before opening links from unsaved numbers.
The new cloud-based protections are currently disabled by default, allowing users to activate them.
Scam alert on Messages
Source: Google
Other improvements
Apart from the Google Messages protection, Google has also implemented the enhancements in other areas of the Android system:
On-device scam detection in chat notifications,
previously launched on Pixel
, will reach hundreds of millions more users through Android device partners later this year.
Android’s existing sensitive-information masking is now expanding to Chrome and Android WebView, hiding login fields and payment screens during live screen sharing.
Android blocks apps from silently enabling call forwarding in the background and warns users before manually entered MMI forwarding codes take effect.
Call forwarding warning
Source: Google
Google is also expanding its verified bank calls system,
introduced earlier this year
, adding financial institutions from more.
This system checks whether a real bank’s call center initiated an incoming call or if it is a spoofing attempt. If the verification fails, the call is automatically ended.
Google says that since June it has blocked over 3 million fraudulent calls of this kind for Banco do Brasil and Itaú Unibanco alone. Revolut and other global financial institutions are also supported.
Android users should upgrade to the latest release, keep apps updated, and independently verify caller/sender identities when receiving requests for account-related action or sensitive information.
Join Mikko Hyppönen and security leaders from the NFL, CHANEL, and Atlassian for a two-hour digital summit on what AI-speed attacks change, what defenders should stop doing, and how to validate, decide, fix, and re-validate at machine speed.
Tool: Chirp Pong
Another game experiment - I wanted to see if it was feasible to have a two player game on two separate phones running in static HTML where the networking code uses chirps sent via the microphone. It seems to work!
Build a two player competitive pong like game where two play...
Another game experiment - I wanted to see if it was feasible to have a two player game on two separate phones running in static HTML where the networking code uses chirps sent via the microphone. It seems to work!
Build a two player competitive pong like game where two players use their phones close to each other and the game state is sent via audio noises which the web microphone API can interpret - but add graphical and gameplay twists to make it a lot more fun and intertwine than pong